Как сделать отправку письма?

Для отправки электронных писем в PHP имеется стандартная функция mail, но у начинающих часто возникают проблемы с ее использованием, в основном связанные с незнанием внутреннего формата письма. Посмотрим, как можно создать письмо в формате, строго соответствующем основным спецификациям.

Текст на кириллице, особенно в многобайтовой символьной кодировке UTF-8, необходимо кодировать, причем используемые символьная кодировка и способ кодирования определяются по-разному для заголовков письма (To и Subject, значения которых передаются в первых двух параметрах функции mail, а также других заголовков, например From) и для текста письма.

Для заголовков письма используемые символьная кодировка (charset) и способ кодирования (encoding) указываются вместе с кодом (code) непосредственно внутри значения заголовка в специальном формате (значение может содержать несколько подобных вставок вперемешку с «незакодированными» символами кодировки US-ASCII):

=?charset?encoding?code?=

Символьная кодировка задается в привычном виде (windows-1251, utf-8 и т.д.), а вот способ кодирования обозначается одной буквой: B или b для Base64, Q или q для Quoted-Printable.

В RFC 2047 предлагается ограничить длину каждой такой вставки 75 символами и разделять соседние вставки символами "\r\n\s", но редко кто придерживается данного правила. Для написания кода, совместимого с этой спецификацией, без его усложнения можно использовать в заголовках короткий текст, записанный к тому же в однобайтовой символьной кодировке, например в Windows-1251.

Для текста письма используемые символьная кодировка и способ кодирования указываются в специальных заголовках, перед которыми должен быть размещен заголовок «MIME-Version: 1.0», например:

MIME-Version: 1.0
Content-Transfer-Encoding: base64
Content-Type: text/plain; charset=utf-8

Для форматирования текста письма можно разместить в нем нужные HTML-теги и указать в последнем заголовке text/html вместо text/plain.

Код текста письма нужно разбивать на строки длиной не более 76 символов. В этом может помочь стандартная функция chunk_split.

Попробуйте выполнить следующий код, предварительно сохранив его в файле в кодировке UTF-8 с указанием корректного значения $to:

<?php

$to='user@example.com';
$subject='=?utf-8?B?'.base64_encode('Тест').'?=';
$message=chunk_split(base64_encode('Это тестовое сообщение!'));
$headers='MIME-Version: 1.0'."\r\n".
         'Content-Transfer-Encoding: base64'."\r\n".
         'Content-Type: text/plain; charset=utf-8';

mail($to,$subject,$message,$headers);

?>Done

В «дополнительных» заголовках, таких как From, не нужно кодировать названия заголовков и «разделитель» заголовков "\r\n". Также в заголовках не следует кодировать адреса электронной почты:

$headers='From: =?utf-8?B?'.base64_encode('Блог разработчиков').'?= Gency <noreply@gency.ru>'."\r\n". //...

В конце списка заголовков и в конце текста письма «разделитель» указывать не нужно. Он будет добавлен автоматически.

В качестве адреса электронной почты в заголовке From следует указывать адрес реально существующего на сервере почтового ящика, иначе почтовый сервер может препятствовать отправке письма, однако вместе с этим ящиком можно использовать и одноименный почтовый ящик, находящийся на другом сервере, например для ручной отправки или получения писем.

Для повышения уровня доверия к отправляемым письмам с адресов электронной почты на определенном домене можно использовать SPF-запись этого домена. При отправке писем с разных серверов в SPF-записи можно указать сразу несколько доверенных источников. SPF-запись проверяется у домена того адреса электронной почты, который указан в заголовке Return-Path (фактически в SMTP-команде MAIL FROM).

Если не планируется получать ответы по адресу электронной почты, указанному в заголовке From, укажите адрес для получения ответов в заголовке Reply-To.

Комментарии: 0

Отправить комментарий

Ваш адрес E-mail не будет опубликован.