GetInfo.Ru – Компьютерная библиотека
Последние поступления
Gatewall Antispam: тотальный контроль электронной почты
Спам21/04/11
Мастер-класс: создаем Интернет-магазин (Часть 1)
Обзоры ПО20/04/11
CorelDRAW Graphics Suite X5: Что нового?
Обзоры ПО20/07/10
Acronis True Image Home – резервное копирование и не только
Обзоры ПО10/06/10
Создаем коллажи для Интернет-магазина
Adobe Photoshop07/06/10
Добавить статью
Самые читаемые материалы
Проверка e-mail адреса на существование(19406)
Строим календарь для сайта на Perl(8738)
Создание писем с помощью MIME::Lite(8662)
Построение крупно-масштабного e-commerce сайта на Apache и mod_perl(8446)
Image::Magick или фотошоп для perl(7703)


Всего статей: 808Всего авторов: 365Подразделов: 47Добавлено за сутки: 0
Статьи СТАТЬИ Форум ФОРУМ Рейтинг РЕЙТИНГ Поиск ПОИСК Контакты КОНТАКТЫ
» Главная » Perl » Создание писем с помощью MIME::Lite
Создание писем с помощью MIME::Lite
Алексей Репьев

Очень часто при программировании на 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. Я лишь попытался показать возможности этих модулей для решения задачи отправки письма. Более подробно ознакомиться с возможностями этих модулей вы можете в соответствующих руководствах:

Примеры к данной статье можно скачать здесь.

 
16.03.2004
Версия для печати Версия для печати Запомнить ссылку Запомнить ссылку Загрузить zip-архив статьи Zip-архив статьи Загрузить tar-архив статьи Tar-архив статьи
Ваша оценка:  1   2   3   4   5     





 О проектеПерепечаткаАвторамПартнерыО нас пишутРеклама
Наверх
Rambler's Top100 ©2003—2007. GETINFO.RU. ВСЕ ПРАВА ЗАЩИЩЕНЫ.