Отправка почты из PHP


Содержание

Функция отправки писем mail() PHP

Содержание статьи

1. Отправка письма mail PHP Тип text/plain
2. Отправка письма mail PHP Тип text/html
3. Как использовать CSS в письме? (для mail PHP)

1. Отправка письма mail php Тип text/plain

Содержит только текст (малый вес сообщения)

2. Отправка письма mail php Тип text/html

Могут содержать графические html-элементы, сслыки и тп.
Больше объём передаваемой информации

3. Как использовать в письме CSS?

Тут я хочу сразу немного огорчить Вас — CSS в привычном для Вас виде не стоит использовать. Mail, Yandex, Google, Outlook — выкидывают стили из писем. Однако, есть выход.

Выполним несколько условий:
1) Надеюсь не нужно пояснять, что используем Content-type: text/html

2) Вспоминаем, что такое table вёрстска. Теперь все стили вписываем только в неё. Можно также вспомнить center, font.

С div то же самое

3) В примере выше с отправкой письма приводилась данная строка. Так вот её не забываем

4) Используем HTML 3.2. Вставляем в начало html письма.

5) В качестве background — можно цвет. Хотите фон-изображение — тогда делайте весь текст и фон изображением. Как вариант: можно указать background-image для body.

6) У единственной в ячейке картинки в Gmail появляется 3px отступ снизу, чтобы избежать этого указываем ей

Отправка писем через SMTP на PHP 2 способа

Функция mail() бывает блокируется на хостинге или самом сайте. Если писать в службу поддержки долго или не имеет смысла — придется отправлять письма через SMTP.

СПОСОБ 1 — просто вставляем этот код на сайте с некоторыми настройками:

\r\n»;
$SEND .= «To: $mail_to \r\n»;
$SEND .= «X-Priority: 3\r\n\r\n»;
>
$SEND .= $message.»\r\n»;
if( !$socket = fsockopen($config[‘smtp_host’], $config[‘smtp_port’], $errno, $errstr, 30) ) <
if ($config[‘smtp_debug’]) echo $errno.»
«.$errstr;
return false;
>

if (!server_parse($socket, «220», __LINE__)) return false;

fputs($socket, «HELO » . $config[‘smtp_host’] . «\r\n»);
if (!server_parse($socket, «250», __LINE__)) <
if ($config[‘smtp_debug’]) echo ‘

Не могу отправить HELO!

‘;
fclose($socket);
return false;
>
fputs($socket, «AUTH LOGIN\r\n»);
if (!server_parse($socket, «334», __LINE__)) <
if ($config[‘smtp_debug’]) echo ‘

Не могу найти ответ на запрос авторизаци.

‘;
fclose($socket);
return false;
>
fputs($socket, base64_encode($config[‘smtp_username’]) . «\r\n»);
if (!server_parse($socket, «334», __LINE__)) <
if ($config[‘smtp_debug’]) echo ‘

Логин авторизации не был принят сервером!

‘;
fclose($socket);
return false;
>
fputs($socket, base64_encode($config[‘smtp_password’]) . «\r\n»);
if (!server_parse($socket, «235», __LINE__)) <
if ($config[‘smtp_debug’]) echo ‘

Пароль не был принят сервером как верный! Ошибка авторизации!

‘;
fclose($socket);
return false;
>
fputs($socket, «MAIL FROM: \r\n»);
if (!server_parse($socket, «250», __LINE__)) <
if ($config[‘smtp_debug’]) echo ‘

Не могу отправить комманду MAIL FROM:

‘;
fclose($socket);
return false;
>
fputs($socket, «RCPT TO: \r\n»);

if (!server_parse($socket, «250», __LINE__)) <
if ($config[‘smtp_debug’]) echo ‘

Не могу отправить комманду RCPT TO:

‘;
fclose($socket);
return false;
>
fputs($socket, «DATA\r\n»);

if (!server_parse($socket, «354», __LINE__)) <
if ($config[‘smtp_debug’]) echo ‘

Не могу отправить комманду DATA

‘;
fclose($socket);
return false;
>
fputs($socket, $SEND.»\r\n.\r\n»);

if (!server_parse($socket, «250», __LINE__)) <
if ($config[‘smtp_debug’]) echo ‘

Не смог отправить тело письма. Письмо не было отправленно!

‘;
fclose($socket);
return false;
>
fputs($socket, «QUIT\r\n»);
fclose($socket);
return TRUE;
>

function server_parse($socket, $response, $line = __LINE__) <
global $config;
while (@substr($server_response, 3, 1) != ‘ ‘) <
if (!($server_response = fgets($socket, 256))) <
if ($config[‘smtp_debug’]) echo «

Проблемы с отправкой почты!

$response
$line
«;
return false;
>
>
if (!(substr($server_response, 0, 3) == $response)) <
if ($config[‘smtp_debug’]) echo «

Проблемы с отправкой почты!

Использовать код можно так-же как и обычную функцию mail:
windows-1251 «‘ . «\r\n»;
$headers .= ‘From: vasya@pupkin.ru’. «\r\n»;
smtpmail(’email-получателя@mail.ru’, ‘Тема письма’, ‘Текст письма’, $headers);
?>

СПОСОБ 2 — просто копируем его на сайт и нечего не настраиваем

smtp_username = $smtp_username;
$this->smtp_password = $smtp_password;
$this->smtp_host = $smtp_host;
$this->smtp_from = $smtp_from;
$this->smtp_port = $smtp_port;
$this->smtp_charset = $smtp_charset;
>

/**
* Отправка письма
*
* @param string $mailTo — получатель письма
* @param string $subject — тема письма
* @param string $message — тело письма
* @param string $headers — заголовки письма
*
* @return bool|string В случаи отправки вернет true, иначе текст ошибки *
*/
function send($mailTo, $subject, $message, $headers) <
$contentMail = «Date: » . date(«D, d M Y H:i:s») . » UT\r\n»;
$contentMail .= ‘Subject: =?’ . $this->smtp_charset . ‘?B?’ . base64_encode($subject) . «=?=\r\n»;
$contentMail .= $headers . «\r\n»;
$contentMail .= $message . «\r\n»;

try <
if(!$socket = @fsockopen($this->smtp_host, $this->smtp_port, $errorNumber, $errorDescription, 30)) <
throw new Exception($errorNumber.».».$errorDescription);
>
if (!$this->_parseServer($socket, «220»)) <
throw new Exception(‘Connection error’);
>

fputs($socket, «HELO » . $this->smtp_host . «\r\n»);
if (!$this->_parseServer($socket, «250»)) <
fclose($socket);
throw new Exception(‘Error of command sending: HELO’);
>

fputs($socket, «AUTH LOGIN\r\n»);
if (!$this->_parseServer($socket, «334»)) <
fclose($socket);
throw new Exception(‘Autorization error’);
>

fputs($socket, base64_encode($this->smtp_username) . «\r\n»);
if (!$this->_parseServer($socket, «334»)) <
fclose($socket);
throw new Exception(‘Autorization error’);
>

fputs($socket, base64_encode($this->smtp_password) . «\r\n»);
if (!$this->_parseServer($socket, «235»)) <
fclose($socket);
throw new Exception(‘Autorization error’);
>

fputs($socket, «MAIL FROM: «.$this->smtp_username.»\r\n»);
if (!$this->_parseServer($socket, «250»)) <
fclose($socket);
throw new Exception(‘Error of command sending: MAIL FROM’);
>

fputs($socket, «RCPT TO: » . $mailTo . «\r\n»);
if (!$this->_parseServer($socket, «250»)) <
fclose($socket);
throw new Exception(‘Error of command sending: RCPT TO’);
>

fputs($socket, «DATA\r\n»);
if (!$this->_parseServer($socket, «354»)) <
fclose($socket);
throw new Exception(‘Error of command sending: DATA’);
>

fputs($socket, $contentMail.»\r\n.\r\n»);
if (!$this->_parseServer($socket, «250»)) <
fclose($socket);
throw new Exception(«E-mail didn’t sent»);
>

fputs($socket, «QUIT\r\n»);
fclose($socket);
> catch (Exception $e) <
return $e->getMessage();
>
return true;
>

private function _parseServer($socket, $response) <
while (@substr($responseServer, 3, 1) != ‘ ‘) <
if (!($responseServer = fgets($socket, 256))) <
return false;
>
>
if (!(substr($responseServer, 0, 3) == $response)) <
return false;
>
return true;

Вызываем теперь класс с параметрами

require_once «SendMailSmtpClass.php»; // подключаем класс

$mailSMTP = new SendMailSmtpClass(‘zhenikipatov@yandex.ru’, ‘****’, ‘smtp.yandex.ru’, ‘Evgeniy’); // создаем экземпляр класса
// $mailSMTP = new SendMailSmtpClass(‘логин’, ‘пароль’, ‘хост’, ‘имя отправителя’);

