Отправка почты с вложениями (часть вторая)
Продолжение статьи Отправка почты с вложениями
В прошлой статье я расписал, как выглядят почтовые сообщения изнутри. В этой статье начнем делать наши первые письма при помощи PHP.
Всем известна PHP функция MAIL:
bool mail($to, $subject, $message, $headers, $additional_parameters)
Она отправляет текст $message как письмо с заголовком $subject получателю $to с какими-то дополнительными заголовками на вроде «From: ….»
<?php $to = 'email@test.ru'; $subject = 'Привет!'; $message = 'Привет, как дела?'."\n".'Я хорошо, пиши!'; mail($to, $subject, $message); ?>
Это было текстовое сообщение, а теперь давайте отправим HTML сообщение:
<?php $to = 'email@test.ru'; $subject = 'Привет!'; $message = '<html><body><b>Привет, как дела?</b><br><div style="color: green">Я хорошо, пиши!</div></body></html>'; $headers = 'Content-type: text/html; charset=windows-1251'."\r\n"; mail($to, $subject, $message, $headers); ?>
Можете испытать данные примеры. Если используете DENWER то письма реально не уйдут в интернет, они будут сохранены в директорию X:\WebServers\tmp\!sendmail\
Где: X — буква диска, куда установлен DENWER
Письма в текстовом формате с расширением eml. Открываются как в Outlook Express так и в The Bat
Теперь вспомним, как формируется тело сообщения, для отправки письма в текстовом и HTML формате одновременно.
Первое, это нужно сказать функции отправки писем, что письмо будет сложное, указываем «ключ» — разделителем частей письма которым он будет являться, добавляем дополнительные параметры заголовка, например «от кого» письмо:
$boundary = md5(time()); $to = 'email@test.ru'; $subject = 'Привет!'; $from_address = 'admin@mail.zet'; $html = '<html><body><b>Привет, как дела?</b><br><div style="color: green">Я хорошо, пиши!</div></body></html>'; $text = strip_tags($html); $headers = ''; $message_body = ''; $headers .="MIME-Version: 1.0\nContent-Type: multipart/alternative;\n"; $headers .=" boundary=\"".$boundary."\""; $headers .="\nFrom: ".$from_address;
Ключ может быть любой, главное латинские буквы цифры, желательно начинать с буквы или цифры или знака «земля» — «_».
Такс, далее, подготавливаем часть письма — текстовый вариант:
$message_body .= "--".$boundary."\n"; $message_body .= "Content-Type: text/plain; charset=windows-1251\n"; $message_body .= "Content-Transfer-Encoding: quoted-printable\n\n"; $message_body .= trim(quoted_printable_encode($text)); $message_body .= "\n";
Для того чтобы формат кириллических символов воспринимался нормально, их нужно перевести в специальные коды, которые будет понимать почтовый сервер и клиент, что даст 100% совместимость (это две функции, работающие совместно):
function quoted_printable_encode_character ( $matches ) { $character = $matches[0]; return sprintf ( '=%02x', ord ( $character ) ); } function quoted_printable_encode ( $string ) { $string = preg_replace_callback ('/[^\x21-\x3C\x3E-\x7E\x09\x20]/', create_function('$matches', 'return quoted_printable_encode_character($matches[0]);'), $string ); $newline = "=\r\n"; $string = preg_replace ( '/(.{73}[^=]{0,3})/', '$1'.$newline, $string); return $string; }
Для формирования HTML части тела письма делаем следующее:
$message_body .= "--".$boundary."\n"; $message_body .= "Content-Type: text/html; charset=windows-1251\n"; $message_body .= "Content-Transfer-Encoding: quoted-printable\n\n"; $message_body .= trim(quoted_printable_encode($html)); $message_body .= "\n";
И наконец, нам надо сказать письму, что мы закончили его формирование:
$message_body .= "--".$boundary."--\n";
Далее остается, только вызвать всем нами известную функцию MAIL:
if (mail($to,$subject, $message_body, $headers)) echo 'Отправка прошла! :)'; else echo 'Увы, где-то, что-то не работает :(';
Для того чтобы отправить вложение, необходимо добавить по аналогии третью часть письма после текстовых, заменяя Content-type на соответствующий MIME тип файла
читая и кодируя файл, выводя его по 72 символа в строку, но об этом я напишу в следующей статье, которая выйдет либо следом за этой, либо через 3−4 дня.
Клевый материал
Ага! Это полезно. Надо будет для Joomla компоненту почтовую модифицировать, чтобы она могла письма слать в двух форматах сразу.