Функция отправки почты php

Функция отправки почты php

(PHP 4, PHP 5, PHP 7, PHP 8)

mail — Отправляет электронную почту

Описание

Отправляет электронную почту.

Список параметров

Получатель, или получатели письма.

Тема отправляемого письма.

Тема должна соответствовать » RFC 2047.

Каждая строка должна быть отделена символом CRLF (\r\n). Строки не должны быть длиннее 70 символов.

(Только для Windows) Если PHP передаёт данные напрямую SMTP-серверу и в начале строки стоит точка, то она будет удалена. Чтобы избежать этого замените все такие точки на две.

Строка или массив, которые будут вставлены в конец отправляемых заголовков письма.

Обычно используется для добавления дополнительных заголовков (From, Cc, and Bcc). Несколько дополнительных заголовков должны быть разделены CRLF (\r\n). Если для составления этого заголовка используются внешние данные, то они должны быть проверены для избежания инъекций нежелательных заголовков.

Если передан массив, то его ключи будут именами заголовка, а значения значениями.

До PHP 5.4.42 и 5.5.27, параметр additional_headers не имел защиты от инъекции. Так что пользователи должны удостовериться, что передаваемые заголовки безопасны и содержат только заголовки. т.е. не содержат несколько переводов строк подряд, что стартует тело сообщения.

Если сообщения не отправляются, попробуйте использовать только LF (\n). Некоторые агенты пересылки сообщений Unix (особенно » qmail) автоматически заменяют LF на CRLF (что приводит к двойному CR, если использовалось CRLF). Используйте эту меру в крайнем случае, так как это нарушает » RFC 2822.

Так как escapeshellcmd() применяется автоматически, то нельзя использовать некоторые символы, допустимые к использованию в email-адресах некоторыми RFC. mail() не допускает такие символы, поэтому в программах, в которых они требуются, рекомендуется использовать альтернативы для их отправки (например фреймворки или библиотеки).

Возвращаемые значения

Важно заметить, что то что письмо было принято для передачи вовсе НЕ означает что оно достигло получателя.

Список изменений

Версия Описание
7.2.0 Параметр additional_headers может принимать значения типа массив.

Примеры

Пример #1 Отправка письма.

Использование функции mail() для отправки простого письма:

// Сообщение
$message = «Line 1\r\nLine 2\r\nLine 3» ;

Пример #2 Отправка письма с дополнительными заголовками.

Добавление простых заголовков, сообщающих почтовому агенту адреса From и Reply-To:

Пример #3 Отправка письма с дополнительными заголовками, переданными массивом

В этом примере посылается то же письмо, что и в примере выше, но дополнительные заголовки задаются массивом (доступно с PHP 7.2.0).

Пример #4 Отправка письма с дополнительными аргументами командной строки.

Пример #5 Отправка HTML-сообщения

С помощью функции mail() также можно отправить и HTML-письмо.

// несколько получателей
$to = ‘johny@example.com, sally@example.com’ ; // обратите внимание на запятую

// тема письма
$subject = ‘Birthday Reminders for August’ ;

// текст письма
$message = ‘

Birthday Reminders for August

Источник

Грамотная настройка сервера отправки почты для скриптов PHP, настройка функции mail()

В этом топике вы узнаете, как грамотно настроить, сервер исходящей почты и в частности функцию mail() в PHP. Сам являюсь жутким педантом. Люблю, что бы везде было все на своих местах, не терплю халтуры. Увидев один раз полную чушь в заголовках письма со своего сервера я разобрался с этим кардинально и безоговорочно. Под грамотной настройкой я подразумеваю такую, которая удовлетворяет потребности спам фильтров крупных почтовых систем, и просто выглядело красиво и осмысленно.

Как известно протокол SMTP не подразумевает никаких средств защиты от спама и аутентификации пользователя, поэтому крупными и не очень компаниями были придуманы «фиксы» безопасности протокола.
Если вы устанавливаете выделенный сервер с доменом размещенным на нем, очень рекомендуется выполнить данные настройки, что бы все было как надо.

На изучение этого вопроса я потратил немало времени, разобравшись в каждом заголовке. Начал с базовой настройки из пакетов, при этом из предоставляемых пакетов выбрал, то что понравилось, а закончил тонким феншуем, который я так до конца не воплотил, ибо это уже было совсем изыск.

Название заголовка выбрал именно такое, так как вначале своего пути я искал что-то вроде этого. Настраивать будем postfix, php, dns (ptr, spf), и другое.

Эта статья будет интересная людям, настраивающим выделеные сервера, но не менее интересна для обычных программистов.
К слову данную инструкцию я использую для своих проектов. Системы автоматизированного получения приглашений и получения виз в страны Шенгена: https://goingrus.com/ru, весь софт крутится на виртуальной машине.

Подробности под катом

Преамбула

Кто-то пользуется либами, которые заменяют функцию mail (например phpmailer), они могут общаться с SMTP напрямую, а могут отправлять и на локальный сервер. Но лучше использовать стандартную встроенную и настроенную функцию PHP mail() которая будет отправлять почту на локальный сервер исходящей почты, который в свою очередь будет с ней сам разбираться. При использовании данной функции тормозов всегда наименьшее количество, так как локальный почтовый агент быстро принимает либо отклоняет почту, а если принимает, то доставляет самостоятельно.

Статья отформатирована не самым лучшим образом. Извиняюсь, время поджимает, а рассказать хочется пока вспомнил, а то потом не времени будет.

Чем проверять нашу работу?

Тестируем вот этим методом

Мы будем очень много читать заголовки писем. Просматривать заголовки очень удобно в gmail, там есть такая фишка в 2 клика, сами найдете.

Каких целей в заголовках нам требуется достичь?

— Вот этих заголовков от gmail.com
Прошу заметить, что это заголовки с которыми письмо попадает в ящик конечного пользователя

— А так же этих заголовков от mail.ru

Когда вы только начнете, вы увидите, что таких красивых заголовков у вас нет. Принимающий сервер почты будет считать вас каким-то чучмеком, об этом и будет писать в заголовке письма с предупреждением, что вот еще чуть чуть и он тебя точно в блек-лист поставит. Вся информация в заголовке используются всеми цепочками серверов и принимающий агент для того что бы в зависимости от настроек спам фильтра отклонить письмо или принять. Самые драконовые методы это блек-листы, а мягкие определяют плохих по заголовкам и жалобам.

Приступим

— Совет
Господа, я люблю ставить все пакетами и новичкам не советую заниматься самодеятельностью, во многих пакетах уже есть скрипты автоматической настройки, результаты которых надо только чутка подправить и все будет хорошо. Кроме того, из репозиториев оно само обновляется и вообще меньше запары просто потому что её меньше.

— Настройка PHP
Ставим как хотим php, это вы как-нибудь без меня.

Идем в настройки php, заменяем эквивалентно:

Этим мы указали заголовок Return-Path:

Кстати 1: это будет таковым для всех виртуальных доменов сервера, что бы это исправить и настроить под текущий, то требуется передать 5-й параметр в функцию mail().

Кстати 2: если вы поставите 5-й параметр на обычном виртуальном хостинге, то вам тоже рекомендуется проводить настройку вашего домена, как это описано ниже. Обращаю внимание, что операцию с PTR записями сделать невозможно, так как 1 IP = Домен, ну или по крайней мере не рекомендуется делать их 2, не помню уже.

— Настройка MTA, он же локальный сервер исходящей почты
Я вам искренне советую postfix, далее идем в настройки /etc/postfix/main.cf
для тех, кто уже нарвался на sendmail, и понял как они трудно выпиливаются из системы, советую команду:

Далее, делаем эквивалетно вот так
myhostname = goingrus.com
#smtp_helo_name = srv.goingrus.com
mydestination = _ALL_, goingrus.com, srv.goingrus.com, localhost.goingrus.com, localhost

(srv.goingrus.com — это мой сервер в домене goingrus.com)

