Как отправить письмо используя Perl ? Или модуль Perl MIME-Lite

Раздел: Программирование
Написано: 1.04.2009
Автор: Antonio

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

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();

Более подробно о модуле можно почитать в его хранилище CPAN

Ключевая фраза:
«отправка почты из 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&lt;10) {$min_or="0$min_or"};
if ($hour_or&lt;10) {$hour_or="0$hour_or"};
if ($mon_or&lt;10) {$mon_or="0$mon_or";};
if ($day_or&lt;10) {$day_or="0$day_or"};
if ($year_or&lt;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",
Поделиться с друзьями или в соц.сетях (спасибо)
Ещё похожие заметки:

11 комментариев

senatum
Апр 10, 2009 13:02

полезно

 
Михаил
Май 5, 2009 09:37

Спасибо, особенно за секцию 3.Дополнительно (про MIME::Base64).

 
Antonio
Май 5, 2009 10:40

Пожалуйста!
Сам использую в скриптах :-)

 
Игорь
Дек 1, 2009 19:04

Спасибо!! Пригодилось!!

 
Феанор
Май 20, 2010 08:33

Спасибо за хорошо расписанный материал, помогло быстро решить задачу =)

 
Евгений
Июн 26, 2010 17:53

Спасибо, помогло в решении задачи, подсказало направление.

 
Санчо
Янв 25, 2011 13:03

Антонио, ты че пи*****?А авторизацию кто будет производить?С*** накопируют из сети материала и даже не проверяя как он работает, а порой и не задумываясь выкладывают с пометкой РЕАЛЬНО РАБОТАЕТ.Все б** у них просто ввел от кого любое мыло, кому мыло и все.Ты б** у меня это не работает так как я прекрасно понимаю что и как.Что через smtp нужна авторизация, что через mime.Ты с*** смотри че делается, у всех работает а у меня нет.Д******* ВЫ ХОТЬ ПРОВЕРЯЙТЕ ПЕРЕД СОЗДАНИЕМ ТЕМЫ, ведь не все же знакомы с perl на уровне продвинутого программиста.

 
Antonio
Фев 2, 2011 03:50

Прочитал коммент и количество матов и ругательств сначала меня расстроило, но на таких людей не стоит обижаться, у них если что-то не получается, то они начинают искать виноватых и думаю что они продвинутые, а вокруг дураки..

А по поводу накопировал и прочее, то — практически все что я тут пишу (на блоге) я проверил на практике, у меня нет цели набивать сюда все подряд.

Авторизация мне в скриптах не нужна, так как я использую внутренний почтовый сервер, который работает вообще без авторизации, там нет паролей как таковых..
просто для внешних пользователей доступ запрещен, но вы похоже о таких вариантах не знаете, так что вам не стоит нервничать и писать большими буквами.

Удачи!

 
Antonio
Фев 2, 2011 03:51

в рамках цензуры, должен подредактировать ваше сообщение…

 
Gennady
Июн 7, 2011 14:57

Antonio, спасибо за пример. И все-таки, как делать авторизацию, в частности для отправки с gmail.com ?
Отправляю таким образом

$msg->send(‘smtp’,’smtp.gmail.com’,AuthUser=>’[email protected]’, AuthPass=>’password’,port => 465);

но в логах Connection timed out

 
Antonio
Июн 8, 2011 02:24

Gennady, написал статейку, надеюсь поможет =)

Как отправить письмо через GMail из программы на Perl?
http://nemcd.com/2011/06/kak-otpravit-pismo-cherez-gmail-iz-programmy-na-perl/

 

Написать

Копирование информации с сайта возможно только с указанием прямой ссылки - https://nemcd.com