Снова хочу вернуться к теме Message-id в заголовке письма. Я уже рассказывал, как проставить это поле средствами Exim. Сегодня, я хочу рассказать о том, как это сделать средствами PHP и Perl. Ведь далеко не всегда есть возможность исправить конфиги почтового сервера.

Итак, ставим себе задачу. Написать функцию на PHP/Perl для отправки почты в кодировке windows-1251. Начну пожалуй со своего любимого перла. Немного поковырявшись нашлось 2 замечательных модуля Email::MessageID и MIME::Base64. Собственно первый нам потребуется, для проставления Message-id, а второй для кодирования заголовков. Энкодить темы письмы необходимо, т.к. поле subject тоже отправляется в кодировке windows-1251, но в письме про это нигде не говорится. Это нужно для корректного распознования темы письма почтовыми программами, да и антиспам-системы не очень любят такие письма.

use MIME::Base64;
use Email::MessageID;
sub mailSend
{
my ($mail_to, $subject, $body) = @_;
my $msg_id = Email::MessageID->new;
my $header = "".
"Message-ID: ".$msg_id."\n".
"From: \"NULL\" <noreply\@domain.null>\n".
"Reply-To: \"NULL\" <noreply\@domain.null>\n".
"To: ".$mail_to."\n".
"Subject: =?WINDOWS-1251?B?".encode_base64($subject,"")."?=\n".
"MIME-Version: 1.0\n".
"Content-Transfer-Encoding: 8bit\n".
"Content-Type: text/plain; charset=\"windows-1251\"\n".
"";
$body .= "\n--\n".
"С уважением,\n".
"бла-бла-бла\n".
"";
open (SND,"|/usr/lib/sendmail -t");
print SND "".$header."\n".$body;
close SND;
}

Теперь мы имеем простенькую функцию отсылки писем. Вам осталось только подставить свою подпись и свой обратный адрес отправителя.

Теперь перейдем к PHP версии этой функции. Тут мы не будем использовать никакие сторонние модули, и пойдем другим путем. Message-id будем генерить самостоятельно.

function mailSend($mail_to, $subject, $body)
{
$subject = '=?WINDOWS-1251?B?'.base64_encode($subject).'?=';
$header = "".
"From: \"NULL\" <noreply\@domain.null>\n".
"Reply-To: \"NULL\" <noreply\@domain.null>\n".
"To: ".$mail_to."\n".
"Message-ID: <".md5(uniqid(microtime()))."@".$_SERVER['SERVER_NAME'].">\n".
"MIME-Version: 1.0\n".
"Content-Transfer-Encoding: 8bit\n".
"Content-Type: text/plain; charset=\"windows-1251\"\n".
"";
$body .= "\n--\n".
"С уважением,\n".
"бла-бла-бла\n".
"";
mail($mail_to, $subject, $body, $header);
}

Обе эти функции совершенно идентичны друг другу, за исключение языка написания. Используйте, если кому нужно.

Жду комментов.