Для отправки электронных писем в 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
Отправить комментарий