Categories: Perl

perl-email/

Недавно передо мной возникла задача иногда отправлять письма на один e-mail адрес. Притом, в силу некоторых причин, делать это через веб-интерфейс к нужному почтовому ящику отправителя не представлялось возможным, а добавлять сей ящик в десктопный почтовый клиент очень не хотелось. Тогда я порылся в архивах и нашел свой старенький скрипт на Perl для отправки электронной почты, которым и намерен сегодня с вами поделиться. Данный конкретный скрипт предназначен для проведения почтовых рассылок, но может быть легко адаптирован и под другие задачи.

Сам скрипт:

#!/usr/bin/env perl

# mailsend.pl
# (c) Aleksander Alekseev 2015
# http://remontka.com/

use strict ;
use warnings ;

use Mail :: Sender ;

my $fname = shift ;
die «Usage: $0 <email_list> n » unless $fname ;

$| = 1 ;

open my $fid , ‘<‘ , $fname or die $! ;

my $subj = ‘Очень важное письмо’ ;
my $msg = q {
Здравствуйте .

Это письмо с очень важной информацией .

С уважением ,
Василий Пупкин

Это письмо отправлено автоматически , отвечать на него не нужно .

Чтобы отписаться от рассылки , отправьте письмо с темой unsubscribe
на admin @example . ru
} ;

$Mail :: Sender :: NO_X_MAILER = 1 ;
my $sender = Mail :: Sender -> new ( {
smtp => ‘nicmail.ru’ ,
port => 25 ,
auth => ‘LOGIN’ ,
authid => ‘__email@example.ru__’ ,
authpwd => ‘__password__’ ,
from => ‘Pupkin <__email@example.ru__>’ ,
} ) or die «Mail::Sender->new() failed: $Mail::Sender::Error» ;

my @err_list ;
my $mail_number = 0 ;
while ( my $email = < $fid > ) {
chomp ( $email ) ;
$mail_number ++;
print «[$mail_number] $email n » ;

my $sent_ok = 0 ;
for my $attempt ( 1 .. 3 ) {
if ( $sender -> MailMsg ( {
to => $email ,
encoding => ‘base64’ ,
ctype => ‘text/plain; charset=UTF-8’ ,
subject => $subj ,
msg => $msg ,
} ) >= 0 ) {

$sent_ok = 1 ;
last ;
}

warn «MailMsg($email …) failed: $Mail::Sender::Error» ;
last if $Mail :: Sender :: Error =~ /unknown user account/i ;
last if $Mail :: Sender :: Error =~ /syntax error for/i ;
sleep $attempt * 60 ;
}

push @err_list , $email unless $sent_ok ;
sleep 15 ;
}
close $fid ;

print «— errors — n » ;
print join ( » n » , @err_list ) ;
print » n total errors = » . scalar ( @err_list ) . » n » ;

Очевидно, для больших рассылок, скажем, с 10 000 получателями, этот скрипт будет работать очень долго. Для решения этой проблемы его нужно как-то распараллеливать. Если же рассылка не срочная, а получателей всего лишь несколько тысяч, то скрипт вполне неплохо справляется со своей задачей.

Собственно, это все. Надеюсь, вы нашли эту информацию полезной. Также вас могут заинтересовать заметки Как отправить электронное письмо в Scala и Достаточно полное описание протокола SMTP .

А как вы решаете подобные задачи?

Дополнение: Пример скрипта для посылки электронных писем на Python можно найти в заметке Как я выбирал скриптовый язык и остановился на Python .

admin

Share
Published by
admin
Tags: Perl

Recent Posts

Консоль удаленного рабочего стола(rdp console)

Клиент удаленного рабочего стола (rdp) предоставляет нам возможность войти на сервер терминалов через консоль. Что…

1 месяц ago

Настройка сети в VMware Workstation

В VMware Workstation есть несколько способов настройки сети гостевой машины: 1) Bridged networking 2) Network…

1 месяц ago

Логи брандмауэра Windows

Встроенный брандмауэр Windows может не только остановить нежелательный трафик на вашем пороге, но и может…

1 месяц ago

Правильный способ отключения IPv6

Вопреки распространенному мнению, отключить IPv6 в Windows Vista и Server 2008 это не просто снять…

1 месяц ago

Ключи реестра Windows, отвечающие за параметры экранной заставки

Параметры экранной заставки для текущего пользователя можно править из системного реестра, для чего: Запустите редактор…

1 месяц ago

Как управлять журналами событий из командной строки

В этой статье расскажу про возможность просмотра журналов событий из командной строки. Эти возможности можно…

1 месяц ago