— Если я не ошибаюсь, это помогло. Когда агент доставки представляется другому серверу передается HELO. Поменяете myhostname, поменяется следующий заголовок:
Message-Id:

— smtp_helo_name по дефолту это myhostname, читаем матчасть

— mydestination — если я не ошибаюсь, это задает те домены с которых MTA будет принимать почту на обработку, если у вас виртуальный хостинг (что я устроил на сервере дома), то без _ALL_ у вас будут проблемы с отправкой почты с других доменов кроме указанных.

Ну вот, видите, заголовки уже намного правильнее не так ли, а то ужас поначалу был.

— Разборки с почтовыми сервисами (почтовики)
А они нас считают как недобрый источник.
Наш сервер смог правильно helo представиться, но вот только почтовики нам все равно не доверяют.
Для этого были придуман алгоритм, для того что бы владелец домена с помощью DNS (если он конечно грамотный как мы) мог указывать, что вот таким-то серверам можно доверять, а другим нельзя.

У вас вместо ужаса который сейчас должно получиться вот это:

Мы уже на пути к истине. К слову, по умолчанию, почтовик все считает как v=spf1

all, что понижает уровень порога входа в блек лист, и а так же можно пользоваться вашим доменом для отправки спама, и вас сами того не знали пометят как плохиша на будущие времена.

v=spf1
это означает, что версия алгоритма spf1

+mx
Можно доверять почте если она отправлена с серверов mx, например если mx.goingrus.com это сервер приема, то если этот сервер будет отправлять, то все будет хорошо.

+a:goingrus.com
Можно доверять серверу, обслуживающий домен goingrus.com

так же добавлю, например на моем почтовом сервере разместился pupkin.ru.
Я дал Пупкину погонять мой почтовый сервер исходящей почты srv.goingrus.com (обычная ситуация виртуального хостинга, он всегда стоит локально, как бд, и все все все). Тогда он у себя должен настроить +a:srv.goingrus.com

+include:gmail.com
Импортируем все правила gmail.com, у них тоже есть такая запись TXT для своих серверов. (я использую сервисы google для домена)

-all
Указываем, что админ считает другие места не своими, и это может быть ближайший бордель в подворотне рассылающий спам от моего имени
(+all а это означает, что весь мир мои друзья)

— Разборки с почтовыми сервисами, настройка обратной PTR
Почтовики еще спрашивают обратные доменные зоны PTR для дополнительной галочки, думаю эта галочка одна из самых жирных, так как она 100% определяет сервер, и если он ведет себя правильно, то ему очень сильно доверяют и любое письмо наверняка дойдет до адресата.
X-Mru-PTR: goingrus.com, он же есть в google наврное это Received: from goingrus.com (goingrus.com. [188.134.79.140])

Заметка:
В виртуальном хостинге вам это сделать не дадут, у них на этот адрес замапин свой сервер, какой-нибудь servername.badhosting.ru, на котором вы и размещаетесь, да и вообще только на собственном серваке с собственным IP это возможно провернуть.

Интересно: Если вы живете дома, а у меня один из серверов стоит дома, в частности goingrus.com. Что делать? вроде IP выделенный, а обратный адрес, не настроить. Я позвонил выше (к провайдеру) сказал мол так и так хочу PTR зону. Мне её сделали, очень доволен.

Еще немного слов о заголовках (все вперемешку)

X-Mru-BL: 0:0:0:0 упаси вас иметь что-нибудь кроме нолей, это блеклисты.
X-Mru-OF: интерфейс с которого посылается, я так и не понял от чего это зависит.
X-PHP-Originating-Script: — я бы советовал добавлять, хотя если вы очень печетесь о безопасности и неразглашении, то можно и запретить. Делается это неподалеку от той настройки PHP которой мы делали. По умолчанию включено.

Еще можно и интересно посмотреть что пишет Яндекс при приеме, очень интересно.

Дополнительно

