Очень часто при программировании на Perl необходимо отправить письмо. Обычно для этого используется конструкция вида:
open(MAIL,"| /usr/sbin/sendmail test@test.com");
print MAIL "From: from\@test.com\n";
print MAIL "Subject: Тестовое письмо\n\n";
print MAIL "Текст нашего письма\n";
close(MAIL);
Однако, такой метод не всегда подходит для конкретных нужд. А что делать, если необходимо послать письмо в каком-нибудь другом формате, например, в text/html? Тут есть два варианта решения: либо вручную создавать шаблон письма в соответствии с RFC822 и т.д., либо использовать уже готовые модули для Perl.
О втором варианте далее и пойдет речь.
Модуль MIME::Lite
Этот модуль позволяет легко и быстро создавать и отправлять письма практически в любом формате. Загрузить модуль можно с www.cpan.org.
Установка очень проста:
perl Makefile.PL
make test
make install
Теперь, когда модуль установлен, перейдем к созданию и отправке писем с его помощью.
Сначала отправим простое текстовое письмо:
#!/usr/bin/perl
use MIME::Lite;
my $msg = MIME::Lite->new( From => 'foo@test.com',
To => 'bar@test.com',
Subject => 'Тема письма',
Type => 'text/plain; charset=windows-1251',
Data => 'Текст нашего письма' );
$msg->send();
Как видите, все довольно просто.
Теперь отправим письмо с вложенным файлом:
#!/usr/bin/perl
use MIME::Lite;
my $msg = MIME::Lite->new( From => 'foo@test.com',
To => 'bar@test.com',
Subject => 'Тема письма',
Type => 'multipart/mixed' );
$msg->attach( Type => 'text/plain; charset=windows-1251',
Data => "Текст нашего письма. Картинка прилагается." );
$msg->attach( Type => 'image/gif',
Path => 'mylogo.gif',
Filename => 'logo.gif',
Disposition => 'attachment' );
$msg->send();
Как видите, модуль позволяет создавать письмо отдельными частями. Сначала определяются параметры самого письма, а затем добавляются его части. В нашем случае это обычный текст и графическое изображение.
Давайте теперь попробуем отправить более сложное письмо, а именно письмо в формате html с графикой, с прикрепленным zip-файлом (например, прайс-листом) и с версией письма для почтовых агентов, не понимающих html.
#!/usr/bin/perl
use MIME::Lite;
my $msg = MIME::Lite->new( From => 'foo@test.com',
To => 'bar@test.com',
Subject => 'Тема письма',
Type => 'multipart/mixed' );
$msg->attach( Type => 'text/html; charset=windows-1251',
Data => "<body>\n<h1>Текст нашего письма</h1>\n<br><br>\n
Наша картинка:<br><img src=\"cid:logo.gif\">\n</body>\n" );
$msg->attach( Type => 'text/plain; charset=windows-1251',
Data => "Альтернативный текст нашего письма. Картинка прилагается.\n" );
$msg->attach( Type => 'image/gif',
Path => 'mylogo.gif',
Filename => 'logo.gif',
Id => 'logo.gif',
Disposition => 'attachment' );
$msg->attach( Type => 'application/x-zip-compressed',
Path => 'price.zip',
Filename => 'price.zip',
Disposition => 'attachment' );
$msg->send();
Следует обратить внимание на то, что если вы хотите чтобы в письме отображалось изображение нужно задать параметр Id, по которому вы сможете ссылаться на изображение внутри письма.
Дополнительные возможности MIME::Lite
В модуле есть ряд дополнительных функций, которые могут быть полезны при отладке:
Вывод сформированного письма в поток:
$msg->print(\*STDOUT);
Запись сформированного письма в строку:
$str = $msg->as_string;
Запись заголовка сформированного письма в строку:
$str = $msg->header_as_string;
Запись тела сформированного письма в строку:
$str = $msg->body_as_string;
Также есть возможность выбора способа отправки письма: sendmail или smtp.
В случае отправки через sendmail (по умолчанию) можно указать его местоположение в системе
и опции запуска:
MIME::Lite->send('sendmail', "/usr/lib/sendmail -t -oi -oem");
Для smtp:
MIME::Lite->send('smtp', "mail.test.com", Timeout=>120);
Модуль MIME::Base64
Наверное вы замечали, что иногда приходят письма, в которых невозможно прочитать тему письма, между тем как само письмо читаемо. Все дело в том, что в этих письмах неверно сформирована тема. Чтобы ваши письма читались в большинстве почтовых агентов корректно, можно использовать модуль MIME::Base64 для формирования темы письма.
...
$subj = MIME::Base64::encode("Тема письма","");
$subj = "=?windows-1251?B?".$subj."?=";
...
Следует заметить что конструкции вида '=?' и '?=' определяют начало и конец закодированной темы, а '?B?' определяет конец обозначения кодировки и начало закодированного текста.
Теперь отправка письма с использованием MIME::Lite будет выглядеть так:
#!/usr/bin/perl
use MIME::Lite;
use MIME::Base64;
my $subj = MIME::Base64::encode("Тема письма","");
$subj = "=?windows-1251?B?".$subj."?=";
my $msg = MIME::Lite->new( From => 'foo@test.com',
To => 'bar@test.com',
Subject => $subj,
Type => 'multipart/mixed' );
$msg->attach( Type => 'text/html; charset=windows-1251',
Data => "<body>\n<h1>Текст нашего письма</h1>\n<br><br>\n
Наша картинка:<br><img src=\"cid:logo.gif\">\n</body>\n" );
$msg->attach( Type => 'text/plain; charset=windows-1251',
Data => "Альтернативный текст нашего письма. Картинка прилагается.\n" );
$msg->attach( Type => 'image/gif',
Path => 'mylogo.gif',
Filename => 'logo.gif',
Id => 'logo.gif',
Disposition => 'attachment' );
$msg->attach( Type => 'application/x-zip-compressed',
Path => 'price.zip',
Filename => 'price.zip',
Disposition => 'attachment' );
$msg->send();
Заключение
Данная статья не претендует на роль руководства по модулям MIME::Lite и MIME::Base64. Я лишь попытался показать возможности этих модулей для решения задачи отправки письма. Более подробно ознакомиться с возможностями этих модулей вы можете в соответствующих руководствах:
Примеры к данной статье можно скачать здесь.
|