Используем MIME::Lite или Как отправить email с прикрепленными файлами?
 
 

Введение

Приветствую вас начинающие волшебники...
Именно с этих слов началось мое изучение Perl.
С тех пор я много узнал о Perl'e и теперь сам могу начать свой рассказ именно с этих слов...
Так вот у каждого Perl программиста есть период когда он начинает повышать уровень собственных знаний, а когда это случается он ставит перед собой задачу (по своей воле или по роду деятельности...) примерно такого плана
"Я хочу знать как на Perl'е сделать ..." и если его выбор пал на "отправку email'а с прикрепленными файлами", то эта статья ему просто необходима!

Описание

Я пойду по простому пути, я буду использовать CPAN модуль Mime::Lite и советую вам делать тоже самое.
Объясняю почему. Самому писать декодер для почтовых форматов дело сложное и требует огромного количества времени, а время это самое дорогое что есть у человека! Помните об этом.

Q: А где мне взять этот модуль?
A: Скорее всего он уже установлен на вашем сервере, если его нет, то вы можете его скачать(27kb) и самостоятельно установить. (даже если у вас нет прямого доступа к серверу).

Теперь начнем "подготавливать почву"
Напишите следующую программу:

#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "<html><body>";
eval 'use MIME::Lite;';
if ($@ eq ""){print "\n\n<h1>Модуль установлен";exit;}
else {print "\n\n<h1>Модуль не установлен";exit;}

Закачайте ее на сервер и запустите. Если ответ будет Модуль не установлен вам придется: скачать(27kb) модуль, закачать его на сервер в вашу cgi-bin директорию (не придавая атрибуты 755!), и заменять в этой статье строку

use MIME::Lite;
на
require "путь/к/файлу/Lite.pm";
Вот и вся подготовка.

Синтаксис

Синтаксис является стандартным для таких модулей.

 ## Посылаем один GIF фаил: $msg = MIME::Lite->new( From =>'Ваш@Адрес.com', To =>'Адрес@Получателя.com', Subject =>'Тема сообщения', Type =>'image/gif', Encoding =>'base64', Path =>'file.gif' ); $msg->send(); 

Давайте по порядку:
$msg = MIME::Lite->new(
Передаем модулю запрос на создание нового сообщения
From =>'Ваш@Адрес.com'
To =>'Адрес@Получателя.com'
Subject =>'Тема сообщения'
Пишем исходные данные
Type =>'image/gif'
Тип отсылаемого сообщения (Говорит мейлеру как читать это сообщение).
Возможные значения:

TEXT - простой форматированный текст
text/html - html документ
image/gif - картинка GIF
image/jpg - картинка JPG
image/png - картинка PNG
multipart/mixed - смешанные типы
multipart/related - смешаные типы, используются для отсылки HTML страниц со "встроенными" картинками
Или упрощенно
"TEXT" - "text/plain"
"BINARY" - "application/octet-stream"

Encoding =>'base64'
Как кодировать сообщение для отправки. Значение по умолчанию можно не использовать...

Path =>'../file.gif'
Местонахождение файла на сервере.

$msg->send();
Послать сообщение.
Бывает двух типов через SMTP или Sendmail...
MIME::Lite->send('smtp', "smtp.mail.ru", Timeout=>60)
MIME::Lite->send("sendmail", "/usr/lib/sendmail -t");

Примеры

А теперь несколько наглядных примеров. Для усвоения материала

Итак предположим вам надо послать текстовое сообщение с двумя файлами внутри

  #!/usr/bin/perl #--- Прогрузим модуль: use MIME::Lite; #--- Создадим текстовое сообщение: $msg = MIME::Lite->new( From =>'me@myhost.com', To =>'you@yourhost.com', Cc =>'some@other.com, some@more.com', Subject =>'Отчеты за год...', Type =>'TEXT', Data =>"Присылаю два отчета\n" Data =>"Один в графическом виде\n" Data =>"Другой находится в архиве" ); #--- Приатачим первый фаил(gif): $msg->attach(Type =>'image/gif', Path =>'files/aaa000123.gif', Filename =>'logo.gif' ); #--- Приатачим второй фаил(zip): $msg->attach(Type =>'application/x-zip-compressed', #Какого типа фаил Path =>'files/lasha.zip', #Местонахождение и название файла Filename =>'super.zip' #Имя файла после отправки ); #--- Отправим используя стандартный sendmail $msg->send();  

А теперь другая ситуация: Вы рассылаете рассылку в виде HTML с картинками в самом письме

  #!/usr/bin/perl #--- Прогрузим модуль: use MIME::Lite; #--- Создадим текстовое сообщение: $msg = MIME::Lite->new( From =>'me@myhost.com', To =>'you@yourhost.com', Subject =>'HTML with in-line images!', Type =>'multipart/related' ); #--- Первая часть сообщения -html документ $msg->attach(Type => 'text/html', Data => qq{ <html><body> Это <i>мои</i> фотки: <img src="cid:foto1.gif"> <img src="cid:foto2.gif"> </body></html> } #--- Вторая часть сообщения фото #1 $msg->attach(Type => 'image/gif', Id => 'foto1.gif', Path => '/path/to/foto1.gif', ); #--- Третья часть сообщения фото #2 $msg->attach(Type => 'image/gif', Id => 'foto2.gif', Path => '/path/to/foto2.gif', ); #--- Отправим используя стандартный sendmail $msg->send();  

Заключение

Возможно наличие ошибок и опечаток в этой статье. Все мы люди и не застрахованы от неожиданностей. Если таковые будут Вами замечены - сообщите мне, я их обязательно исправлю. Также можете присылать предложения и дополнения касательно данной статьи.
Что либо непонятно? Пишите дополню.

Данная статья основывается на документации CPAN к модулю MIME::Lite.
 
Автор: Serge Suhov
 
Оригинал статьи: http://woweb.ru/publ/58-1-0-317