Материал взят частично с сайтов:

Отправка писем на PHP через SMTP

Отправлять письма через PHP намного проще, чем кажется. Всего-то надо сформировать правильный EML, подключиться к SMTP и отправить письмо. Ну ещё может быть, хотя и не факт, надо где-то как-то залогировать отправку, а то потом потеряют письмо, скажут, что и не было никаких писем. И виноватый опять ты, хотя ты бел и пушист. А ещё бы хорошо сделать хоть какую-то обработку ошибок, а то вдруг эксепшин, или серевер устал, или коннект не пошёл, а тут суперважный клиент. И уж совсем замечательно хранить где-то письма на случай «я потеряль», «мне не дошло», «а вышлите мне ещё раз». А ещё мы хотим отправлять письма на сайте, который видел расцвет динозавров. А ещё. мне кажется, что список ещё может расширяться не хуже нашей вселенной.

Для решения всех этих проблем я решил написать небольшой инструмент — ApMailer.

ApMailer

ApMailer — это небольшая библиотека, единственной целью которой является отправка почты. Я постарался сделать её максимально простой и удобной. Вы можете скачать всего один файл и отправлять письма и из консоли, и из web-скриптов!

Подключение ApMailer

Скачайте из репозитория файл mailer.phar или src/lib.php (если не нужна консольная версия). После этого подключите lib.php:

После этого будет доступна функция Mailer() :

Инициализация

Перед отправкой писем Mailer надо проинициализировать. Делается это так:

Конфиг представляет из себя многомерный массив, в котором указываются адрес отправителя по умолчанию, хуки для обработки ошибок и ведения логов и транспортёры:

В качестве транспортов можно использовать file и smtp . Тип транспорёта всегда должен передаваться первым элементом массива, дальше идут его настройки.

Транспортёр file сохраняет письмо в виде EML в папку. Доступны следующие настройки:

  • dir — папка, а которую будут сохраняться письма. Если предполагается много писем, лучше хранить их с разбивкой по дате ‘dir’ => strftime( ‘/path/to/mails/%Y/%m/%d’ )

Транспортёр smtp отправляет письмо через SMTP. Доступны следующие настройки:

  • host — адрес SMTP-сервера
  • ssl — использовать SSL при подключении (обязательно для google, yandex и других популярных сервисов)
  • port — порт подключения (обычно 25 для подключения без SSL и 465 для подклюения с SSL)
  • login — логин для авторизации (если логин не указан, то используется подключение без авторизации)
  • password — пароль для авторизации (не используется, если логин не указан)
  • onError — срабатывает на ошибку транспортёра (удобно делать лог ошибок отправки писем)
  • afterSend — срабатывает после отправки письма (удобно делать общий лог отправки писем)
Илон Маск рекомендует:  Что такое код swfbutton &#62;setup

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

Рабочий пример

В качестве примера я сделал форму отправки письма:

Отправка почты на старых версиях PHP

Поскольку библиотека умеет работать через консоль, то можно формировать команду, которая сможет отправлять письма. Единственное, что нужно, наличие скомпилированного бинарника PHP 5.6.

Отправка почты из PHP: как написать правильно

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

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

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

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

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

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

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

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

Итак, в явном виде русский текст в заголовке присутствовать не должен, поэтому для того чтобы включить его туда, этот текст предварительно нужно закодировать. Стандарты описывают способ кодирования «запрещенных» символов. Общий формат выглядит так:

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

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

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

Здесь предполагается, что в переменной $_POST[«subject»] у Вас содержится тема почтового сообщения, записанная по-русски в кодировке windows-1251.

Адрес отправителя или получателя может быть записан в виде «user@example.com» или в виде «Имя пользователя user@example.com». Во втором случае имя пользователя необходимо преобразовать так же, как в предыдущем примере. Ниже приведен пример, в котором предполагается, что в переменной $_POST[«username»] содержится имя пользователя, а в переменной $_POST[«email»] — его электронный адрес:

Функция mail()

Отправка почтовых сообщений в большинстве скриптов выполняется системной функцией mail() . Описание синтаксиса функции mail всегда можно найти в оригинальном руководстве. Эта функция принимает всего 5 параметров, из которых три являются обязательными, а остальные два — опциональными:

  • to — Электронный адрес получателя сообщения
  • subject — Тема сообщения
  • message — Тело сообщения
  • additional_headers — дополнительные заголовки
  • additional_parameters — дополнительные параметры

На самом деле функция mail() просто формирует строку следующего вида:

а затем передает ее на обработку стандартной UNIX’овой команде отправки почты, которая носит имя /usr/sbin/sendmail . Сравнивая то, что выдает mail() , с тем, что должно получиться (см. пример выше), можно составить точный план подготовки переменных для передачи в функцию:

  1. Закодировать поле Subject с использованием base64, как в примере выше.
  2. Закодировать поле To.
  3. В случае необходимости создать $additional_headers , самостоятельно сформировав все необходимые заголовки (например, добавив поле «From:») и разделив эти заголовки парой символов «\r\n».

После этого сформированный набор параметров можно передавать на вход функции mail().

Работа над ошибками с помощью additional_parameters

Как уже упоминалось выше, функция mail() для отправки почты просто вызывает стандартную команду sendmail , при необходимости передавая ей дополнительные параметры. В каком случае может возникнуть необходимость их использования? Самый часто встречающийся случай — проблема с адресом отправителя. Этот адрес нередко изменяется функцией sendmail на адрес вида «имя_пользователя_на_сервере_хостинга@адрес_сервера_хостинга.ru». Чтобы избежать такого поведения, необходимо передать команде параметр » -femail@отправителя.ru » (обратите внимание на формат строки: «минус-эф», а затем без пробелов электронный адрес).

Защита от спама

Спамеры очень часто для рассылки используют плохо написанные формы отправки почты на PHP. Дело в том, что стандарт допускает использование нескольких получателей, которые могут быть перечислены через запятую в заголовке «To», а также использование произвольного количества специальных заголовков с именем «Сс» (копия) и «Bcc» (скрытая копия). Предположим, что в Вашей форме есть поле темы, которое без изменений транслируется в заголовок «Subject». Для того чтобы отправить произвольное сообщение на тысячу адресов, спамеру достаточно в поле Subject вписать примерно такой текст:

Таким образом отправляемое письмо будет дополнено заголовками «Cc» и почтовая программа, обнаружив все эти заголовки в тексте письма, примется рассылать его всем получателям из списка. Аналогичная ситуация и с переменными $additional_headers и $to — любое из них при удачном стечении обстоятельств может быть использовано злоумышленниками в своих интересах.

Борьба с этим явлением может вестись двумя способами:

Проверка всего пользовательского ввода и фильтрация опасных символов (т.е символов «\r» и «\n»). Эти символы нужно либо заменять на пробелы, либо отказываться обрабатывать некорректно введенные параметры. Например, замену можно выполнить так:

Выполнение кодирования Base64, помимо прочего, защищает и от спамеров, т.к. «вытягивает» закодированный текст в одну строку.

Как все это сделать проще

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

Отправка почты из PHP

Обычно эти ошибки имеют примерно такое описание:
Warning: mail() [function.mail]: Failed to connect to mailserver at «localhost» port 25, verify your » Transfer Protocol»>SMTP » and «smtp_port» setting in php.ini or use ini_set() in E:\www\simplemail\mailer.php on line .

Дело в том, что функция mail сама по себе почту не отправляет, она просто вызывает программу sendmail, которая в дистрибутив web сервера и php интерпретатора не входит (и не должна).

Почтовая программа. Отправка почты на PHP

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

Отправить письмо с сервера можно 3-я способами:

  • через функцию mail() – самый простой и менее надежный вариант, его рассматривать не будем, кого интересует данный вид отправки, можете почитать в документации PHP;
  • через SMTP-сервер, как собственный, так и сторонний – самый оптимальный вид отправки сообщений, его подробнее и рассмотрим в данной статье;
  • через сторонние сервисы, такие как Amazon, Mandrill, Mailgun и прочее – хорошее и простое решения, но зачастую использование подобных серверов, может оказаться дороже собственного сервера. Подробнее рассмотрим в другой статье.
Илон Маск рекомендует:  Фруктовый шаблон сайта HTML, CSS

Для отправки письма через SMTP-сервер необходимо:

  • данные для доступа к SMTP-серверу;
  • e-mail получателя;
  • письмо и его заголовок;
  • системные заголовки.

С электронным адресом получателя, текстом письма и его заголовком, проблем нету. Данные для доступа мы имеем, обычно это хост, порт и пара логин/пароль. Остается составить системные заголовки, в них то и кроется вся сложность исходной задачи.

Создание системных заголовков

