www.Litecode.ru – Сборник рецептов для создания сайтов

Perl. Отправка почты

ГлавнаяPerl → Отправка почты средствами perl

Сегодня поговорим про отправку почты с помощью perl. Для этой цели существует отличный модуль Mail::Sender, который написал Jan Krynicky. Для UNIX платформ, его можно взять с CPAN. Этот модуль представляет из себя инструмент для отправки электронной почты с вложениями, в том числе отправки с авторизацией. Mail:Sender по умолчанию не установлен в системах, поэтому придется его установить самостоятельно. Лучше это делать с помощью команды cpan через консоль, так как имеется зависимости. Модуль имеет широкий набор методов для отправки, я же не буду углубляться в подробности и расскажу о двух основных, которые в большей степени подходят для отправки писем с сайта.

Пример отправки через Mail:Sender с авторизацией:

use Mail::Sender;

my $sender = new Mail::Sender {from => 'user@yourserver.ru',
                               smtp => 'smtp.yourserver.ru',
                               skip_bad_recipients => '1',
                               auth=>'LOGIN',
                               authid=>'login@yourserver.ru',
                               authpwd=>'mysuperpassword'};

$sender->OpenMultipart({
                        to => 'admin@another.ru',
                        cc => ('mail@domen.ru','post@support.ru'),
                        replyto => 'admin@another.ru',
                        boundary => 'boundary-letter-1',
                        multipart => 'related',
                        subject => 'test Mail::Sender'
                        });

$sender->Part(ctype=>'multipart/alternative');

$sender->Part({ ctype => 'text/plain; charset=utf-8',
                            disposition => 'NONE',
                                msg => "Hello men!\n" });
                                
$sender->Part({ ctype => 'text/html; charset=utf-8',
                            disposition => 'NONE',
                                msg => "Html message\n" });
                                
$sender->EndPart('multipart/alternative');

$sender->Attach({ description => "Тру ла ла", file => "/path/file.txt" })

if ($sender->Close()) {
    print "Ok"; 
} else {
    print $
}

from — любой email почтового сервера, с которого совершается отправка.
smtp — собственно сам почтовый сервер smtp.
skip_bad_recipients — директива позволяет продолжить отсылку, если один из списка адресов, на который совершается отправка, не рабочий. По умолчанию отключена.
auth — тип smtp-авторизации. В данном примере LOGIN. Этот параметр зависит от настроек почтового сервера. Узнать поддерживаемые типы авторизации можно с помощю метода QueryAuthProtocols. Например так:

use Mail::Sender;

my $sender = new Mail::Sender{smtp => 'smtp.yourserver.ru'};
print join(', ', $sender->QueryAuthProtocols()),"\n";

authid — пользователь, от чьего имени совершается авторизация.
authpwd — пароль пользователя, от чьего имени совершается авторизация.

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

На любом этапе можно отследить ошибку, если таковая иметеся, с помощью переменной $.

to — кому пойдет письмо, обязательный параметр.
cc — кому пойдут копии письма, опционально.
replyto — кому сообщить об ошибке отправки и вернуть письмо.
multipart — установка миметайпа. Принимает значения mixed, related, alternative. Самое оптимальное значение related.
subject — тема письма.

Такой способ отправки позволит отсылать письма в формате html, со стилями, изображениями и так далее. Если вполне устраивает отсылка текстовых сообщений, то можно использовать метод MailMsg.
Пример:

my $sender = new Mail::Sender {from => 'user@yourserver.ru',
                               smtp => 'smtp.yourserver.ru'};

my $result = $sender->MailMsg({
                                ctype => 'text/html; charset=utf-8',  
                                to => 'feedback@mail.ru',
                                replyto => 'user@yourserver.ru',
                                subject => 'Автоответ',
                                msg => 'Письмо доставлено!'});
                                
if ( $result ) {
    print "Ok"; 
} else {
    print $
}

Метод Attach прикрепляет файлы к письму. Таким образом:

$sender->Attach({ description => "Файлы", file => "./file.txt" })