Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Подвисание при отправке почты по SMTP, При ругани сервера NET::SMTP виснет. 
:(
    Опции темы
ilya_evseev
Дата 30.12.2005, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 30.10.2004

Репутация: нет
Всего: нет



Имеется приложение ( http://www.bestpractical.com/rt/ ), которое отсылает наружу почту через Net::SMTP. Адреса получателей берутся как из базы учётных записей, так и вводятся вручную в Веб-формах. SMTP-сервер блокирует отправку на некоторые адреса. Проблема в том, что на клиентской стороне при этом всё зависает.

Вопрос: можно ли это обойти минимальными телодвижениями вокруг Net::SMTP?

Вот пример клиентской части:
Код
#!/usr/bin/perl -w
#
#  Send email via SMTP using Perl.
#

use strict;

#use Net::SMTP;
use MIME::Entity;

die "Usage: t1 --arg1 val1 --arg2=val2 ...\n\t" if ($#ARGV < 0);

our %args;
while (my $a = shift @ARGV) {
    if ($a =~ /^(.+)=(.+)$/) {
        $args{ucfirst lc $1} = $2;
    } elsif ($a =~ /^--(.+)=(.+)$/) {
        $args{ucfirst lc $1} = $2;
    } elsif ($a =~ /^--(.+)$/) {
        $args{ucfirst lc $1} = shift @ARGV or die "Missing parameter for $1\n";
    } else {
        die "Invalid parameter: $a\n";
    }
}

print "Command line arguments:\n";
while (my ($k, $v) = each %args) {
    print "$k = $v\n";
}
print "\n";

my $entity = MIME::Entity->build(
      Type =>"multipart/mixed",
      From => $args{'From'},
       Bcc => $args{'Bcc'},
        To => $args{'To'},
       Subject => $args{'Subject'},
    Precedence => 'bulk'
); 

$entity->attach(  Data => $args{'Explanation'}."\n");
if ($args{'Attach'}) {
        $entity->attach(Data => $args{'Attach'}, Type => 'message/rfc822');
}

my @mailer_args = ('smtp');
push @mailer_args, ( Server => $args{'Server'} );
push @mailer_args, ( Debug  => 1 );
    
unless ($entity->send(@mailer_args)) {
    print "Cannot send entity!\n";
}

И вот что происходит во время сессии:
Код
# /home/evseev/mime2smtp.pl [email protected] [email protected] \
subject=test_perl_smtp "explanation=Testing message at 20:55" server=mail.company.ru

Command line arguments:
Server = mail.company.ru
Subject = test_perl_smtp
Explanation = Testing message at 20:55
To = [email protected]
From = [email protected]

Net::SMTP>>> Net::SMTP(2.29)
Net::SMTP>>>   Net::Cmd(2.26)
Net::SMTP>>>     Exporter(5.58)
Net::SMTP>>>   IO::Socket::INET(1.27)
Net::SMTP>>>     IO::Socket(1.28)
Net::SMTP>>>       IO::Handle(1.24)
Net::SMTP=GLOB(0x852fe34)<<< 220 mail.company.ru ESMTP Postfix
Net::SMTP=GLOB(0x852fe34)>>> EHLO localhost.localdomain
Net::SMTP=GLOB(0x852fe34)<<< 250-mail.company.ru
Net::SMTP=GLOB(0x852fe34)<<< 250-PIPELINING
Net::SMTP=GLOB(0x852fe34)<<< 250-SIZE 20480000
Net::SMTP=GLOB(0x852fe34)<<< 250-ETRN
Net::SMTP=GLOB(0x852fe34)<<< 250 8BITMIME
Net::SMTP=GLOB(0x852fe34)>>> MAIL FROM:<[email protected]>
Net::SMTP=GLOB(0x852fe34)<<< 250 Ok
Net::SMTP=GLOB(0x852fe34)>>> RCPT TO:<[email protected]>
Net::SMTP=GLOB(0x852fe34)<<< 554 <[email protected]>: Sender address rejected: Access denied
Net::SMTP=GLOB(0x852fe34)>>> DATA
Net::SMTP=GLOB(0x852fe34)<<< 554 Error: no valid recipients
Net::SMTP=GLOB(0x852fe34)>>> Subject: test_perl_smtp
Net::SMTP=GLOB(0x852fe34)>>> MIME-Version: 1.0
Net::SMTP=GLOB(0x852fe34)>>> X-Mailer: Mail::Mailer[v1.62] Net::SMTP[v2.29]
Net::SMTP=GLOB(0x852fe34)>>> Sender: System Administrator <[email protected]>
Net::SMTP=GLOB(0x852fe34)>>> Content-Type: multipart/mixed; boundary="----------=_1135965321-22875-0"
Net::SMTP=GLOB(0x852fe34)>>> To: [email protected]
Net::SMTP=GLOB(0x852fe34)>>> Content-Transfer-Encoding: binary
Net::SMTP=GLOB(0x852fe34)>>> From: [email protected]
Net::SMTP=GLOB(0x852fe34): Broken pipe at /usr/lib/perl5/vendor_perl/Mail/Mailer/smtp.pm line 80
Net::SMTP=GLOB(0x852fe34)>>> This is a multi-part message in MIME format...
Net::SMTP=GLOB(0x852fe34): Timeout at /usr/lib/perl5/vendor_perl/Mail/Mailer/smtp.pm line 80
Net::SMTP=GLOB(0x852fe34)>>> ------------=_1135965321-22875-0
Net::SMTP=GLOB(0x852fe34): Timeout at /usr/lib/perl5/vendor_perl/Mail/Mailer/smtp.pm line 80
Net::SMTP=GLOB(0x852fe34)>>> Content-Type: text/plain
Net::SMTP=GLOB(0x852fe34)>>> Content-Disposition: inline
Net::SMTP=GLOB(0x852fe34)>>> Content-Transfer-Encoding: binary
Net::SMTP=GLOB(0x852fe34): Timeout at /usr/lib/perl5/vendor_perl/Mail/Mailer/smtp.pm line 80
Net::SMTP=GLOB(0x852fe34): Timeout at /usr/lib/perl5/vendor_perl/Mail/Mailer/smtp.pm line 80
Net::SMTP=GLOB(0x852fe34)>>> Testing message at 20:55
Net::SMTP=GLOB(0x852fe34): Timeout at /usr/lib/perl5/vendor_perl/Mail/Mailer/smtp.pm line 80
Net::SMTP=GLOB(0x852fe34): Timeout at /usr/lib/perl5/vendor_perl/Mail/Mailer/smtp.pm line 80
Net::SMTP=GLOB(0x852fe34)>>> ------------=_1135965321-22875-0--
...долго-долго ждём тайм-аута на сервере...
Net::SMTP=GLOB(0x852fe34)>>> .
Net::SMTP=GLOB(0x852fe34)<<< 221 Error: I can break rules, too. Goodbye.
Net::SMTP=GLOB(0x852fe34)>>> QUIT
#

Пример слегка упрощён, поэтому сервер ругается на имя отправителя. В реальной жизни он может ругаться на имя получателя, и хочется сделать так, чтобы перловые библиотеки как-то это обрабатывали.

Это сообщение отредактировал(а) ilya_evseev - 30.12.2005, 21:20
PM MAIL   Вверх
sharq
Дата 4.1.2006, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

Репутация: 23
Всего: 28



ilya_evseev для того, чтобы долго не подвисал, необходимо выставить свой тайм-аут при отправки.
Для того, чтобы обрабатывать ошибки при отправки, следует проверять успешно ли завершилась команда.
А ты не проверяешь, например, вот здесь у тебя ошибка
Цитата

554 <[email protected]>: Sender address rejected: Access denied

И по идеи - нужно завершить отправку и выдать соответствующее сообщение пользователю.
Но ты не проверяешь ответы сервера и продолжаешь отправлять письмо.

Так что, проверяй результаты выполнения команд!

smile

Это сообщение отредактировал(а) sharq - 4.1.2006, 18:32


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0720 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.