Самый простой способ отправить письмо при помощи 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
В любом случае попробуйте посмотреть статью “Как настроить сервер”.
Немає коментарів:
Дописати коментар