Наверняка Вам приходилось отправлять почту из 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 комментариев
Через яндекс выдает E-mail didn t sent. В чем может быть дело? У хостера видимо закрыта функция php mail, приходится искать обходные пути. phpmailer не пашет, нашел ваш скрипт, тоже вот не пуляет. Как понять в чем дело, в яндексе, хостере или еще где?
Через яндекс выдает E-mail didn t sent. В чем может быть дело? У хостера видимо закрыта функция php mail, приходится искать обходные пути. phpmailer не пашет, нашел ваш скрипт, тоже вот не пуляет. Как понять в чем дело, в яндексе, хостере или еще где?
Ох, жаль не с первого раза попал на эту страницу…
Столько бы времени с экономил.
Спасибо!
Начальные сведения о способе отправки html письма есть. Но как прикреплять картинку не написано дословно…
Используется сторонний пакет. Однако хотелось бы знать как самостоятельно формировать все заголовки, какие они должны быть и т. д.
Спасибо, очень не хотелось рыскать, а здесь всё дословно и понятно объяснили, быстро сделал форму для восстановления пароля с помощью вашего готового примера скрипта, только + с авторизацией.
В общем, полезно =)