Главная > Заметки, Сделай сам, Статьи > Отправка почты с вложениями (часть вторая)

Отправка почты с вложениями (часть вторая)

Продолжение статьи Отправка почты с вложениями

В прошлой статье я расписал, как выглядят почтовые сообщения изнутри. В этой статье начнем делать наши первые письма при помощи 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 дня.

Заметки, Сделай сам, Статьи , , ,

  1. 13 Апр 2009 из 20:43 | #1

    Клевый материал :)

  2. 14 Окт 2009 из 12:19 | #2

    Ага! Это полезно. Надо будет для Joomla компоненту почтовую модифицировать, чтобы она могла письма слать в двух форматах сразу.

  1. Трекбеков пока нет.