Рассмотрим основной набор заголовков, которое должно иметь письмо претендующее на попадание в папку “Входящие”:

  • Date– дата отправки;
  • Subject– заголовок сообщения перекодированный в base64, чтобы избежать проблем с кодировкой;
  • Reply-To – имя и e-mail для ответа;
  • MIME-Version– версия MIME-стандарта;
  • Content-Type – тип письма и его кодировка, тип письма обычно указывается html либо plain (текстовая версия);
  • Content-Transfer-Encoding – тип конвертации, обычно используется “8bit”;
  • From– имя и e-mail отправителя;
  • To– имя и e-mail получателя;
  • Message-ID – id сообщения в вашей системе;
  • Errors-To – e-mail, куда будут отправлена информация о возникших ошибках;
  • X-Complaints-To – e-mail, куда будут отправлена информация о возникших жалобах;
  • X-Sender – e-mail системного отправителя;
  • List-Unsubscribe – здесь указывается ссылка или e-mail для отписки;
  • List-id – id текущей рассылки, для статистики;
  • Precedence– этот заголовок необходим в случае массовой рассылки, значение ставится bulk.

Класс для отправки почты на PHP

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

Скрипт отправки почты на PHP

Введение. Значение почтовых писем

Без почты никуда. Именно по почте мы получаем «волшебные» письма подтверждения на сервисах различных родов и мастей. Именно на почту приходят письма «обратной связи». Практически ни одно веб-приложение или веб-сайт ни обходятся без отправки почты. Поэтому, можно сказать, что отправка почты на php является актуальной проблемой среди программистов и разработчиков. PHP отправка почты не случайна, ведь практически все динамические сайты используют этот язык программирования. В этой статье я постараюсь объяснить, как написать правильный скрипт отправки почты на php, минуя частые ошибки программирования в этой стезе.

Формат сообщения

Как и везде сейчас, в почтовых письмах тоже есть свои стандарты (форматы). Перед конструированием формы отправки необходимо ознакомиться с документами, освещающими стандарты отправки почты:

  • Основной документ оправки на английском языке — RFC 822
  • Документ, описывающий расширения — RFC 2045

Приведу пример готового к отправке сообщения, написанного в соответствии с обговоренными стандартами:

Популярные и всем известные почтовые клиенты (MS Outlook, например) используют именно такой формат для отправления сообщений. К слову, многие из клиентов предоставляют исходный код формата сообщений. Именно такого формата нам необходимо добиться для отправки почты на php.

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

Использование русских символов в заголовках

Так как русские символы недопустимы в заголовках, их необходимо закодировать. Стандарты, о которых мы уже упоминали, описывают способ кодирования «запрещенных» символов. Общий формат выглядит так:

Кодировка может быть любой из списка «windows-1251», «koi8-r», «utf-8» и т.д. Как правило, кодировка будет совпадать с той, в которой работает сайт. Таким образом, в большинстве случаев это будет «windows-1251» или «utf-8».
Способ кодирования указывает на то, каким именно образом русские символы будут преобразованы в безопасный набор. Способа определяется два: «Q-encoding» (обозначается одной буквой «Q») и «Base64» (обозначается одной буквой «B»).
К сожалению, функции, которая могла бы обычную строку преобразовать в Q-encoded текст, в PHP нет, зато есть функция, которая умеет выполнять аналогичное преобразование в Base64. Итак, PHP код правильного создания заголовка темы почтового сообщения может выглядеть следующим образом:

Здесь предполагается, что в переменной $_POST[«subject»] у Вас содержится тема почтового сообщения, записанная по-русски в кодировке windows-1251.
Адрес отправителя или получателя может быть записан в виде «user@php.net» или в виде «Имя пользователя user@php.net». Во втором случае имя пользователя необходимо преобразовать, как в предыдущем примере. Ниже приведен пример, где в переменной $_POST[«username»] содержится имя пользователя, а в переменной $_POST[«email»] — его электронный адрес:

Функция mail()

Отправка почтовых сообщений в большинстве скриптов выполняется системной функцией mail(). Описание синтаксиса функции mail всегда можно найти в оригинальном руководстве php. Эта функция принимает всего 5 параметров, из которых первые три являются обязательными, а последние два — опциональными:

  • to — Электронный адрес получателя сообщения
  • subject — Тема сообщения
  • message — Тело сообщения
  • additional_headers — дополнительные заголовки
  • additional_parameters — дополнительные параметры

На самом деле функция mail() просто формирует строку следующего вида:

