Perl - отправка почты

kruto
На сайте с 26.10.2007
Offline
12
2885

Из модулей для почты установлен только Net::SMTP. Пытаюсь отправить почту таким вот образом:

$smtp = Net::SMTP->new('mail.domain.ru', Hello =>'domain', Debug=>1, authid=>'login', authpwd=>'pass');

$smtp->mail("$from"); # Указываем от кого письмо.
$smtp->to("$email"); # Указываем кому письмо.
$smtp->data(); # Начинаем посылку данных
$smtp->datasend("To: $email \n"); # Указываем информацию для поля "Кому"
$smtp->datasend("From: $from \n"); # Пустая строка
$smtp->datasend("Subject: $title_mail \n"); # Сообщение
$smtp->datasend("$text_mail \n"); # Сообщение
$smtp->dataend(); # Заканчиваем посылку даных
$smtp->quit;

Но письма не отсылаются. В логах вот что:

Net::SMTP>>> Net::SMTP(2.29)

Net::SMTP>>> Net::Cmd(2.26)
Net::SMTP>>> Exporter(5.58)
Net::SMTP>>> IO::Socket::INET(1.29)
Net::SMTP>>> IO::Socket(1.29)
Net::SMTP>>> IO::Handle(1.25)
Net::SMTP=GLOB(0x848be6c)<<< 220 server.*** ESMTP Exim 4.68 Sun, 16 Mar 2008 22:33:19 +0200
Net::SMTP=GLOB(0x848be6c)>>> EHLO ***
Net::SMTP=GLOB(0x848be6c)<<< 250-server.*** Hello server.*** [***.***.***.***]
Net::SMTP=GLOB(0x848be6c)<<< 250-SIZE 20971520
Net::SMTP=GLOB(0x848be6c)<<< 250-PIPELINING
Net::SMTP=GLOB(0x848be6c)<<< 250-AUTH PLAIN LOGIN
Net::SMTP=GLOB(0x848be6c)<<< 250-STARTTLS
Net::SMTP=GLOB(0x848be6c)<<< 250 HELP
Net::SMTP=GLOB(0x848be6c)>>> MAIL FROM:<***>
Net::SMTP=GLOB(0x848be6c)<<< 250 OK
Net::SMTP=GLOB(0x848be6c)>>> RCPT TO:<***>
Net::SMTP=GLOB(0x848be6c)<<< 550 authentication required
Net::SMTP=GLOB(0x848be6c)>>> DATA
Net::SMTP=GLOB(0x848be6c)<<< 503-All RCPT commands were rejected with this error:
Net::SMTP=GLOB(0x848be6c)<<< 503-authentication required
Net::SMTP=GLOB(0x848be6c)<<< 503 Valid RCPT command must precede DATA
Net::SMTP=GLOB(0x848be6c)>>> To: ***

Я так понимаю ужна авторизация, но разве этого недостаточно?

$smtp = Net::SMTP->new('mail.domain.ru', Hello =>'domain', Debug=>1, authid=>'login', authpwd=>'pass');

Подскажите плиз в чем проблема может быть и как ее решить.

Здесь могла быть моя подпись.
bbon
На сайте с 01.04.2006
Offline
127
#1
kruto:
Подскажите плиз в чем проблема может быть и как ее решить.

судя по ответам сервера, подозреваю, следует использовать родственный модуль Net::SMTP::TLS

kruto
На сайте с 26.10.2007
Offline
12
#2

такой модуль не установлен. Выходит с помощью установленных никак нельзя отправить почту?

Вот еще пробовал перед отправкой авторизоваться по POP3, а потом отсылать по SMTP.

авторизовался так:

my $pop3 = Net::POP3->new($server_name, Timeout => 20)|| die (print "Can't CONNECT\n");

$pop3->login($user_name, $user_pass)|| die (print "Can't LOGIN\n");

так вот проблема в том, что отсылает рандомное число писем от 50 до 300 а потом останавливается. Потом сутки выдает Can't CONNECT

В чем может быть проблема. Хостеер клянется, что ограничений на письма нету. может я не так отсылаю?

bbon
На сайте с 01.04.2006
Offline
127
#3
kruto:
такой модуль не установлен. Выходит с помощью установленных никак нельзя отправить почту?

если smtp-сервер настроен так, что не принимает plain password, то нет.

Можно установить самостоятельно вышеуказанный модуль в свою локальную директорию, а в начале скрипта прописать строчку

use lib '/path_to_my_lib';
kruto:
так вот проблема в том, что отсылает рандомное число писем от 50 до 300 а потом останавливается. Потом сутки выдает Can't CONNECT
В чем может быть проблема. Хостеер клянется, что ограничений на письма нету. может я не так отсылаю?

Надо разбираться с владельцем почтового сервера, имхо, или таймаут выставить побольше для начала

kruto
На сайте с 26.10.2007
Offline
12
#4

Установил одуль Net::SMTP_auth, проблема с авторизацией решилась.

Но происходит то же что и при авторизации через POP3 - перестают отправлятся письма.

Сейчас код такой:

my $smtp = Net::SMTP_auth->new('***');

$smtp->auth('LOGIN', '***', '***');

$smtp->mail("$from"); # Указываем от кого письмо.

$smtp->to("$email_array[$i]"); # Указываем кому письмо.

$smtp->data(); # Начинаем посылку данных

$smtp->datasend("To: $email_array[$i] \n"); # Указываем информацию для поля "Кому"

$smtp->datasend("From: $from \n"); # Пустая строка

$smtp->datasend("Subject: $title_mail \n"); # Сообщение

$smtp->datasend("$text_mail \n"); # Сообщение

$smtp->dataend(); # Заканчиваем посылку даных

$smtp->quit;

сначало отсылается нормально, через некоторое количество писем начинается вот такая ошибка:

Can't call method "auth" on an undefined value at rassilka.pl line 62.

Отсылаю через SMTP своего хостинга. Выходит это хостер блокирует?

S
На сайте с 09.10.2007
Offline
186
#5

судя по всему - да

Удобная панель для доменных имен (http://panel.started.ru/) с массовыми операциями. Индивидуальные цены по запросу.
kruto
На сайте с 26.10.2007
Offline
12
#6

Но через браузер с этого же ящика письма нормально доходят. Можно как-то обойти блокировку?

bbon
На сайте с 01.04.2006
Offline
127
#7

У меня встречный вопрос - методы my $smtp = Net::SMTP_auth->new('***'); и $smtp->quit;

вызываются при отправке каждого письма?

Другими словами - письма отправляются в течение дня или вся пачка писем на момент отправки подготовлена? Во втором случае можно произвести разовый коннект, в цикле отправлять данные и посмотреть как отреагирует сервак.

kruto
На сайте с 26.10.2007
Offline
12
#8
bbon:
У меня встречный вопрос - методы my $smtp = Net::SMTP_auth->new('***'); и $smtp->quit;
вызываются при отправке каждого письма?
Другими словами - письма отправляются в течение дня или вся пачка писем на момент отправки подготовлена? Во втором случае можно произвести разовый коннект, в цикле отправлять данные и посмотреть как отреагирует сервак.

Письма рассылаются пачкой. Авторизацию и выход делаю на каждом письме.

Спасибо за совет, попробую после авторизации отправлять сразу сотню писем.

kruto добавил 19.03.2008 в 13:46

bbon, Вы оказались правы! Если один раз логиниться и потом отправлять по 100 писем, то все нормально. Спасибо.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий