Отправка e-mail в русской кодировке средствами PHP
Стандартная функция отправки почты в PHP не заботится о кодировке письма, а специальные классы отправки писем могут показаться слишком тяжеловесным решением. В настоящей статье приведена простая функция, которая позволяет отправлять MIME-совместимые письма на русском языке в виде простого текста или в формате HTML.
Тело письма может быть текстом в любой кодировке. Немного сложнее дело обстоит с составляющими заголовка письма (Subject, From, To), они по стандарту должны быть в US-ASCII. Использование в заголовках кодированного текста регламентируется стандартом RFC-2047. Стандарт задает две возможные формы кодирования — BASE64 и Quoted-Printable. BASE64 более универсальна и работает в том числе для кодировки UTF-8, поэтому мы выбрали именно эту форму. MIME-совместимый почтовый клиент обязан уметь читать обе формы.
Далее код функции, который достаточно схематичен:
function send_mime_mail ( $name_from , // имя отправителя
$email_from , // email отправителя
$name_to , // имя получателя
$email_to , // email получателя
$data_charset , // кодировка переданных данных
$send_charset , // кодировка письма
$subject , // тема письма
$body , // текст письма
$html = FALSE , // письмо в виде html или обычного текста
$reply_to = FALSE
) {
$to = mime_header_encode ( $name_to , $data_charset , $send_charset )
. ‘ ‘ ;
$subject = mime_header_encode ( $subject , $data_charset , $send_charset ) ;
$from = mime_header_encode ( $name_from , $data_charset , $send_charset )
. ‘ ‘ ;
if ( $data_charset != $send_charset ) {
$body = iconv ( $data_charset , $send_charset , $body ) ;
}
$headers = «From: $from \r \n » ;
$type = ( $html ) ? ‘html’ : ‘plain’ ;
$headers .= «Content-type: text/$type; charset=$send_charset \r \n » ;
$headers .= «Mime-Version: 1.0 \r \n » ;
if ( $reply_to ) {
$headers .= «Reply-To: $reply_to» ;
}
return mail ( $to , $subject , $body , $headers ) ;
}
function mime_header_encode ( $str , $data_charset , $send_charset ) {
if ( $data_charset != $send_charset ) {
$str = iconv ( $data_charset , $send_charset , $str ) ;
}
return ‘=?’ . $send_charset . ‘?B?’ . base64_encode ( $str ) . ‘?=’ ;
}
Мы определили собственную функцию mime_header_encode() для преобразования каждого заголовка в MIME-совместимый формат, несмотря на то, что в PHP предусмотрена аналогичная функция mb_encode_mimeheader(). От встроенной функции нам пришлось отказаться, так как на нашем сервере (PHP 5.1.6) она работает некорректно (возвращает неверный результат).
Использование описанной функции достаточно простое, см. пример ниже. В случае, если кодировка отправки письма отличается от текущей кодировки данных, используется iconv() для преобразования кодировки.
send_mime_mail ( ‘Автор письма’ ,
‘sender@site.ru’ ,
‘Получатель письма’ ,
‘recepient@site.ru’ ,
‘CP1251’ , // кодировка, в которой находятся передаваемые строки
‘KOI8-R’ , // кодировка, в которой будет отправлено письмо
‘Письмо-уведомление’ ,
«Здравствуйте, я Ваша программа!» ) ;?php>
© Все права на данную статью принадлежат порталу webew.ru. Перепечатка в интернет-изданиях разрешается только с указанием автора и прямой ссылки на оригинальную статью. Перепечатка в печатных изданиях допускается только с разрешения редакции.
Кодировка при отправке почты функцией mail() в php
приходит в виде «?». Непонятно почему только некоторые буквы заменяются на «?».
Функция отправки почты вот такая:
function mail_utf8($to, $from, $subject, $message)
<
$subject = ‘=?UTF-8?B?’ . base64_encode($subject) . ‘?=’;
$headers = «MIME-Version: 1.0\r\n»;
$headers .= «Content-type: text/html; charset=utf-8\r\n»;
$headers .= «Content-Transfer-Encoding: 8bit \r\n»;
$headers .= «From: $from\r\n»;
return mail($to, $subject, $message, $headers);
>
Кодировка скрипта utf-8. Текст письма формируется из данных, которые берутся из БД MySQL. База также в uft-8. Эти же данные на сайте выводятся верно.
Из-за чего может быть неверный вывод некоторых символов в письме?
Начало текста удалилось:
Суть проблемы вот в чем: при отправке письма средствами функции mail() в php часть кириллических символов тела письма приходит в виде «?! ?». Непонятно почему только некоторые буквы заменяются на «?! ?».
Народ, читайте, пожалуйста, внимательней.
Скрипт в utf-8, база в utf-8. Вывод на экран без ошибок.
При отправке на почту ЧАСТЬ символов искажена, не весь текст.
Вот пример:
Беспл! атная доставка Вашего заказа по в? ! ?ей России
Народ, читайте, пожалуйста, внимательней.
Скрипт в utf-8, база в utf-8. Вывод на экран без ошибок.
При отправке на почту ЧАСТЬ символов искажена, не весь текст.
Вот пример:
Беспл! атная доставка Вашего заказа по в? ! ?ей России
$headers = array();
$headers[] = «MIME-Version: 1.0»;
$headers[] = «Content-type: text/plain; charset=utf-8»;
$headers[] = «From: Sender Name «;
$headers[] = «Bcc: JJ Chong < bcc@domain2.com >«;
$headers[] = «Reply-To: Recipient Name «;
$headers[] = «Subject: «;
$headers[] = «X-Mailer: PHP/».phpversion();
mail($to, $subject, $email, implode(«\r\n», $headers));
Обратите внимание на эту строчку:
$headers[] = «Content-type: text/plain; charset=utf-8»;
Важно: страница, с которой отправляете письмо, должна иметь такую же кодировку, в данном случае utf-8
Отправка e-mail в русской кодировке средствами PHP
Стандартная функция отправки почты в PHP не заботится о кодировке письма, а специальные классы отправки писем могут показаться слишком тяжеловесным решением. В настоящей статье приведена простая функция, которая позволяет отправлять MIME-совместимые письма на русском языке в виде простого текста или в формате HTML.
Тело письма может быть текстом в любой кодировке. Немного сложнее дело обстоит с составляющими заголовка письма (Subject, From, To), они по стандарту должны быть в US-ASCII. Использование в заголовках кодированного текста регламентируется стандартом RFC-2047. Стандарт задает две возможные формы кодирования — BASE64 и Quoted-Printable. BASE64 более универсальна и работает в том числе для кодировки UTF-8, поэтому мы выбрали именно эту форму. MIME-совместимый почтовый клиент обязан уметь читать обе формы.
Далее код функции, который достаточно схематичен:
function send_mime_mail ( $name_from , // имя отправителя
$email_from , // email отправителя
$name_to , // имя получателя
$email_to , // email получателя
$data_charset , // кодировка переданных данных
$send_charset , // кодировка письма
$subject , // тема письма
$body , // текст письма
$html = FALSE , // письмо в виде html или обычного текста
$reply_to = FALSE
) {
$to = mime_header_encode ( $name_to , $data_charset , $send_charset )
. ‘ ‘ ;
$subject = mime_header_encode ( $subject , $data_charset , $send_charset ) ;
$from = mime_header_encode ( $name_from , $data_charset , $send_charset )
. ‘ ‘ ;
if ( $data_charset != $send_charset ) {
$body = iconv ( $data_charset , $send_charset , $body ) ;
}
$headers = «From: $from \r \n » ;
$type = ( $html ) ? ‘html’ : ‘plain’ ;
$headers .= «Content-type: text/$type; charset=$send_charset \r \n » ;
$headers .= «Mime-Version: 1.0 \r \n » ;
if ( $reply_to ) {
$headers .= «Reply-To: $reply_to» ;
}
return mail ( $to , $subject , $body , $headers ) ;
}
function mime_header_encode ( $str , $data_charset , $send_charset ) {
if ( $data_charset != $send_charset ) {
$str = iconv ( $data_charset , $send_charset , $str ) ;
}
return ‘=?’ . $send_charset . ‘?B?’ . base64_encode ( $str ) . ‘?=’ ;
}
Мы определили собственную функцию mime_header_encode() для преобразования каждого заголовка в MIME-совместимый формат, несмотря на то, что в PHP предусмотрена аналогичная функция mb_encode_mimeheader(). От встроенной функции нам пришлось отказаться, так как на нашем сервере (PHP 5.1.6) она работает некорректно (возвращает неверный результат).
Использование описанной функции достаточно простое, см. пример ниже. В случае, если кодировка отправки письма отличается от текущей кодировки данных, используется iconv() для преобразования кодировки.
send_mime_mail ( ‘Автор письма’ ,
‘sender@site.ru’ ,
‘Получатель письма’ ,
‘recepient@site.ru’ ,
‘CP1251’ , // кодировка, в которой находятся передаваемые строки
‘KOI8-R’ , // кодировка, в которой будет отправлено письмо
‘Письмо-уведомление’ ,
«Здравствуйте, я Ваша программа!» ) ;?php>
© Все права на данную статью принадлежат порталу webew.ru. Перепечатка в интернет-изданиях разрешается только с указанием автора и прямой ссылки на оригинальную статью. Перепечатка в печатных изданиях допускается только с разрешения редакции.
Как избавиться от кракозябров в поле «От», если почтовый адрес кириллический, а письмо отправляется функцией php mail()?
Собственно, весь вопрос в теме. Использую форму заявки на кириллическом домене. Отправляю письмо функцией php mail(), а в поле «от кого» вижу не нормальный адрес no-reply@мойсайт.рф, а вопросительные знаки.
joxi.ru/LmGpoDjsNO1e2l
Кодировки настроены верно, в хедере указана utf-8, файл сохранен в utf-8 — в этом плане конфликтов нет.
Мож кто сталкивался?
решается проблема интересным образом: вместо реального названия сайта, написанного на кириллице, нужно использовать его punycode вроде xn--90azcerm.xn--p1ai
таким образом, при отправке письма функцией mail() в параметре отправителя указываем no-reply@xn--90azcerm.xn--p1ai — письмо приходит в правильном формате, в поле «От кого» указан кириллический адрес.
Но вопрос в другом. Например, если смотрим письмо в веб-интерфейсе mail.ru, то в списке писем адрес показывается как есть (без конвертации в кириллицу) no-reply@xn--90azcerm.xn--p1ai, а вот когда открываем письмо, то там уже с конвертацией. Я думаю, это баг mail.ru, на других почтовых сервисах пока не тестировал. Но теперь другой вопрос — эстетического плана — нужно как-то добавить имя отправителю, чтобы в списке писем показывался не голый адрес, а какое-нибудь произвольное название. Ну, это уже нагуглю.