Там еще какие-то цифровые подписи есть.
определяется заголовком, DKIM-Signature
С виду у меня уже было все в порядке, а этот заголовок не очень нужен. Он нужен обычно сервисом очень крупного масштаба вроде facebook или google где рассылка уведомлений и почты идет в гигатонном масштабе. Если ваш сервис не обладает миллионами пользователей, то не думайте об этом, хотя если вы изыскатель — напишите как об этом здесь и мы свяжем статьи — что бы все казалось полностью законченным, только я прошу намного проще написать, так как уже где-то видел статьи про это все. От себя добавлю что мне было лень устанавливать еще один пакет, разбираться и еще что-нить.

Материала к сожалению нет, так как по крупицам отовсюду собирал 4 месяца назад, потом меня не было времени, а теперь я написал по памяти.

Удачной грамотной настройки вашего сервера. Я попробовал объяснить хотя бы один из нескольких аспектов настройки.

Источник

Как грамотно отправлять почту из скриптов (в частности — на PHP)

Первая часть текста взята из инструкции хостинг-провайдера Netangels. Вторая — авторская.

Отправка почты из скриптов на PHP — вещь, которая очень часто встречается в веб-приложениях. К сожалению, как показывает практика, большинство разработчиков используют эту функцию неправильно, допуская в своих скриптах одни и те же ошибки. В результате оказывается, что письмо получателю пришло в неверной кодировке, просто не дошло, или дошло, но отображается совсем не так, как этого хотел автор.

Для того, чтобы быть уверенным, что ваше сообщение отправляется действительно верно, необходимо иметь по меньшей мере базовые представления о формате почтового сообщения. Формат почтового сообщения описан в нескольких стандартизирующих документах, основными из которых являются RFC 822 (описывает формат передачи простого текста на английском языке) и RFC 2045 и далее (описывает расширения этого формата для передачи произвольных данных).

Формат почтового сообщения

Ниже приведен самый простой пример текстового сообщения, составленного в соответствии с приведенными выше стандартами и готового к отправке.

To: =?windows-1251?b?0J/QvtC70YPRh9Cw0YLQtdC70Yw/PQ==?=
Subject: =?windows-1251?b?0Y3RgtC+INGC0LXQvNCwINGB0L7QvtCx0YnQtdC90LjRjz89?=
Content-Type: text/plain; charset=«windows-1251»
Content-Transfer-Encoding: 8bit

Это почтовое сообщение на русском языке
Содержит несколько строк

Именно в таком формате клиент для отправки почты (MS Outlook или Mozilla Thunderbird) подготавливает сообщение, а затем отправляет его получателю (кстати, большинство почтовых клиентов позволяют просмотреть исходный код сообщения, в Mozilla Thunderbird, например, для этого служит комбинация клавиш Ctrl+U). Задача нашего скрипта языке PHP — добиться точно такого же формата письма.

Как видно из приведенного выше примера, электронное письмо содержит две части: в одной (верхней) размещаются заголовки, а в другой (нижней) собствено текст письма. Отделены эти части друг от друга пустой строкой. Заголовки состоят из строк, в которых содержится тема письма (Subject), имя и адрес отправителя (From), получателя (To) и другая информация. В самом простом случае каждая строка содержит пару «ИмяЗаголовка: ЗначениеЗаголовка». Особенно необходимо подчеркнуть, что, согласно стандартам, в заголовках ни при каких обстоятельствах не должны содержаться символы, не присутствующие в ASCII таблице — латинские буквы, цифры, знаки пунктуации и псевдографики.

Грамотное использование русских символов в заголовках почтового сообщения

=? кодировка? способ кодирования? закодированный текст?=

Кодировка может быть любой из списка «windows-1251», «koi8-r», «utf-8» и т.д. Во всех случаях, как правило, кодировка сообщения будет совпадать с кодировкой в которой работает сайт. То есть в большинстве случаев это будет «windows-1251», реже — «utf-8».

Способ кодирования указывает на то, каким именно образом русские символы будут преобразованы в безопасный набор. Способа определяется два: так называемый «Q-encoding» (обозначается одной буквой «Q») и «Base64» (обозначается одной буквой «B»).

