Наверняка Вам приходилось отправлять почту из php? И наверняка зачастую хотелось присобачить какие-нить файлы, показать картинку?
Окей. Сейчас расскажу немножко про отправку почты и один интерессный класс — mail_mime.

Первая часть — обычное письмо.

Самый простой способ отправить письмо при помощи PHP — воспользоваться стандартной функцией mail().
Она имеет следующий синтаксис:
mail(email, тема, сообщение, дополнительные заголовки, дополнительные параметры)
вернет true, если письмо было принято к доставке (не означает что доставлено).

Дополнительные заголовки письма могут использоваться для указания кодировки письма, адреса отправителя, обратного адреса и множества других опций.

mail("nobody@example.com", "Тема письма", "Сообщение", "From: webmaster@example.com");

Но вместо сообщения у получателя скорее всего отобразятся иероглифы.

Дело в том, что для начала нужно указать в дополнительных параметрах кодировку сообщения.
Немного изменим наш код отправки:

$params=array(
   "From: webmaster@example.com",
   "Content-type:plain/text;charset=utf-8" //-- Задаём тип письма и кодировку. PHP файл должен быть сохранён в этой же кодировке
);
$to="nobody@example.com";
$subject="Тема письма";
$message="Сообщение";
$params=implode("\r\n",$params); //-- Объединяем параметры в строку. Разделитель \r\n обязателен.
mail($to, $subject, $message, $params);

Теперь текст сообщения должен отобразиться нормально. НО тема письма всё равно останется в кракозябрах =( Дело в том, что тема письма должна быть записана следующим образом: =?<кодировка>?B?<текст в base64>?=

Изменим наш код с учётом этого:

function 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).'?=');
}

$params=array(
   "From: webmaster@example.com", 
   "Content-type:text/plain;charset=utf-8" //-- Задаём тип письма и кодировку. PHP файл должен быть сохранён в этой же кодировке
);
$to="nobody@example.com";
$subject=header_encode("Тема письма", "UTF-8", "UTF-8");
$message="Сообщение";
$params=implode("\r\n",$params); //-- Объединяем параметры в строку. Разделитель \r\n обязателен.
mail($to, $subject, $message, $params);

Теперь всё должно отобразиться корректно.

Теперь про mail_mime.

Для начала, скачайте последнюю версию и распакуйте к себе на сайт в папку Mail.
Далее привожу пример использования:

include 'Mail.php';
include 'Mail/mime.php';

$text ='Text version of email';
$html = '<html><body>HTML version of email</body></html>';
$file = 'myimg.jpg';
$crlf = "\n";
$hdrs = array(
'From' => 'you@yourdomain.com',
'Subject' => 'Test mime message'
);

$mime = new Mail_mime(array('eol'=>$crlf));

$mime->setTXTBody($text);
$mime->setHTMLBody($html);
$mime->addAttachment($file, 'text/plain');

$body = $mime->get();
$hdrs = $mime->headers($hdrs);

$mail =&Mail::factory('mail');
$mail->send('postmaster@localhost', $hdrs, $body);

Что бы теперь отобразить саму картинку в html версии письма, достаточно прописать: <img alt=»» src=»имя файла картинки с расширение» />

На этом пока что всё. Надеюсь будет полезно.

5 комментариев

Alex 26 апреля 2018 - 1:10

Через яндекс выдает E-mail didn t sent. В чем может быть дело? У хостера видимо закрыта функция php mail, приходится искать обходные пути. phpmailer не пашет, нашел ваш скрипт, тоже вот не пуляет. Как понять в чем дело, в яндексе, хостере или еще где?

Reply
Misha 17 апреля 2018 - 17:33

Через яндекс выдает E-mail didn t sent. В чем может быть дело? У хостера видимо закрыта функция php mail, приходится искать обходные пути. phpmailer не пашет, нашел ваш скрипт, тоже вот не пуляет. Как понять в чем дело, в яндексе, хостере или еще где?

Reply
Alexander 22 июля 2015 - 16:11

Ох, жаль не с первого раза попал на эту страницу…
Столько бы времени с экономил.
Спасибо!

Reply
Munjalibaloo 18 августа 2010 - 16:09

Начальные сведения о способе отправки html письма есть. Но как прикреплять картинку не написано дословно…
Используется сторонний пакет. Однако хотелось бы знать как самостоятельно формировать все заголовки, какие они должны быть и т. д.

Reply
GreeveX 30 сентября 2009 - 19:18

Спасибо, очень не хотелось рыскать, а здесь всё дословно и понятно объяснили, быстро сделал форму для восстановления пароля с помощью вашего готового примера скрипта, только + с авторизацией.
В общем, полезно =)

Reply

Leave a Comment

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

You may also like