Затем передает ее на обработку стандартной UNIX-команде отправки почты, которая носит имя /usr/sbin/sendmail. Сравнивая то, что выдает mail(), с тем, что должно получиться (см. пример выше), можно составить точный план подготовки переменных для передачи в функцию:

  1. Закодировать поле Subject с использованием base64, как в примере выше.
  2. Закодировать поле To.
  3. В случае необходимости создать $additional_headers, самостоятельно сформировав все необходимые заголовки (например, добавив поле «From:») и разделив эти заголовки парой символов «\r\n».

После этого сформированный набор параметров можно передавать на вход функции mail().

Работа над ошибками с помощью additional_parameters

Как уже упоминалось выше, функция mail() для отправки почты просто вызывает стандартную команду sendmail, при необходимости передавая ей дополнительные параметры. В каком случае может возникнуть необходимость их использования? Самый часто встречающийся случай — проблема с адресом отправителя. Этот адрес нередко изменяется функцией sendmail на адрес вида «имя_пользователя_на_сервере_хостинга@адрес_сервера_хостинга.ru». Чтобы избежать такого поведения, необходимо передать команде параметр «-femail@отправителя.ru» (обратите внимание на формат строки: «минус-эф», а затем без пробелов электронный адрес).

Защита от спама

Спамеры очень часто для рассылки используют плохо написанные формы отправки почты на PHP. Дело в том, что стандарт допускает использование нескольких получателей, которые могут быть перечислены через запятую в заголовке «To», а также использование произвольного количества специальных заголовков с именем «Сс» (копия) и «Bcc» (скрытая копия). Предположим, что в Вашей форме есть поле темы, которое без изменений транслируется в заголовок «Subject». Для того чтобы отправить произвольное сообщение на тысячу адресов, спамеру достаточно в поле Subject вписать примерно такой текст:

Таким образом отправляемое письмо будет дополнено заголовками «Cc» и почтовая программа, обнаружив все эти заголовки в тексте письма, примется рассылать его всем получателям из списка. Аналогичная ситуация и с переменными $additional_headers и $to — любое из них при удачном стечении обстоятельств может быть использовано злоумышленниками в своих интересах.
Борьба с этим явлением может вестись двумя способами:

  1. Проверка всего пользовательского ввода и фильтрация опасных символов (т.е символов «\r» и «\n»). Эти символы нужно либо заменять на пробелы, либо отказываться обрабатывать некорректно введенные параметры. Например, замену можно выполнить так:
  2. Выполнение кодирования Base64, помимо прочего, защищает и от спамеров, т.к. «вытягивает» закодированный текст в одну строку.

Отправка почты PHP просто

Существует два варианта упрощения жизни при работе с формой отправки почты.

  1. Использование готовых решений для отправки почты. В качестве примера можно привести класс PHPMailer, который легко позволяет реализовать все возможности, описанные выше, и еще целый ряд того, о чем не было упомянуто.
  2. Использование конструктора сайтов. Более подробную информацию о конструкторе можно найти по ссылке. Если говорить коротко, то конструктор позволяет без особого труда создать простой сайт, в который, в числе прочего, будет включена грамотная реализация формы отправки сообщений.

Солянка сборная от wmas

Отправка писем с помощью php

Знакомство с php-функцией mail() и простейший пример её использования для отправки писем по электронной почте. Что лучше или Sendmail vs mail.

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

  • to — адрес электронной почты получателя письма в соответствии с форматом RFC 2822. Например:
    • user@sitename.ru
    • user@sitename.ru, anotheruser@sitename.ru
    • Имя пользователя
    • Имя пользователя , Имя ещё одного пользователя
  • subject — тема отправляемого письма в соответствии с форматом RFC 2047
  • message — содержание отправляемого письма. Каждая строка должна быть не длиннее 70 символов и заканчиваться символом новой строки ( \n ).

    Только для Windows: Когда PHP обращается к SMTP серверу напрямую, точка в начале строки удаляется. Для борьбы с этим нюансом, следует использовать замену на двойную точку в начале строки.

  • additional_headers (не обязательно) – строка, которая будет добавлена после заголовков письма. Обычно используется для добавления дополнительных заголовков (From, Cc и Bcc). Строки должны быть разделены CRLF ( \r\n ).
  • additional_parameters (не обязательно) – дополнительные параметры, используемые программой назначенной для отправки писем.
Илон Маск рекомендует:  Что такое код ifx_prepare

