Показаны сообщения с ярлыком почта. Показать все сообщения
Показаны сообщения с ярлыком почта. Показать все сообщения

25 июля 2009 г.

Отправка писем с сайта через PHP

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



mail (<на какой почтовый адрес отправить>, <тема (название) письма>, <тело письма>, <заголовки сообщения>)
Разумеется, для отправки на страничке надо нарисовать форму – в которой будут поля для самого сообщения, имени пользователя и его e-mail (Вы ведь хотите знать, кому отсылать ответ :)
Итак, предположим что у нас есть форма (а создать ее действительно несложно), на которой имеется три текстовых поля:
- email – для почтового адреса пользователя
- fio – для его ФИО, или просто для имени
- data – для тела сообщения
Поле для темы письма я специально упустил. Ведь обычно написать тему письма человека заставляют именно разработчики сайта; хотя тема, по сути, не нужна – ведь в сообщении пользователь уже и так написал все, что хотел. В общем, отсутствие темы – это хорошее юзабилити, а саму тему письма можно сформировать программно из тех данных, что ввел пользователь.
Итак, у нас есть веб-форма с необходимыми полями, и мы передаем из нее данные при помощи метода POST.
Теперь обработаем эти данные с помощью PHP, и отправим письмо.
Простейший PHP-скрипт для отправки письма будет выглядеть следующим образом:


<?php
if (mail("test@gmail.com", "Письмо с сайта от $name", $_POST['data'], "From: $email"))
{
echo "Спасибо за отправленное сообщение.";
}
else
{
echo "Извините, но из-за технических проблем письмо отправить не удалось.";
}
?>


Вкратце разберем этот скрипт.
Команда if позволяет нам среагировать на отправку. Если все нормально, и письмо отправлено – мы выведем пользователю сообщение, что письмо отправлено.
Если вдруг возникли проблемы – напишем, что письмо не отправлено. Это, кстати, тоже хорошее юзабилити – а то бывает, что на некоторых сайтах после отправки письма тебя сразу перебросят на главную – и ты толком не понимаешь, то ли твое письмо ушло по назначению, то ли отправилось в мусорную корзину.
Теперь о строчке


mail("test@gmail.com", "Письмо с сайта от $name", $_POST['data'], "From: $email")
- В первом параметре задан адрес, на который отправится письмо.
- Во втором параметре сформирован т.н. тема письма – то есть строка, которая в почтовом клиенте отображается в поле Subject.
- В третьем параметре передается непосредственно тело письма – то есть само сообщение.
- В четвертом параметре формируется служебный заголовок. Вообще-то служебный заголовок может быть не один – но здесь мы просто сформировали строку, в которой прописан обратный почтовый адрес отправителя.
Отмечу, что приведенный код работает – но подходит он далеко не всегда.
Если письма, отправленные таким методом, будут приходить Вам на Gmail – то все нормально, Gmail будет их отображать корректно.
Если же эти письма будут приходить в почтовую программу, то скорее всего возникнет проблема с кодировками. И в почтовике письма будут отображаться «кракозябрами» – а Вам каждый раз придется подбирать правильную кодировку (ну а заголовок письма вообще никогда не будет перекодирован правильно).
(Если Вас интересует, почему Gmail все отображает корректно – то все просто. В нем встроены весьма интеллектуальные алгоритмы декодирования – и они самостоятельно проводят декодирование для каждого письма. В большинстве почтовых программ таких алгоритмов нет – и если в письме кодировка не указана в явном виде, то ее надо подбирать вручную.)
Но пойдем дальше.
Чтобы в почтовой программе все отображалось как положено, нам надо перед отправкой письма провести ряд перекодировок.
Во-первых, надо грамотно закодировать текст письма, а также явно указать кодировку. Во вторых, надо закодировать заголовок, который отображается в поле Subject. (Не буду сильно вдаваться в детали, но так уж повелось, что заголовок кодируется ОТДЕЛЬНО от тела письма.)
Ну что ж, приступим (ниже приведен готовый к использованию код, так что если не хотите разбираться в деталях, можете сразу перейти к нему).
Как правило, веб-странички на русском оформляются в кодировке CP-1251 (русская кодировка Windows). А почтовые письма ходят в кодировке KOI8-R.
Для перекодировки используем всего одну функцию:
convert_cyr_string (<текст, который надо перекодировать>,w,k)
Где w и k – это задание кодировок, то есть «из CP-1251 в KOI8-R».
Что касается кодирования заголовка письма, то заголовок должен кодироваться по-особому, в т.н. MIME-кодировке.
Для перекодирования в MIME-кодировку используется функция
base64_encode(<текст, который надо перекодировать>)
Надо отметить, что при кодировании заголовка надо явно указать кодировку, из которой было проведено перекодирование. Ниже, в рабочем коде, все это уже проделано.
Итак, рабочий код, который отправляет письма с сайта с помощью PHP:

<?php
/*формируем переменные, которые содержат данные, полученные с html-формы*/
$email = $_POST['email'];
$name = $_POST['fio'];
$to = "test@gmail.com"; // адрес, куда слать письмо
// формируем Тему письма
$subject = "Письмо с сайта от $name";
// Конвертируем ее в кодировку KOI8-R
$subject = convert_cyr_string ($subject,w,k);
/* А теперь конвертируем ее в MIME-кодировку, заодно указывая, то это KOI8-R */
$subject = '=?koi8-r?B?'.base64_encode($subject).'?=';
// Конвертируем тело письма в KOI8-R
$msg = convert_cyr_string ($_POST['data'],w,k);
/* Составляем заголовки – служебную часть письма, где указываем тип кодировки и тип самого письма (plain text, т.е. простой текст) */
$headers = 'MIME-Version: 1.0' . "\r\n";
$headers .= 'Content-type: text/plain; charset=koi8-r' . "\r\n";
$headers .= 'To: '.$to. "\r\n";
$headers .= 'From:' .$email. "\r\n";
// Отправляем письмо
if (mail($to,$subject, $msg, $headers))
{
echo "Спасибо за отправленное сообщение.";
}
else
{
echo "Извините, но из-за технических проблем письмо отправить не удалось.";
}
?>


P.S. Если Вы – новичок в PHP, но понимаете, что знание этого языка может Вам здорово помочь при создании сайтов (а оно точно может – уж поверь на слово!), то могу порекомендовать Вам неплохой курс Евгения Попова.
Называется «PHP+MySQL для начинающих». В видео-формате, с толковыми объяснениями и примерами. Для новичков – самое то. Да и стоит немного – всего 1800 руб. Хорошая штука, полезная.

P.P.S. Если вдруг возникли какие-то проблемы, или что-то непонятно – пишите в комментариях.