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


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


Для отправки почты со стороны клиента достаточно в HTML-код страницы добавить ссылку "mailto:" с указанием необходимого адреса:


Написать вебмастеру

Когда пользователь кликает по ссылке, браузер запускает почтовый клиент по-умолчанию и помещает указанный адрес в поле "Кому", так что пользователю достаточно написать текст и отправить письмо. Этот способ никак не связан с PHP, но пользоваться им иногда стоит. Кроме того, это единственный способ вызвать почтовый клиент с сайта, не поддеживающего исполнение скриптов.

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

Bool mail(string to, string subject, string message [, string additional_headers [, string additional_parameters]])

При отправке почты необходимо указать как-минимум три параметра: получателя, тему и текст сообщения.

В качестве адреся получателя "to" можно указывать как отдельный адрес, так и целый список, разделённый запятыми. Отдельный адрес может задаваться в следующих форматах "адрес" или "имя <адрес>" :

[email protected] или Site Webmaster

Тема сообщение "subject" - это обычная строка. Единственное ограничение - строка не должна содержать символов перевода строки или возврата каретки ("\n" и "\r").

Тело сообщения "message" - это текст, который вы хотите отправить получателю. Строки сообщения должны разделяться переводом строки в Unix-стиле (LF), а каждая строка не должна быть длиннее семидесяти символов. Если эти требования не выполняются - сервер может запретить отправку письма.

Кроме обязательных элементов можно указывать два дополнительных - расширенные заголовки и расширенные параметры. Расширенные заголовки служат для добавления к письму дополнительных аттрибутов и блоков, таких как адрес отправителя, адрес отправки копии ("cc" ), адрес отправки скрытой копии ("bcc" ) и т.д. Расширенные заголовки так же позволяют отправлять сообщения в HTML-формате.

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

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

Этот скрипт отправит письмо по указанному адресу, но в поле "от кого" будет указан скорее всего служебный адрес почтового сервера провайдера. Поэтому если вы захотите ответить на это письмо - ответ уйдёт в никуда. Чтобы корректно указать отправителя, воспользуемся расширенными заголовками:

// формируем расширенные заголовки $headers = "From: [email protected]" . "\r\n" . "Reply-To: [email protected]" . "\r\n" . "X-Mailer: PHP/" . phpversion();
mail($to, $subject, $message, $headers); ?>

Этот скрипт отправит клиенту письмо от имени почтового робота вашего сайта (заголовок "From:" ). Дополнительно, применив заголовок "Reply-To:" , мы указали почтовой программе клиента, что ответы надо пересылать не почтовому роботу, а вебмастеру по указанному адресу. Третий фрагмент ("X-Mailer" ) не является обязательным и описывает программу, с помощью которой было отправлено сообщение. Согласно почтового протокола, разработчик может при необходимости добавлять собственные расширенные заголовки. Единственное ограничение - имена таких заголовков должны начинаться с "X- ".

По-умолчанию, функция mail() отправляет сообщения в текстовом виде. Это означает, что если вы в текст добавите HTML-теги, то они будут восприняты как обычный текст без гипертекстовой разметки. Для того, чтобы отправить HTML-сообщение, снова воспользуемся расширенными заголовками:

// список получателей $to = "[email protected], [email protected]";

// Тема сообщения
$subject = "Новости сайта";

// Сообщение в виде HTML-формате
$message = "


Новости сайта


Новости на сегодня:











НомерСодержание АвторОпубликовано
1первая новость Администраторвчера
2вторая новость Администраторсегодня



";

// Указываем правильный MIME-тип сообщения:
$headers = "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type: text/html; charset=iso-8859-1" . "\r\n";

// Добавляем необходимые заголовки
$headers .= "To: Клиент №1 , ". "Клиент №2 " . "\r\n";
$headers .= "From: News Robot " . "\r\n";
$headers .= "Cc: News Archive $headers .= "Bcc: [email protected]" . "\r\n";

// Отправляем сообщение
mail($to, $subject, $message, $headers);
?>

Этот скрипт отправит письмо в HTML-формате двум получателям, а так же вышлет копии в архив и в контрольный ящик.

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

Второй способ чаще всего используется, когда скрипт необходимо выполнять периодически (например, ежедневная рассылка новостей). Организация планирования выполнения задачи средствами PHP - задача нетривиальная. Более простой путь - воспользоваться готовыми интсрументами, например crontab. Этот инструмент доступен на большинстве платных Unix-хостингов. Более подробно мы рассмотрим crontab в отдельном уроке.

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

// в php.ini SMTP = localhost sptp_port = 25 // в коде ini_set("SMTP", "localhost"); ini_set("smtp_port", "25");

Кроме того, настоятельно рекомендую поставить локальный SMTP-сервер, например, PersonalSMTP. Эта утилита распространяется бесплатно, проста в установке и настройке, но при этом позволяет отлаживать отправку писем даже при отсутствии подключения к Интернет. При использовании PersonalSMTP в конфигурации по-умолчанию используется сервер "localhost" и порт 15025, следовательно перед вызовом функции mail() необходимо добавить строки:

// не забудьте закомментировать их // перед публикацией скрипта на сайте. ini_set("SMTP", "localhost"); ini_set("smtp_port", "15025");

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

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

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

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

Указание ящиков вида: @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("[email protected]", "My Subject", $message);

?>

где [email protected] email, на который должно прийти сообщение.

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

http://domian.com/testmail.php

где 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 yourdomain.com";

public $fromname = "J25 Демо";

public $sendmail = "/usr/sbin/sendmail";

public $smtpauth = "0";

public $smtpuser = "";

public $smtppass = "";

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()...»

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

./wp-includes/pluggable.php

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

// Set to use PHP"s mail()

$phpmailer->IsMail();

И заменить на:

// Set to use PHP"s mail()

$phpmailer->IsSendmail();

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

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

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

Сегодня решился на написание скрипта, отвечающего за отправку e-mail сообщений с сайта. Оказывается, что в PHP – это делается очень просто.

Как отправляются письма через PHP ?

Для начала хотелось бы пояснить, что PHP не способен отсылать письма самостоятельно. В PHP есть функция, которая работает с почтовыми серверами.

Большинство современных платных хостингов, даже самых дешевых, имеют в своем наборе такой сервер. Чаще всего это sendmail . Вам только остается отослать запрос на отправку и sendmail это сделает.

Еще бы хостинги делали бы бесплатно продвижение сайтов , было бы вообще красота.

