середу, 22 вересня 2010 р.

Как отправить письмо средствами PHP

Самый простой способ отправить письмо при помощи PHP – воспользоваться стандартной функцией mail. Она имеет следующий синтаксис:

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

Обязательные параметры:

  • E-mail получателя
  • Заголовок письма
  • Текст письма

Необязательные параметры:

  • Дополнительные заголовки письма
  • Дополнительные параметры командной строки

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

  • true, если письмо было принято к доставке
  • false, в противном случае.

Простейший пример ее использования выглядит так:

<?php
  mail("joecool@example.com", "My Subject", "Line 1\nLine 2\nLine 3");
?>

Если у Вас на экране появилась ошибка “Fatal error: Call to undefined function: mail()”, это значит, что либо PHP собран без поддержки функции mail, либо она запрещена настройками сервера. Такая практика в последнее время широко распространена на бесплатных хостинговых серверах. Если Вы столкнулись с такой проблемой, воспользуйтесь возможностью отправки писем при помощи сокетов (sockets), детально описанной в статье “Aльтернативные способы отправки писем”. В случае, если Вы администратор системы, обратитесь к статье “Как настроить сервер” и попробуйте устранить эту проблему как таковую.

Дополнительные заголовки письма (additional headers) могут использоваться для указания кодировки письма, адреса отправителя, обратного адреса и множества других опций. Они должны быть разделены переводом строк: комбинацией “\r\n”. Например, так:

<?php
  mail("nobody@example.com", "the subject", $message,
  "From: webmaster@example.com \r\n"
  ."X-Mailer: PHP/" . phpversion());
?>

Перейдем к более сложному примеру. Предыдущие скрипты работали с форматом text/plain, теперь же попробуем отправить почту в формате HTML нескольким адресатам с указанием кодировки:

<?php
$to  = "Mary <mary@example.com>, " ;
$to .= "Kelly <kelly@example.com>";

$subject = "Birthday Reminders for August";

$message = '


Birthday Reminders for August


Here are the birthdays upcoming in August!

'; $headers = "Content-type: text/html; charset=windows-1251 \r\n"; $headers .= "From: Birthday Reminder <birthday@example.com>\r\n"; $headers .= "Bcc: birthday-archive@example.com\r\n"; mail($to, $subject, $message, $headers); ?>

Комментарии к примеру: вначале мы определяем, кому адресовано письмо. Если получателей несколько, их адреса указываются в одной строке и разделяются запятыми. При задании заголовка и тела письма следите, чтобы кодировка, в которой они действительно написаны, совпадала с заявленной в заголовке charset.

В нашем примере переменная $headers состоит из четырех строк: в первых двух мы указываем тип отправляемого письма – HTML – и его кодировку. В следующих двух строках мы указываем адрес отправителя и адрес, по которому следует отправить скрытую копию письма.

Одна из часто возникающих проблем при отправке почты в koi8 – это формирование заголовка письма. Для ее решения необходимо воспользоваться следующим кодом, который переводит строку в кодировке win-1251 в понятный большинству почтовых клиентов koi8 заголовок.

<?php
  $subject = '=?koi8-r?B?'.base64_encode(convert_cyr_string($subject, "w","k")).'?=';
?>

К примеру, заголовок “Почтовое уведомление” будет выглядеть как

=?koi8-r?B?8M/e1M/Xz8Ug1dfFxM/NzMXOycU=?=

Если Вы все сделали правильно, а получатель письмо не получает (помните, что временные издержки на доставку письма зависят от многих факторов и могут колебаться от нескольких минут до нескольких часов), убедитесь в том, что оно действительно отправилось. Это необходимо сделать в 2 этапа. Вначале попробуйте выполнить код:

<?php
  if (mail("nobody@example.com", "the subject", "Example message",
  "From: webmaster@example.com \r\n")) {
    echo "messege acepted for delivery";
  } else {
    echo "some error happen";
  }
?>

В случае если уже на этом шаге Вы получили ошибку, это может означать, что у Вас либо не запущен sendmail (или другой транспортный агент), либо он неправильно настроен, либо существуют ошибки в php.ini. К примеру, в последнее время распространено правило не принимать письма, в которых не указан правильный заголовок Mail-from.

В случае, если сообщение было принято к отправке, попробуйте посмотреть файл /var/log/mail или попросить об этом Вашего администратора, так как для этого требуются права суперюзера (root). Это можно сделать при помощи команды tail /var/log/mail. В случае успешной отправки письма в log-файле должны появится строки нижеприведенного типа либо сообщение об ошибке:

Oct 2 00:21:02 l72 sendmail[131]: h91LL1DG000131: to=root, ctladdr=root (0/0), delay=00:00:01, xdelay=00:00:01, mailer=relay, pri=30225, relay=[127.0.0.1] [127.0.0.1], dsn=2.0.0, stat=Sent (h91LL1g1000134 Message accepted for delivery)
Oct 2 00:21:18 l72 sendmail[137]: h91LL1g1000134: to=, ctladdr= (0/0), delay=00:00:17, xdelay=00:00:16, mailer=local, pri=30774, dsn=2.0.0, stat=Sent

В любом случае попробуйте посмотреть статью “Как настроить сервер”.

Немає коментарів:

Дописати коментар

HyperComments for Blogger

comments powered by HyperComments