Возвращает: TRUE если письмо отправлено успешно или FALSE если нет. Следует отметить, если письмо успешно поставлено в очередь на отправление, это не значит, что оно достигнет адресата.

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

Пример: php-функция MIME base64 кодирования, с учетом кодировки

Одна из проблем, возникающих при отправке почты, заключается в формировании заголовка письма. В частности, заголовок, имена отправителя и получателя, написанные кириллицей могут быть распознаны почтовым клиентом получателя в искаженном виде. Для того чтобы избежать этой проблемы, можно воспользоваться MIME base64 кодированием, преобразующее последовательность байт в последовательность печатных ASCII символов.

С эти тоже разобрались. А теперь то, ради чего и писалась данная заметка.

Пример: отправка писем с помощью php-функции mail()

Думаю, что комментарии излишни, так как я и без того уделил достаточно много внимание различным деталям. Варианты набора RFC-заголовков могут отличаться, но на локальном сервере я получил следующее:

Отправка почты из PHP

На серверах виртуального хостинга разрешена отправка почты с сайта только при помощи функции PHP mail().

Email, с которого будет происходить отправка писем с сайта, прописывается в панели управления хостингом ISPmanager.

Этот же email необходимо будет прописать в настройках сайта. Совпадение email — обязательное условие корректной работы функции PHP Mail.

Рекомендуется указывать email вида: любое_удобное_имя@домен_вашего_сайта .

Указание ящиков вида: @gmail.com, @yandex.ru и др. приведет к попаданию писем в спам!

Для настройки необходимо зайти в ISP manager >> раздел «World Wide Web» >> «WWW домены»

Выбрать домен и в поле «E-Mail администратора» указать электронный ящик от которого планируется отправлять сообщения.

Для проверки работы php mail() на сервере, в корневой папке сайта необходимо создать файл testmail.php cо следующим содержимым:

$message = «test php mail»;

// На случай если какая-то строка письма длиннее 70 символов мы используем wordwrap()

$message = wordwrap($message, 70);

mail(‘caffeinated@example.com’, ‘My Subject’, $message);

где caffeinated@example.com email, на который должно прийти сообщение.

Для проверки нужно исполнить скрипт, сделать это можно через браузер, открыв следующую ссылку:

где domain.com название сайта, в корне которого был создан скрипт testmail.php.

Если сообщение «test php mail» пришло на указанный email, то функция php mail работает корректно.

Пример взят из официальной документации по PHP mail http://php.net/manual/ru/function.mail.php

Отправка почты с CMS Drupal 7.

По умолчанию все сообщения с Drupal7 отправляются по средствам php mail(), email отправителя указывается при установке Drupal7.

Необходимо, чтобы email отправителя в Drupal совпадал с «e-mail Администратора» в панели управления хостингом ISPmanager.

В дальнейшем email отправителя можно будет изменить в административной части Drupal, в разделе: Administration » Configuration » System

Если отправка сообщений с сайта не работает, необходимо проверить, возможно включен модуль для работы почты посредством smtp. Для проверки зайдите в раздел модулей, в административной части сайта Drupal: Administration » Modules

Отключите модуль SMTP, убрав «галочку» возле модуля и сохранив настройку «Save configuration».

Возможно, что отправка сообщений посредством SMTP реализована и другим способом. Для отправки сообщений через SMTP необходимо, чтобы на сайте присутствовал PHPMailer. Файлы PHPMailer по умолчанию находятся в директории ./sites/all/modules/smtp/phpmailer.

Существуют еще несколько способов реализации отправки сообщений сайта через php mail и SMTP. С ними вы можете ознакомиться в документации к CMS

Все сообщения с сайтов на Drupal отправляются посредством внутреней функции Druapl drupal_mail(). Через данную функцию реализовано большинство модулей для отправки. Настройки находятся в файле ./includes/mail.inc

В частности за отправку сообщений отвечают следующие строки:

drupal_mail($module, $key, $to, $language, $params = array(), $from = NULL, $send = TRUE)

Отправка почты с CMS Joomla 3

По умолчанию все сообщения с Joomla отправляются с помощью php mail(), email отправителя указывается при установке Joomla.

Необходимо, чтобы email отправителя в Joomla совпадал с «e-mail Администратора» в панели управления хостингом ISPmanager.

В дальнейшем email отправителя можно изменить в административной части Jommla в разделе: System » Global Configuration » Server Settings » Mail Settings

