Очень часто на сайтах возникает необходимость отправить письмо администартору или клиенту. Сделать это можно двумя способами: на стороне клиента и на стороне сервера.
Для отправки почты со стороны клиента достаточно в 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
$headers .=
"From: News Robot
$headers .=
"Cc: News Archive
// Отправляем сообщение
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
А теперь немного комментариев к приведенному куску кода.
В $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. Отправка почты.
|
Если передаётся четвёртый строковой аргумент, эта строка вставляется в конце шапки/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 , иначе почта может не отправиться корректно.