PHP -код отправки email`ов

За отправку e-mail в PHP отвечает всего одна функция mail(); , которая имеет синтаксис:

Mail (куда слать, тема сообщений, сообщение, доп. информация);

Лучшим объяснением считается пример, поэтому чтобы избежать лишней воды и сразу объяснить все как есть, пример:

$email = "[email protected]"; $subject = "Тема письма"; $message = "Поздравляем, Вы только что получили письмо.\n Это письмо отправлено средствами PHP"; $headers = "From: adminwa.ru \r\n Content-type: text/plain; charset=utf-8\r\n"; mail ($email, $subject, $message, $headers);

А теперь немного комментариев к приведенному куску кода.

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

$subject должен быть не более 255 символов. Это не ограничение PHP , а стандарт электронных писем.

Переносы строки в $subject и $message осуществляются специальным символом(выражением) – \n

В $headers можно описать дополнительные параметры From – от кого мейл, Content-type – формат письма (можно указать text/plain – обычный текст или text/html – html-разметка), charset – кодировка письма и несколько других.

Все строки в $headers должны быть отделены \r\n.

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

Отправка писем при помощи PHP

Общие возможности

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

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

Синтаксис функции mail():

Bool mail(string $to, string $subject, string $msg [, string $header]);

Чтобы было более понятно, что из себя представляют заголовки, и где они находятся в письме, откройте почтовый клиент и посмотрите на любое письмо в том виде, как оно пришло (Для Outlook это можно сделать нажав правой клавишей мыши на сообщение->Свойства->Подробно->Исходное сообщение ).

Как мы видим, письмо представляет простой текстовой файл, состоящий из двух общих разделов: Вверху идут заголовки письма, затем через две строки идет само письмо.

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

Вот некоторые наиболее часто используемые:

  • From: "Имя пользователя отправителя" <Обратный адрес отправителя>
  • To: <Адрес, по которому отправляют письмо>
  • Subject: Тема письма

Решение проблемы кодировок

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

Кодировку письма задает заголовок Content-type :

$header="From: \"Evgen\" "; $header.="Content-type: text/plain; charset=\"windows-1251\""; $subject="Тема письма"; $msg="Сторака 1\nСтрока 2\nСтрока 3"; mail("

В заголовке мы указали, что тип письма будет простой текст, а кодировка - Windows.

Теперь наше письмо придет в понятной для почтового клиента кодировке.

Но стоит отметить, что в некоторых случаях в правильной кодировке будет отображено только само письмо. Заголовок же так и останется нечитаемым. Связано это с тем, где расположен заголовок Content-type относительно заголовка Subject , который и содержит тему письма. Дело в том, что существуют почтовые программы, которые понимают заголовок Content-type , но не понимают русский текст в поле Subject , если это поле стоит до Content-type . В то же время, другие почтовые программы обязывают нас задавать Content-type последним заголовком в списке. Чтобы обойти эти препятствия, можно разместить поле Content-type сразу в начале и в конце списка заголовков:

$subject="Тема письма"; $header="Content-type: text/plain; charset=\"windows-1251\""; $header.="From: Evgen "; $header.="Subject: $subject"; $header.="Content-type: text/plain; charset=\"windows-1251\""; $msg="Сторака 1\nСтрока 2\nСтрока 3"; mail(" ", $subject, $msg, $header);

Теперь это письмо прочтет любая почтовая программа!

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

bool mail (string to, string subject, string message [, string additional_headers [, string additional_parameters]])

Могут помочь и следующие RFC-документы: RFC 1896 , RFC 2045 , RFC 2046 , RFC 2047 , RFC 2048 и RFC 2049 .

mail() возвращает TRUE , если почта была успешно принята для доставки, FALSE в ином случае.

Важно! Обратите внимание, успешно принято для доставки не подразумевает, что почта фактически достигнет предназначенного назначения.

Пример 1. Отправка почты.

mail("[email protected]", "My Subject", "Line 1\nLine 2\nLine 3");

Если передаётся четвёртый строковой аргумент, эта строка вставляется в конце шапки/header. Обычно это используют для добавления дополнительных шапок. Несколько дополнительных шапок разделяются символами carriage return и newline.

Примечание: вы обязаны использовать \r\n для разделения шапок, хотя некоторые почтовые агенты Unix могут работать с одиночными символами newline (\n).

Параметр additional_parameters можно использовать для передачи дополнительных параметров программе, сконфигурированной для использования при отправке почты установкой конфигурации sendmail_path . Например, это можно применять для установки адреса отправителя при использовании sendmail. Вам может понадобиться добавить пользователя под которым работает ваш web-сервер, в вашу sendmail-конфигурацию для предотвращения добавления шапки "X-Warning!" к сообщению, когда вы устанавливаете отправителя с использованием этого метода.

Примечание: этот пятый параметр был введён в PHP 4.0.5.

Вы можете также использовать простую технику построения строк для создания сложных email-сообщений.

"; /* Для отправки HTML-почты вы можете установить шапку Content-type. */ $headers= "MIME-Version: 1.0\r\n"; $headers .= "Content-type: text/html; charset=iso-8859-1\r\n"; /* дополнительные шапки */ $headers .= "From: Birthday Reminder \r\n"; $headers .= "Cc: [email protected]\r\n"; $headers .= "Bcc: [email protected]\r\n"; /* и теперь отправим из */ mail($to, $subject, $message, $headers);

Примечание: убедитесь, что у вас нет символов newline в to или в subject , иначе почта может не отправиться корректно.