В поле «Mailler» нужно выбрать «PHP Mail» или «Sendmail», а так же в поле «SMTP Authentication» выбрать «No».

В Joomla настройки для отправки почты могут быть прописаны в конфигурационном файле configuration.php, который расположен в корневой директории сайта.

В configuration.php присутствуют следующие строки:

public $mailer = ‘mail’;

public $mailfrom = ‘admin [at] yourdomain.com’;

public $fromname = ‘J25 Демо’;

public $sendmail = ‘/usr/sbin/sendmail’;

public $smtpauth = ‘0’;

public $smtphost = ‘localhost’;

public $smtpsecure = ‘none’;

public $smtpport = ’25’;

$mailer : ‘mail’ использует функцию mail PHP; ‘sendmail’ использует SMTP почту на сервере.

$mailfrom : адрес From. Адрес электронной почты, который использует Joomla для отправки почты с сайта.

$sendmail : путь, по которому распложена программа Sendmail. Используется, если $mailer установлено в Sendmail.

$smtpauth : если SMTP сервер требует аутентификацию для отправки почты, то устанавливается в ‘1’. Иначе ‘0’. Используется, если $mailer установлено в Sendmail.

$smtpuser : имя пользователя для доступа к SMTP серверу. Используется, если $mailer установлено в Sendmail.

$smtppass: пароль для доступа к SMTP серверу. Используется, если $mailer установлено в Sendmail.

$smtphost : SMTP хост. Адрес SMTP сервера при отправке почты. Используется, если $mailer установлено в Sendmail.

$smtpsecure : выберите модель безопасности, которую использует ваш SMTP сервер: SSL или TLS. По умолчанию выключено. Используется, если $mailer установлено в Sendmail.

$smtpport : SMTP порт. Наименее защищенные серверы используют порт 25.

В Joomla много модулей, каждый из которых может использовать собственную систему отправки почты с сайта, не зависящую от глобальных настроек самой CMS Joomla. В связи с этим возможна ситуация, когда глобально настроена отправка через php mail, а в конкретном модуле, который, к примеру, отвечает за «Обратную связь», через SMTP.

Отправка почты с CMS WordPress 4

По умолчанию все сообщения с WordPress отправляются при помощи php mail(), email отправителя указывается при установке WordPress.

Необходимо, чтобы email отправителя в WordPress совпадал с «e-mail Администратора» в панели управления хостингом ISPmanager.

В дальнейшем email отправителя можно изменить в административной части WordPress в разделе: Settings » General

Если сообщения с сайта не отправляются, нужно проверить есть ли плагин по отправке писем через SMTP, если есть то отключить.

Зайдите в раздел: Plugins » Installed Plufins

Если присутствует плагин по отправке через SMTP, то его нужно отключить.

Иногда может возникнуть ошибка:

«Сообщение не удалось отправить. Возможная причина: сервер не поддерживает функцию mail(). »

Для ее решения нужно отредактировать файл на сайте:

Найти в этом файле строчки:

// Set to use PHP’s mail()

// Set to use PHP’s mail()

Различные модули WordPress могут использовать для отправки писем как php mail(), так и SMTP вне зависимости от глобальных настроек. В связи с этим возможна ситуация, когда глобально настроена отправка через php mail, а в модуле который, к примеру, отвечает за «Обратную связь», через SMTP.

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

Отправка писем через SMTP в PHPMailer

В последнее время письма отправляемые с хостингов через функции mail() и mb_send_mail() часто попадают в спам или совсем не доходят до адресатов. Альтернатива – это отправка e-mail через SMTP с реального почтового ящика.

Яндекс Почта

Mail.ru

Gmail

Если возникает ошибка при отправки почты, то нужно отключить двухфакторную авторизацию и разблокировать «ненадежные приложения» в настройках конфиденциальности аккаунта https://myaccount.google.com/security?pli=1

Рамблер

iCloud

Мастерхост

Timeweb

Лимит – 2000 писем в день, но не более 5 в секунду.

Хостинг Центр (hc.ru)

Доступ к сторонним почтовым серверам по SMTP-портам (25, 465, 587) ограничен, разрешена отправка не более 300 сообщений в сутки.

REG.RU

Лимит – 3000 писем в день.

Имя сервера можно узнать в разделе «Информация о включенных сервисах и паролях доступа»:

ДЖИНО

В разделе «Услуги» нужно включить опцию «SMTP-сервер»:

nic.ru

В настройках веб-сервера необходимо включить PHP расширение «openssl».

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL