Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: разработка для Web > Модуль Mail::Sendmail


Автор: HalkaR 13.6.2003, 21:44
Работа с модулем Mail::Sendmail очень проста. Данный модуль отсылает почту при помощи smtp сервера.
Вот небольшой пример.
Код
use Mail::Sendmail;


 %mail = ( To      => '[email protected]',                         #кому
                 From    => '[email protected]',         #от кого
                 Subject => 'Subj',                                      #Субджект
                 'Content-Type' => 'text/plain;  charset=win1251',     #Контент, зачем он нужен - потом
                 'Content-Transfer-Encoding' => '8bit',    
                 Message => 'Ура! Работает!',                  #Само сообщение
                 Smtp => smtp.mail.ru );                            #почтовый сервер


 sendmail(%mail) or die $Mail::Sendmail::error;        #Отправляем

 print "OK. Log says:\n", $Mail::Sendmail::log;              #Выясняем что получилось


Итак все просто. Сначала формируем хеш, в который можно закинуть все свойства письма (например можно добавить важность письма для Outgluc'a или название почтовика). Можно В текст написать html

тест, тогда надо заменить text/plain на text/html.
Вот еще кой-какие свойства:
Код
'X-Mailer' => 'Microsoft Outlook Express 6.00.2600.0000'
Date    => Mail::Sendmail::time_to_date( time() )
'X-MSMail-Priority' => 'High'.


Итак - вот первое письмо. А как же отправлять аттачмент? Так же. Только тип контента меняется на

'Content-Type' => "multipart/mixed; boundary=\"$boundary\" charset=win1251"

$boundary - это разделитель между отдельными частями письма (текст, файл).

$boundary = "====" . time() . "====";

Все письмо, и текст и файл отправляются в виде одного куска текста. Вот как он создается.

Код
$file = 'file.exe';                        #название файла
$boundary = '--'.$boundary;

$mail{body} = <<END_OF_BODY;       #Начало текста письма
$boundary
Content-Type: text/html; charset="koi8-r"
Content-Transfer-Encoding: 8bit

$message   #Текст
$boundary
Content-Type: application/octet-stream; name="$file"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="$file"

$file_text                   #файл считаный в переменню в бинарном режиме
$boundary--\n
END_OF_BODY           #Конец текста письма

файл считывается так:

Код
open (F, $file) or die "Cannot read $file: $!";
binmode F; undef $/;
$file_text = encode_base64(<F>);
close F;


В принципе все. Только не забудьте про кодировки - в различных почтовиках с ними могут быть проблемы. Возможно придется заменить win1251 на koi8-r и/или перекодировать тест.

Автор: HalkaR 13.6.2003, 21:51
Единственное но. Такой скрипт работает только с серверами, где нет проверки pop при отправке сообщений. И адресс отправителя писать надо настоящий иначе сервер не пустит. Я правда знаю один сервер вовсе без проверки, но это редкий случай.

Автор: rocknroll 21.6.2003, 13:38
А сендмаилом как отправить через этот модуль?

Автор: HalkaR 21.6.2003, 17:30
А причем тут sendamil?? В том то и дело что он не нужен!

Автор: rocknroll 22.6.2003, 15:13
Сендмаил проще найти, чем SMTP без проверок. Точнее сендмаил даже искать не надо, он в юниксе стоит. Так вот хотелось бы узнать можно ли сендмаил заюзать как нибудь? Если нет, то как через сендмаил слать файло?
Благодарю зарание

Автор: Wowa 22.6.2003, 17:04
Цитата
Сендмаил проще найти, чем SMTP без проверок. Точнее сендмаил даже искать не надо, он в юниксе стоит. Так вот хотелось бы узнать можно ли сендмаил заюзать как нибудь? Если нет, то как через сендмаил слать файло?
Благодарю зарание

Я думаю, этот вопрос надо задать в отдельной теме. А вообще, в ФАКе у нас на форуме это есть: http://forum.vingrad.ru/index.php?act=ST&f=34&t=2075

Автор: HalkaR 22.6.2003, 19:52
Цитата
Сендмаил проще найти, чем SMTP без проверок.
Ага - рассказывай! smile.gif Сендмейл он конечно есть везде, тока его тебе на бесплатном серваке точно не дадут или дадут но стакими ограничениями, что проще забить! А подходящих серваков куча - mail.ru к примеру. Через него отлично шлется, тока в поле from надо реальный ящик на mail.ru писать.

Автор: rocknroll 22.6.2003, 21:45
Я говорю про тот случай, когда у тебя на компе стоит юникс. А у меня так обычно и бывает =)

Автор: HalkaR 22.6.2003, 21:54
Цитата
Я говорю про тот случай, когда у тебя на компе стоит юникс. А у меня так обычно и бывает =)
У тебя сервер дома?rolleyes.gif Тогда конечно - пожалуйста.
Кстати, если будешь слать SEndmail'ом то аттач (насколько я помню) делается точно также как и в моем примере. Принцип тотже.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)