Как отправить письмо используя 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/