2015-03-31 3 views
0

У меня есть сценарий Perl для отправки электронной почты:Net :: SMTP зависает на определенном сервере

#!/usr/bin/perl 

use strict; 
use warnings; 

use Email::Sender::Simple qw(sendmail); 
use Email::Sender::Transport::SMTP(); 
use Email::Simple(); 
use Email::Simple::Creator(); 

my $smtpserver = 'server.com'; 
my $smtpport = 2525; 
my $smtpuser = '[email protected]'; 
my $smtppassword = 'secret'; 

my $transport = Email::Sender::Transport::SMTP->new({ 
    host => $smtpserver, 
    port => $smtpport, 
    sasl_username => $smtpuser, 
    sasl_password => $smtppassword, 
    debug => 1, 
}); 

my $email = Email::Simple->create(
    header => [ 
    To  => '[email protected]', 
    From => "User name <$smtpuser>", 
    Subject => 'Hello', 
    ], 
    body => "This is my message\n", 
); 

sendmail($email, { transport => $transport }); 

Он работает на одном сервере. Но по другому скрипт замораживается. Отладочные сообщения:

Net::SMTP>>> Net::SMTP(2.31) 
Net::SMTP>>> Net::Cmd(2.29) 
Net::SMTP>>>  Exporter(5.63) 
Net::SMTP>>> IO::Socket::INET(1.31) 
Net::SMTP>>>  IO::Socket(1.31) 
Net::SMTP>>>  IO::Handle(1.28) 

Что случилось? Как отлаживать?

ответ

2

Это происходит, если TCP-соединение с сервером было успешно установлено, но сервер не отправляет ожидаемое приветствие SMTP. Это может иметь несколько причин, например:

  • Сервер не является сервером SMTP вообще. Если вы попытаетесь использовать Net :: SMTP для веб-сервера (например, HTTP), вы увидите аналогичный результат, потому что HTTP-сервер ожидает, что клиент сначала отправит данные, тогда как с SMTP сервер сначала отправит данные.
  • Сервер имеет неявный TLS настроенный, то есть он ждет, чтобы клиент соединился с TLS, а не с простым SMTP. В этом случае сервер ждет, когда клиент начнет с квитирования TLS (т. Е. Отправьте ClientHello) перед отправкой чего-либо обратно.

Я бы предложил вам посмотреть конфигурацию сервера, чтобы увидеть, что на самом деле ожидается.

+0

Сервер, безусловно, является SMTP-сервером. Я подключился к нему с моей локальной машины. Но когда я говорю: «helo server.com », он отвечает. Когда я подключаюсь к этому SMTP-серверу с другого сервера, он не отвечает. – user4035

+0

Из этого описания я бы предположил, что проблема на стороне сервера тогда. Возможно, сервер выполнит обратный поиск DNS для IP-клиента, который затем истекает. Или он будет проверять некоторые блокировки в реальном времени. Или есть спам-программа или аналогичная программа, которая дросселирует соединение с неизвестными клиентами. Трудно сказать без информации о сервере, но я бы не стал рассматривать проблему Perl или Net :: SMTP. –

Смежные вопросы