Сегодня мы поговорим о том, как отправлять email письма с помощью встроенных php функций. Казалось бы — что тут проще? Берёшь функцию mail(), задаёшь ей 3-5 параметров и всё. А вот и нет — тут не всё так просто и при детальном рассмотрении возникает просто огромнейшее количество подводных камней:
- Кириллица в теме, в тексте письма, в имени отправителя
- Отправка писем в другой кодировке
- Использование вложений
- HTML вёрстка, вставка изображений в тело письма
Не стоит унывать, если у вас что-то из этого не работает. Для начала, давайте, разберёмся с первыми двумя проблемами. Если написать, например, mail('test@example.com','Привет!','Привет! Как дела?'), то адресат, скорее всего, получит кракозябры.
Для того, чтобы почтовый клиент знал, в какой кодировке пришло письмо, надо указать его в заголовках:
Content-type: <тип письма>; charset=<кодировка>
тип письма: text/plain или text/html
с кодировкой, я думаю, понятно.
Но! Даже если вы указали кодировку письма в заголовках, то этот приём не работает для темы письма, имени отправителя или получателя, названий вложенных файлов.
Для указания кодировки темы письма и прочих вышеперечисленных полей необходимо использовать следующую конструкцию:
=?<кодировка>?B?<текст в base64>?=
Поскольку кодировка php (обычно это utf-8) и кодировка писем (обычно это windows-1251) часто отличаются, то ещё и желательно их перекодировать. Вот функция, которая проводит все необходимые манипуляции:
function mime_header_encode($str, $data_charset, $send_charset){
if($data_charset != $send_charset)
$str=iconv($data_charset,$send_charset.'//IGNORE',$str);
return ('=?'.$send_charset.'?B?'.base64_encode($str).'?=');
}
Я всегда был за расширяемость кода, поэтому отправку писем оформил в отдельный класс:
class TEmail{
public $from_email;
public $from_name;
public $to_email;
public $to_name;
public $subject;
public $data_charset='UTF-8';
public $send_charset='windows-1251';
public $body='';
public $type='text/plain';
function send(){
$dc=$this->data_charset;
$sc=$this->send_charset;
//Кодируем поля адресата, темы и отправителя$enc_to=mime_header_encode($this->to_name,$dc,$sc).' <'.$this->to_email.'>';
$enc_subject=mime_header_encode($this->subject,$dc,$sc);
$enc_from=mime_header_encode($this->from_name,$dc,$sc).' <'.$this->from_email.'>';
//Кодируем тело письма$enc_body=$dc==$sc?$this->body:iconv($dc,$sc.'//IGNORE',$this->body);
//Оформляем заголовки письма$headers='';
$headers.="Mime-Version: 1.0\r\n";
$headers.="Content-type: ".$this->type."; charset=".$sc."\r\n";
$headers.="From: ".$enc_from."\r\n";
//Отправляемreturn mail($enc_to,$enc_subject,$enc_body,$headers);
}}
Вот так мы будем отправлять письма:
//Текстовое письмоecho('Plain text email - sending...<br>');
$email=new TEmail;
$email->from_email='noreply@konservs.com';
$email->from_name='Автор ІЇҐЭЄ іїґэє';
$email->to_email='******@gmail.com';
$email->to_name='Для Васі';
$email->subject='Тема ІЇҐЭЄ іїґэє';
$email->body='Текстовий тестовий лист. Тест: ІЇҐЭЄ іїґэє';
if($email->send())
echo('Plain text email - OK.<br>'); else
echo('Plain text email - Error!<br>');
//HTML письмоecho('HTML email - sending...<br>');
$email=new TEmail;
$email->from_email='noreply@konservs.com';
$email->from_name='Автор ІЇҐЭЄ іїґэє';
$email->to_email='******@gmail.com';
$email->to_name='Для Васі';
$email->subject='Тема ІЇҐЭЄ іїґэє';
$email->type='text/html';
$email->body='Тестовий лист в HTML.
<h1>Header 1 (Заголовок 1)</h1><h2>Header 2 (Заголовок 2)</h2><h3>Header 3 (Заголовок 3)</h3><h4>Header 4 (Заголовок 4)</h4><h5>Header 5 (Заголовок 5)</h5>Тест: ІЇҐЭЄ іїґэє';
if($email->send())
echo('HTML email - OK.<br>'); else
echo('HTML email - Error!<br>');
Знаете, почему я кирилические письма отправляю в Windows-1251? Да потому что mail.ru не корректно принимает письма в utf-8, а в KOI-8 нет украинских букв(«і»,«ї»,«ґ»,«є»).
Проверяем отправку. Мне на почту пришло таких вот два письма:
В следующей части я расскажу вам о том, как правильно использовать вложения и что нужно делать для того, чтобы организовать правильную вёрстку письма.
Комментарии
В первую очередь - это контент. Если тема письма - "Увеличь *** за 3 дня!", то оно почти наверняка попадёт в спам. Текст тоже имеет значение. Исходя из моего опыта, массовые рассылки ни к чему хорошему не приводят. Лучше чтобы письма отправлялись не все сразу, а через определённый промежуток времени (например, 1 письмо в минуту) да и контент хоть немного отличался.
Далее - статистика рассылок с почтового сервера. Если с вашего сервера (имеет значение IP-адрес и доменное имя) регулярно отправляется спам, то он попадает в "чёрный список". На многих хостингах используется один или несколько почтовых серверов для всех сайтов, так что спам может отправлять ваш "сосед", а санкции понесут все. Обычно хостинги банят за спам. Можно сменить хостинг. Если вам надо 100% решение - закажите VDS или VPS и поднимите свой почтовый сервер.
Ещё один фактор (довольно важный) - действия пользователей. Если хотя бы несколько адресатов с похожими письмами (например, в случае рассылки) нажали кнопку "это спам", то остальные письма рассылки (с похожим текстом) тоже попадают в спам. Желательно чтобы письма рассылки были более-менее уникальными (например, если вам надо отправить список новых статей на сайте за неделю, то можно отправлять не весь список, а ссылки только на те статьи, которые по тематике подходят данному пользователю).
Если адресат - вы, то можно не париться и создать специальный фильтр или добавить адресата в контакты, чтобы письма от адресата (или группы адресатов) не попадали в спам.
Если коротко, то рецепт один: если хотите, чтобы письма не попадали в папку "Спам", не пишите спам!
Пожалуйста
Спасибо за ресурс.
Посмотрите интересную публикацию с сайта,не реклама
P.S.<a href=http://offeramazon.ru/2019/10/18/smart-casual/>аксессуары</a>
итальянские бренды
Увидимся!
Adding comments is temporarily disabled for unregistered users.