Приветствую вас начинающие волшебники... Именно с этих слов началось мое изучение 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.