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

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

Решение
Для этого надо обратиться к PEAR-классу Mail:

require 'Mail.php';
$to = 'adam@example.com';
$headers['From'] = 'webmaster@example.com';
$headers['Subject'] = 'New Version of PHP Released!';
$body = 'Go to http://www.php.net and download it today!';
$message =& Mail::factory('mail');
$message->send($to, $headers, $body);

Если нельзя использовать PEAR-класс Mail, то примените встроенную в PHP функцию mail():

$to = 'adam@example.com';
$subject = 'New Version of PHP Released!';$body = 'Go to http://www.php.net and download it today!';
mail($to, $subject, $body);

Обсуждение
PEAR-класс Mail позволяет посылать почту тремя способами. Применяемый метод указывается при создании почтового объекта с помощью Mail::factory().

• Для того чтобы отправить почту с помощью внешней программы, такой как sendmail или qmail, надо передать параметр sendmail.

• Для того чтобы использовать SMTP-сервер, надо передать параметр smtp.

• Если передать параметр mail, будет вызвана встроенная функция mail().


При этом класс Mail возьмет настройки из вашего файла php.ini.

Кроме параметров sendmail и smtp необходимо передать второй параметр, указывающий ваши настройки. Чтобы использовать sendmail, укажите sendmail_path и sendmail_args:

$params['sendmail_path'] = '/usr/sbin/sendmail';
$params['sendmail_args'] = '-oi -t';
$message =& Mail::factory('sendmail', $params);

Одним из подходящих значений для sendmail_path является /usr/lib/sendmail. К сожалению, sendmail не имеет точного местоположения; оно меняется от системы к системе, поэтому при попытке отыскать эту программу могут возникнуть сложности. Если вы не можете ее найти,
попробуйте /usr/sbin/sendmail или обратитесь к вашему системному администратору.
Программе sendmail можно передать два полезных флага: -oi и -t. Флаг -oi указывает sendmail не рассматривать одиночную точку (.) в строке как конец сообщения. Флаг -t заставляет программу sendmail искать в файле сообщения заголовок To: и другие строки заголовков.

Те, кто предпочитает qmail, могут попытаться использовать /var/qmail/bin/qmail-inject или /var/qmail/bin/sendmail.

Работая в Windows, можно использовать SMTP-сервер, поскольку на Windows-машинах не инсталлированы копии программы sendmail.


Чтобы выбрать SMTP-сервер, передайте параметр smtp:]

$params['host'] = 'smtp.example.com';
$message =& Mail::factory('smtp', $params);

В режиме smtp можно передать пять необязательных параметров. Параметр host – это имя хоста, на котором работает SMTP-сервер; по умолчанию его значением является localhost. Параметр port представляет порт соединения; по умолчанию это порт 25. Чтобы разрешитьSMTP-аутентификацию, установите параметр auth в true. Чтобы позволить серверу опознавать вас, установите параметры username и password.SMTP работает не только на Windows-машинах, но и на серверах под управлением UNIX.

Те, у кого нет PEAR-класса Mail, могут работать со встроенной функцией mail(). Программа, которую функция mail() использует для отправки почты, указывается в конфигурационной переменной sendmail_path в файле php.ini. На машине под управлением Windows надо
присвоить переменной SMTP имя хоста вашего SMTP-сервера. Адрес, указываемый в поле From, хранится в переменной sendmail_from.

Приведем пример с функцией mail():

$to = 'adam@example.com';
$subject = 'New Version of PHP Released!';
$body = 'Go to http://www.php.net and download it today!';
mail($to, $subject, $body);

Первый параметр – это адрес электронной почты получателя, второй представляет тему сообщения, а последний содержит тело сообщения.

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


Например, ниже показано, как добавить заголовки Reply-To и Organization:

$to = 'adam@example.com';
$subject = 'New Version of PHP Released!';
$body = 'Go to http://www.php.net and download it today!';
$header = "Reply-To: webmaster@example.com\r\n"
."Organization: The PHP Group";
mail($to, $subject, $body, $header);

Отделите каждый заголовок символами \r\n, но не ставьте символы\r\n в конце последнего заголовка. Независимо от применяемого метода имеет смысл написать функциюоболочку, помогающую при отправке почты. Отправка всей почты с помощью этой функции облегчает добавление регистрации и других проверок для каждого отправляемого сообщения:

function pc_mail($to, $headers, $body) {
$message =& Mail::factory('mail');
$message->send($to, $headers, $body);
error_log("[MAIL][TO: $to]");
}

В этом примере сообщение записывается в журнал ошибок, регистрируя получателя каждого посланного сообщения. Оно предоставляет временную метку, что облегчает отслеживание жалоб, когда кто-нибудь пытается рассылать спам через ваш сервер. Есть и другой вариант - создайте список адресов электронной почты типа «не посылать» (do not send), что не позволит этим людям когда-либо принять еще одно сообщение с вашего сайта.


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

Оцените статью: (0 голосов)
0 5 0

Статьи из раздела PHP на эту тему:
Отправка почты в кодировке MIME
Отправка сообщений в новостные группы Usenet
Поиск адресов с помощью LDAP
Поиск в DNS
Получение и размещение файлов с помощью FTP

Вернуться в раздел: PHP / 17. Интернет-службы