CodeIgniter: как заставить отсылать корректные письма с русскими темой письма и именем отправителя?
Wednesday, 12 November 2008

Многие разработчики сайтов, которые имеют дело с отправкой писем в CodeIgniter через библиотеку Email, сталкиваются с проблемой корректного отображения имени отправителя и темы письма, написанных простым русским языком. Грубо говоря, прочитать их невозможно вовсе. А все из-за того, что стандартная CodeIgniter-библиотека Email вставляет кириллицу, которую вы ей подсовываете в $this->email->from() и $this->email->subject(), прямо в заголовки, что представляет собой грубое некомильфо. (оговорюсь, что речь идет о CodeIgniter версии 1.6.3 и ниже)

Чтобы избежать этого, требуется совсем немного - преобразовать критичные к кириллице параметры заголовков письма в специальную кодировку Base64.

Потратив немного времени, я модифицировал стандартную библиотеку так, чтобы все преобразования происходили в автоматическом режиме по умолчанию. Теперь она сама совершает все необходимые действия по преобразованию русских (да и вообще любых non-ASCII символов) в заголовках письма.

 

А чтобы вам не пришлось делать то же самое, я решил ее выложить сюда: скачать библиотеку.

 

Установить ее проще простого: разархивируйте файл Email.php в каталог /system/application/libraries вашей установки Codeigniter

По умолчанию Codeigniter отправляет все письма в кодировке UTF-8 - при использовании ее проблем с кодированием заголовков не возникает. Если вы отправляете письма в CI с использованием других кодировок - потрудитесь инициализировать кодировку корректно, тогда проблем не будет и у вас. Данная библиотека берет название кодировки прямо из настроек либы. Как установить нужную кодировку - курите хелп для CI, там процесс достаточно подробно описан.

 

P.S. Кроме исправления проблем с русскими символами, я немного подшаманил вид заголовков писем, отправляемых через эту библиотеку, которые в отдельных ситуациях выглядят некрасиво:

  • Если не указано имя получателя ответов в $this->email->reply_to('address@example.com'), то стандартная библиотека подставляет адрес вместо имени, что приводит к некрасивому виду заголовка Reply-To: "address@example.com" <address@example.com>. В Gmail эта гадость будет видна в подробных сведениях сообщения. Я решил, что лучше будет, если в таком случае этот заголовок будет отсылаться в простом формате "Reply-To: <address@example.com>". Однако если вы захотите использовать не только адрес, но имя получателя ответов, оно также будет перекодировано в Base64.
  • Если $this->email->reply_to в явном виде не вызвана, то и отдельный заголовок для адреса ответа по умолчанию отсылаться не будет. Это сделано из-за того, что в сообщениях, рассылемых почтовыми роботами и не требующих ответа, наличие этого заголовка в некоторых почтовых сервисах (в частности, в Gmail) приводит к появлению надписи "Ответить", что может сбивать с толку пользователей. Да, я знаю, что таких "сбиваемых" пользователей не много, но с точки зрения юзабилити эту штуку полезно отключить. Если вы хотите, чтобы адрес ответа все-таки указывался по умолчанию на адрес отправителя (хотя большинство почтовых клиентов это автоматически подразумевают в ситуации, если заголовка Reply-To нет), то расскомментируйте код в самом начале функции send().

Буду рад любым замечаниям по работе библиотеки.

 

Добавить комментарий

:D:lol::-);-)8):-|:-*:oops::sad::cry::o:-?:-x:eek::zzz:P:roll::sigh:
Жирный Курсив Подчеркнутый Зачеркнутый Цитата


Защитный код
Обновить