Как отправить письмо используя Perl ? Или модуль Perl MIME-Lite
Для отправки писем из своих скриптов, написанных на языке Perl, я использую модуль Perl MIME-Lite.

Этот замечательный модуль вы можете использовать для создания и отправки электронной почты с текстовыми и двоичными вложениями.
Все это с его помощью делается легко и просто.
Я приведу наиболее часто используемые примеры работы с модулем.
1. Отправить простое текстовое письмо:
#!/usr/bin/perl
use MIME::Lite;
my $msg = MIME::Lite->new(
From => '[email protected]',
To => '[email protected]',
Subject => 'Тема письма',
Type => 'text/plain; charset=windows-1251',
Data => 'Текст нашего письма' );
$msg->send();
2. Отправить письмо с вложенным файлом:
#!/usr/bin/perl
use MIME::Lite;
my $msg = MIME::Lite->new(
From => '[email protected]',
To => '[email protected]',
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();
Модуль MIME-Lite позволяет создавать письмо отдельными частями.
Сначала определяются параметры самого письма, а затем добавляются его части.
В нашем случае это обычный текст и графическое изображение.
3. Отправка более сложного письма.
Письмо в формате html с графикой, с прикрепленным zip-файлом и с версией письма для почтовых агентов, которые не понимают html.
#!/usr/bin/perl
use MIME::Lite;
my $msg = MIME::Lite->new(
From => '[email protected]',
To => '[email protected]',
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::Base64
Иногда приходят письма, в которых невозможно прочитать тему письма, между тем как само письмо читаемо. Все дело в том, что в этих письмах неверно сформирована тема. Чтобы ваши письма читались в большинстве почтовых агентов корректно, можно использовать модуль MIME::Base64 для формирования темы письма.
$subj = MIME::Base64::encode("Тема письма","");
$subj = "=?windows-1251?B?".$subj."?=";
Конструкции вида ‘=?’ и ‘?=’ определяют начало и конец закодированной темы,
а ‘?B?’ определяет конец обозначения кодировки и начало закодированного текста.
4. Отправка письма с корректной темой
#!/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 => '[email protected]',
To => '[email protected]',
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();
Более подробно о модуле можно почитать в его хранилище
Ключевая фраза:
«отправка почты из Perl»
«работа с модулем MIME::Lite»
«использование модуля MIME::Lite»
P.S. Вообще реальный пример — письмо с отчетом в html^
#!/usr/bin/perl
$stat_log="/var/log/squid/squid_stat.html";
use MIME::Lite;
($sec_or,$min_or,$hour_or,$day_or,$mon_or,$year_or)=localtime;
++$mon_or;
$year_or=$year_or-100;
if ($min_or<10) {$min_or="0$min_or"};
if ($hour_or<10) {$hour_or="0$hour_or"};
if ($mon_or<10) {$mon_or="0$mon_or";};
if ($day_or<10) {$day_or="0$day_or"};
if ($year_or<10) {$year_or="0$year_or"};
$date_or="$day_or\.$mon_or\.$year_or";
$time_or="$hour_or\:$min_or";
open(STAT,"< $stat_log");
@stat_data = <STAT>;
close(STAT);
my $msg = MIME::Lite->new(
From =>'[email protected]',
To =>'[email protected]',
Subject =>"Squid Stats $date_or, $time_or from ProxyServer",
Type =>'text/html; charset=koi8-r',
Data =>"@stat_data");
$msg->send();
P.S.S. кстати, для того, чтобы использовать вывод переменной в адресе почты или теле письма, нужно ставить обычные двойные кавычки!
Subject =>"Squid Stats $date_or, $time_or from ProxyServer",
полезно
Спасибо, особенно за секцию 3.Дополнительно (про MIME::Base64).
Пожалуйста!
Сам использую в скриптах
Спасибо!! Пригодилось!!
Спасибо за хорошо расписанный материал, помогло быстро решить задачу =)
Спасибо, помогло в решении задачи, подсказало направление.
Антонио, ты че пи*****?А авторизацию кто будет производить?С*** накопируют из сети материала и даже не проверяя как он работает, а порой и не задумываясь выкладывают с пометкой РЕАЛЬНО РАБОТАЕТ.Все б** у них просто ввел от кого любое мыло, кому мыло и все.Ты б** у меня это не работает так как я прекрасно понимаю что и как.Что через smtp нужна авторизация, что через mime.Ты с*** смотри че делается, у всех работает а у меня нет.Д******* ВЫ ХОТЬ ПРОВЕРЯЙТЕ ПЕРЕД СОЗДАНИЕМ ТЕМЫ, ведь не все же знакомы с perl на уровне продвинутого программиста.
Прочитал коммент и количество матов и ругательств сначала меня расстроило, но на таких людей не стоит обижаться, у них если что-то не получается, то они начинают искать виноватых и думаю что они продвинутые, а вокруг дураки..
А по поводу накопировал и прочее, то — практически все что я тут пишу (на блоге) я проверил на практике, у меня нет цели набивать сюда все подряд.
Авторизация мне в скриптах не нужна, так как я использую внутренний почтовый сервер, который работает вообще без авторизации, там нет паролей как таковых..
просто для внешних пользователей доступ запрещен, но вы похоже о таких вариантах не знаете, так что вам не стоит нервничать и писать большими буквами.
Удачи!
в рамках цензуры, должен подредактировать ваше сообщение…
Antonio, спасибо за пример. И все-таки, как делать авторизацию, в частности для отправки с gmail.com ?
Отправляю таким образом
$msg->send(‘smtp’,’smtp.gmail.com’,AuthUser=>’[email protected]’, AuthPass=>’password’,port => 465);
но в логах Connection timed out
Gennady, написал статейку, надеюсь поможет =)
Как отправить письмо через GMail из программы на Perl?
http://nemcd.com/2011/06/kak-otpravit-pismo-cherez-gmail-iz-programmy-na-perl/