Я пытаюсь отправить почту, используя аутентифицированный SMTP через Perl на сервере Debian buster. Вот мой код:
use strict ;
use warnings ;
use autodie ;
use Net::SMTP; # version 3.11
use Authen::SASL;
my $smtp_server = 'smtp.example.com' ;
my $principal = 'myusername' ;
print "Password: ";
my $password = <STDIN>;
chomp($password);
my $from = '[email protected]' ;
my $to = '[email protected]' ;
my $subject = 'Test message' ;
my $body = "The body of the e-mail message.";
my $mailer = Net::SMTP->new($smtp_server, 'SSL' => 1, 'Port' => 465, 'Debug' => 1);
if (!$mailer) { die $@ ; }
if (!$mailer->auth($principal, $password)) {
warn "error authenticating; status is '" . $mailer->status() . "'\n";
warn "error authenticating; message is '" . $mailer->message() . "'\n";
exit 1;
}
Вот результат:
Password: secretsecretsecret
Net::SMTP::_SSL>>> Net::SMTP::_SSL
Net::SMTP::_SSL>>> IO::Socket::SSL(2.060)
Net::SMTP::_SSL>>> IO::Socket::IP(0.39)
Net::SMTP::_SSL>>> IO::Socket(1.39)
Net::SMTP::_SSL>>> IO::Handle(1.39)
Net::SMTP::_SSL>>> Exporter(5.73)
Net::SMTP::_SSL>>> Net::SMTP(3.11)
Net::SMTP::_SSL>>> Net::Cmd(3.11)
Net::SMTP::_SSL=GLOB(0x562cc320f080)<<< 220 smtp.example.com ESMTP Postfix
Net::SMTP::_SSL=GLOB(0x562cc320f080)>>> EHLO localhost.localdomain
Net::SMTP::_SSL=GLOB(0x562cc320f080)<<< 250-smtp.example.com
Net::SMTP::_SSL=GLOB(0x562cc320f080)<<< 250-PIPELINING
Net::SMTP::_SSL=GLOB(0x562cc320f080)<<< 250-SIZE 51200000
Net::SMTP::_SSL=GLOB(0x562cc320f080)<<< 250-ETRN
Net::SMTP::_SSL=GLOB(0x562cc320f080)<<< 250-AUTH PLAIN LOGIN GSSAPI
Net::SMTP::_SSL=GLOB(0x562cc320f080)<<< 250-ENHANCEDSTATUSCODES
Net::SMTP::_SSL=GLOB(0x562cc320f080)<<< 250-8BITMIME
Net::SMTP::_SSL=GLOB(0x562cc320f080)<<< 250-DSN
Net::SMTP::_SSL=GLOB(0x562cc320f080)<<< 250 CHUNKING
error authenticating; status is '2'
error authenticating; message is 'smtp.example.com
PIPELINING
SIZE 51200000
ETRN
AUTH PLAIN LOGIN GSSAPI
ENHANCEDSTATUSCODES
8BITMIME
DSN
CHUNKING
'
Обратите внимание, однако, что следующий код Python, работающий на том же компьютере, работает:
#!/usr/bin/python3
username = 'joeuser'
principal = 'myusername'
smtp_server = 'smtp.example.com'
import smtplib
from email.mime.text import MIMEText
from getpass import getpass
conn = smtplib.SMTP_SSL(smtp_server, 465)
password = getpass()
conn.login(principal, password)
usermail = username + '@example.com'
content="""\
Test message.
"""
msg = MIMEText(content, 'plain')
msg['Subject'] = 'Testing authenticated mail send using ' + principal
msg['From'] = usermail
conn.sendmail(usermail, usermail, msg.as_string())
Почему код Perl не работает? Это Вопрос Stackoverflow не помог. (Почему бы просто не использовать код Python? Нужный код Perl является частью более крупного проекта Perl, поэтому мне нужно отправить электронное письмо на Perl.)
No such file or directory at test.pl line 25
-- строка 25if (!$mailer->auth($principal, $password)) {...
. Отсутствующий файл кажется несовместимым с ошибкой аутентификации. Можете ли вы выполнить отладку/пошаговый ввод вauth()
, чтобы увидеть, что происходит? - person Jim Garrison   schedule 23.01.2021