К сожалению, штатной функции, которая бы могла бы обычную строку преобразовать в Q-encoded текст, в PHP нет, зато есть функция, которая умеет выполнять аналогичное преобразование в Base64. Итак, PHP код правильного создания заголовка темы почтового сообщения может выглядеть следующим образом:

Content-type: multipart/.

С этим заголовком знаком любой разработчик, которому доводилось решать проблемы отправки писем с вложениями или HTML письмами. И зачастую письма, сформированные без использования библиотек вроде PEAR::Mail_mime отображаются не очень корректно. Практика показывает, что если при формировании письма жестко придерживаться стандарта, которы задается в RFC (в частности — RFC 2046) — подавляющее большинство клиентских программ (включая таких любителей придерживаться стандартов, как Mozilla Thunderbird) отображает письмо корректно. Далее мы будем исходить из того, что читатель этого документа представляет себе основной синтаксис команд и понимает, что таке boundary и почему необходимо указывать Content-type для каждой из частей письма. Постараемся отметить основные ошибки.

Ошибка первая — неверный subtype

Ошибка вторая — неверный порядок частей

Ошибка третья — выбор только одного субтипа

Зачастую разработчик, формирующий из программы письмо забывает, что любая из частей письма может так же иметь Content-type: multipart, а значит можно выстроить некоторое подобие древовидной структуры, гарантирующей, что каждая из частей письма займет правильное место. Вот как примерно может выглядеть структура письма, имеющего текстовую и HTML версию (HTML с картинками), а так же приложенный документ MS Word:

Источник

PHP — отправка электронной почты через PHP

Дата публикации: 2017-10-19

От автора: отправка почты через PHP настраивается с помощью файла php.ini. Откройте файл php.ini, который находится в каталоге / etc/, и найдите раздел с заголовком [mail function].

Пользователям Windows нужно предоставить в этом разделе две директивы. Первая называется SMTP, она задает адрес SMTP-сервера. Вторая называется sendmail_from, она определяет ваш адрес электронной почты. Настройки для Windows должны выглядеть примерно так:

Пользователи Linux должны указать PHP местоположение своего приложения sendmail. Путь и любые требуемые ключи должны указываться в директиве sendmail_path. Настройки для Linux должны выглядеть примерно так:

Бесплатный курс по PHP программированию

Освойте курс и узнайте, как создать динамичный сайт на PHP и MySQL с полного нуля, используя модель MVC

В курсе 39 уроков | 15 часов видео | исходники для каждого урока

Отправка обычного текстового сообщения

PHP использует функцию mail() для отправки электронной почты. Для этой функции необходимы три обязательных аргумента, в которых указывают адрес электронной почты получателя, тема электронного письма и само письмо, кроме того, имеются два других необязательных параметра.

Ниже приводится описание каждого аргумента.

Бесплатный курс по PHP программированию

Освойте курс и узнайте, как создать динамичный сайт на PHP и MySQL с полного нуля, используя модель MVC

В курсе 39 уроков | 15 часов видео | исходники для каждого урока

После вызова функции mail, она попытается отправить электронное письмо, после этого она возвращает значение true, если письмо отправлено успешно, или false, если письмо не было отправлено. В качестве первого аргумента функции mail() могут быть указаны несколько получателей, их адреса указываются списком через запятую.

Отправка HTML-письма

Когда вы отправляете текстовое сообщение с использованием PHP, то весь контент будет рассматриваться как простой текст. Даже если вы будете включать в текстовое сообщение HTML-теги, сообщение будет отображаться как простой текст, а HTML-теги не будут отформатированы в соответствии с синтаксисом HTML. Но PHP предоставляет возможность отправлять HTML-письма в формате HTML. При отправке электронных писем вы можете указать Mime-версию, тип контента и набор символов.

Источник

Отправка e-mail в PHP

Обычно я пишу вступление о том, почему данная тема так важна для изучения. Но не в этот раз, потому что здесь, уверен, ни у одного человека не возникнет вопрос: «Зачем отправлять e-mail в PHP?». Поэтому предлагаю сразу приступить к делу и узнать об этом более подробно, тем более, что проще реализации отправки e-mail через PHP и придумать нельзя, так что поймут даже те, кто не знаком с PHP вообще.

Для начала давайте с Вами разберёмся немного с теорией. Скучно, но поверьте важно. Для отправки e-mail необходим SMTP-сервер. На большинстве платных хостингах он обязательно имеется. Однако, если такой возможности нет (допустим, хостинг бесплатный или очень дешёвый), то тогда можно воспользоваться сторонним SMTP-сервером (например, mail.ru). То есть главное: для отправки необходим SMTP-сервер.

Как видите, всё интуитивно понятно: кому отправлять, какая тема и само сообщение. Если Вы используете пакет Denwer, то после запуска скрипта, Вы сможете найти файл в директории «tmp/!sendmail«, в котором и содержатся данные Вашего письма. Открыть эти файлы можно либо в блокноте, но лучше открыть их в какой-нибудь почтовой программе (например, The Bat или Microsoft Outlook).

Я не даром написал вперемешку русский и английский текст, чтобы проверить кодировку. Очень часто она распознаётся неправильно, и в результате, пользователи видят «абракадабру«. Чтобы этого избежать необходимо задать кодировку. И как раз для кодировки, а также для других особых параметров и существует четвёртый аргумент функции mail():

Также сообщения можно отправлять в HTML-формате. Для этого достаточно всего лишь заменить «text/plain» на «text/html«. И Вы сможете в сообщении использовать HTML-теги. Только не забывайте, что всякие теги, наподобие: «

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

Комментарии ( 20 ):

А как сделать автоматическое сообщение вот такие сообщения например это «вместо_этого_текста_приклепленный_фаил Вот файл который вы заказали с вместо_этого_текста_название_сайта. Если вы не заказывали данный файл просто игнорируйте это сообщение.» или «вместо_этого_текста_имя_пользователя на ваш комментарий ответили!»?

Для этого надо делать шаблон письма, например, такой: «%user% на Ваш комментарий ответили». Затем через PHP перед отправкой надо заменить с помощью функции str_replace %user% на конкретное имя пользователя.

Спасибо, но вопрос был как сделать письмо чтобы автоматический приходило всем зарегистрированным, или каким-то особенным пользователям, или вообще просто любым.

Это надо сделать в цикле. Если же пользователей много, то здесь всё гораздо сложнее, так как сервер может не выдержать. Для отправки письма большому количеству пользователей нужно запускать скрипт много раз, каждый раз отправляя небольшие партии. Например, при первом запуске отправить 20 писем. При втором ещё 20, при третьем ещё 20 и так далее, пока не будут отправлены все письма. Интервал надо делать хотя бы 30 секунд.

Да, письмо дойдёт до всех трёх ящиков. Однако, минус данного способа: каждый из получателей увидит адреса других получателей. Сделать уведомление автоматическим элементарно. Например, при добавлении нового сообщения на форум, надо вызвать функцию mail(). Тогда сразу же придёт уведомление.

Спасибо, а как сделать каждый из получателей не видел адрес других получателей? Или можете сказать как Вы делали такие уведомления?

Надо через цикл (например, for) по очереди вызывать функцию mail, каждый раз отправляя одному получателю.

Михаил, очень нужна ваша помощь. на моём тестовом хостинге не работает функция «mail», но там можно через сторонний SMTP сервер. Расскажите как им пользоваться,и как его настроить. Прошу расскажите мне или напишите статью. Оооочень надо

Проверьте можно ли на хостинге прямо указать сторонний SMTP, чтобы функция mail на него отправляла. Либо поищите скрипты, которые будут сами отправлять почту в обход стандартной функции.

извините за нелепый вопрос: а как на этот скрипт попадает пользователь? ведь РНР «сидит» и работает на сервере. и можно ли каким то образом РНР-скрипты вставлять в HTML страницы.

Пользователь к нему обращается, отправляя запрос. В HTML-страницах нельзя использовать PHP, но в PHP-коде можно использовать HTML.

Источник

Читайте также:  при обучении истории фгос является
Образовательный портал