Использование Perl для отправки писем с удаленного сервера Mail-in-aBox

В DigitalOcean у меня есть vps с MIAB ("Mail-in-aBox") на box.emailserver.com и сервер веб-приложений на другом vps на appserver.com.

Я хочу отправлять электронные письма из веб-приложения с помощью сценария Perl.

Я использую DNS-сервер MIAB для обоих доменных имен. С сервером MIAB я могу отправлять и получать электронную почту, используя мое приложение Mac Mini «Mail», так что оно отлично работает.

Я редактировал Perl-скрипт Я обнаружил на CPAN, что пытается аутентифицировать пользователя и отправить простое электронное письмо с appserver.com, но не проходит этап аутентификации. Я получаю такую ​​ошибку:

Ошибка при отправке электронной почты: сбой AUTH: неизвестная команда: 'AUTH'

У кого-нибудь есть идеи о том, что я делаю неправильно?

Вот сценарий на сервере веб-приложений, mail.log из MIAB и то, что сценарий выводит при запуске:

#!/usr/bin/perl

use Email::Sender::Simple qw(sendmail);
use Email::Sender::Transport::SMTPS;
use Try::Tiny;

my $transport = Email::Sender::Transport::SMTPS->new(
    host => 'box.emailserver.com',
    ssl  => 'starttls',
    sasl_username => '[email protected]',
    sasl_password => 'xxxx',
    debug => 1, # or 1
);

use Email::Simple::Creator; # or other Email::
my $message = Email::Simple->create(
    header => [
        From    => '[email protected]',
        To      => '[email protected]',
        Subject => 'appserver.com perl test',
    ],
    body => 'This is the test.',
);

try {
    sendmail($message, { transport => $transport });
} catch {
    die "Error sending email: $_";
};

MIAB mail.log:

Apr 16 13:17:10 box postfix/submission/smtpd[31729]: connect from appserver.com[45.55.229.99]
Apr 16 13:17:10 box postfix/submission/smtpd[31729]: lost connection after EHLO from appserver.com[45.55.229.99]
Apr 16 13:17:10 box postfix/submission/smtpd[31729]: disconnect from appserver.com[45.55.229.99]

appserver.com вывод сценария perl

root@appserver:/usr/lib/cgi-bin# perl test6.pl
Net::SMTPS>>> Net::SMTPS(0.06)
Net::SMTPS>>> IO::Socket::IP(0.37)
Net::SMTPS>>> IO::Socket(1.38)
Net::SMTPS>>> IO::Handle(1.35)
Net::SMTPS>>> Exporter(5.72)
Net::SMTPS>>> Net::SMTP(3.10)
Net::SMTPS>>> Net::Cmd(3.10)
Net::SMTPS=GLOB(0x33b7958)<<< 220 box.emailserver.com ESMTP Hi, I'm a Mail-in-a-Box (Ubuntu/Postfix; see https://mailinabox.email/)
Net::SMTPS=GLOB(0x33b7958)>>> EHLO localhost.localdomain
Net::SMTPS=GLOB(0x33b7958)<<< 250-box.emailserver.com
Net::SMTPS=GLOB(0x33b7958)<<< 250-PIPELINING
Net::SMTPS=GLOB(0x33b7958)<<< 250-SIZE 134217728
Net::SMTPS=GLOB(0x33b7958)<<< 250-VRFY
Net::SMTPS=GLOB(0x33b7958)<<< 250-ETRN
Net::SMTPS=GLOB(0x33b7958)<<< 250-STARTTLS
Net::SMTPS=GLOB(0x33b7958)<<< 250-ENHANCEDSTATUSCODES
Net::SMTPS=GLOB(0x33b7958)<<< 250-8BITMIME
Net::SMTPS=GLOB(0x33b7958)<<< 250 DSN
Error sending email: failed AUTH: Command unknown: 'AUTH'

Trace begun at /usr/local/share/perl/5.22.1/Email/Sender/Transport/SMTPS.pm line 98
Email::Sender::Transport::SMTPS::_throw('Email::Sender::Transport::SMTPS=HASH(0x24d8b80)', 'failed AUTH', 'Net::SMTPS=GLOB(0x33b7958)') called at /usr/local/share/perl/5.22.1/Email/Sender/Transport/SMTPS.pm line 71
Email::Sender::Transport::SMTPS::smtpclient('Email::Sender::Transport::SMTPS=HASH(0x24d8b80)') called at /usr/local/share/perl/5.22.1/Email/Sender/Transport/SMTPS.pm line 107
Email::Sender::Transport::SMTPS::send_email('Email::Sender::Transport::SMTPS=HASH(0x24d8b80)', 'Email::Abstract=ARRAY(0x3023ae0)', 'HASH(0x3023ca8)') called at /usr/local/share/perl/5.22.1/Email/Sender/Role/CommonSending.pm line 45
Email::Sender::Role::CommonSending::try {...} at /usr/share/perl5/Try/Tiny.pm line 92
eval {...} at /usr/share/perl5/Try/Tiny.pm line 83
Try::Tiny::try('CODE(0x307b370)', 'Try::Tiny::Catch=REF(0x3023d38)') called at /usr/local/share/perl/5.22.1/Email/Sender/Role/CommonSending.pm line 58
Email::Sender::Role::CommonSending::send('Email::Sender::Transport::SMTPS=HASH(0x24d8b80)', 'Email::Abstract=ARRAY(0x3023ae0)', 'HASH(0x3069a30)') called at /usr/local/share/perl/5.22.1/Email/Sender/Simple.pm line 119
Email::Sender::Simple::send_email('Email::Sender::Simple', 'Email::Abstract=ARRAY(0x3023ae0)', 'HASH(0x3023cf0)') called at /usr/local/share/perl/5.22.1/Email/Sender/Role/CommonSending.pm line 45
Email::Sender::Role::CommonSending::try {...} at /usr/share/perl5/Try/Tiny.pm line 92
eval {...} at /usr/share/perl5/Try/Tiny.pm line 83
Try::Tiny::try('CODE(0x3023b58)', 'Try::Tiny::Catch=REF(0x3005228)') called at /usr/local/share/perl/5.22.1/Email/Sender/Role/CommonSending.pm line 58
Email::Sender::Role::CommonSending::send('Email::Sender::Simple', 'Email::Simple=HASH(0x3004f88)', 'HASH(0x3004ee0)') called at /usr/share/perl5/Sub/Exporter/Util.pm line 18
Sub::Exporter::Util::ANON('Email::Simple=HASH(0x3004f88)', 'HASH(0x3004ee0)') called at test6.pl line 26
main::try {...} at /usr/share/perl5/Try/Tiny.pm line 92
eval {...} at /usr/share/perl5/Try/Tiny.pm line 83
Try::Tiny::try('CODE(0x2fd50b0)', 'Try::Tiny::Catch=REF(0x2f96d08)') called at test6.pl line 29

person Bill Stephenson    schedule 17.04.2017    source источник


Ответы (2)


Net::SMTPS=GLOB(0x33b7958)<<< 220 box.emailserver.com ESMTP Hi, I'm a Mail-in-a-Box (Ubuntu/Postfix; see https://mailinabox.email/)
Net::SMTPS=GLOB(0x33b7958)>>> EHLO localhost.localdomain
Net::SMTPS=GLOB(0x33b7958)<<< 250-box.emailserver.com
Net::SMTPS=GLOB(0x33b7958)<<< 250-PIPELINING
Net::SMTPS=GLOB(0x33b7958)<<< 250-SIZE 134217728
Net::SMTPS=GLOB(0x33b7958)<<< 250-VRFY
Net::SMTPS=GLOB(0x33b7958)<<< 250-ETRN
Net::SMTPS=GLOB(0x33b7958)<<< 250-STARTTLS
Net::SMTPS=GLOB(0x33b7958)<<< 250-ENHANCEDSTATUSCODES
Net::SMTPS=GLOB(0x33b7958)<<< 250-8BITMIME
Net::SMTPS=GLOB(0x33b7958)<<< 250 DSN

Судя по выходным данным команды EHLO, сервер не поддерживает никакой аутентификации. Если бы это было так, была бы строка типа 250-AUTH LOGIN PLAIN ..., то есть строка, которая объявляет поддержку команды AUTH и показывает, какие методы аутентификации поддерживаются. Но поскольку такой строки нет, сервер не поддерживает аутентификацию.

Если вы хотите использовать аутентификацию, вам необходимо исправить это при настройке сервера. Хотя я не могу найти информации об этом в руководстве по настройке MIAB, он использует Postfix под ним, который поддерживает аутентификацию, и в Интернете есть различные учебные пособия, которые описывают этот процесс. Но любые вопросы по настройке этого сервера, вероятно, будут больше по теме на serverfault.com.

person Steffen Ullrich    schedule 17.04.2017
comment
Спасибо, Штеффен. Я прослежу это и узнаю все, что могу. - person Bill Stephenson; 17.04.2017
comment
Я обнаружил, что ответ заключался в том, чтобы добавить IP-адрес appserver.com в параметр mynetworks в /etc/postfix/main.cf, а затем запустить postfix reload - person Bill Stephenson; 18.04.2017

Ни одна из инструкций здесь или где-либо еще не сработала для меня, поэтому я создал свое собственное решение, используя Net :: SMTP. У меня Mail-In-A-Box успешно работает с Namecheap с полной поддержкой STARTTLS с использованием сценария Perl. Электронные письма проходят через папку спама Gmail, пройдя все проверки на подлинность. После того, как ваш сервер mailinabox полностью настроен, этот сценарий можно использовать для отправки электронной почты через SMTP.

#!/usr/bin/perl
use warnings;
use strict;

use Net::SMTP;
use Authen::SASL;

my $host = 'box.yoursite.com'; #server1.yoursite.com if on namecheap
my $port = 587;
my $username   = '[email protected]';
my $password = 'yourpassword';
my $sendto = '[email protected]';

my $smtp = Net::SMTP->new(
        $host,
        Port => $port,
        SSL => 0, #No SSL on initial handshake.
        Timeout => 10,
        Debug => 1
);

#Postfix has no AUTH option until STARTTLS.
$smtp->starttls();
$smtp->auth($username, $password);
$smtp->mail($username);
if ($smtp->to($sendto)) {
        $smtp->data();
        $smtp->datasend("From: $username\n");
        $smtp->datasend("To: $sendto\n");
        $smtp->datasend("Subject: Test message\n");
        $smtp->datasend("\n");
        $smtp->datasend("The test works!\n");
        $smtp->dataend();
} else {
        print "Error: ", $smtp->message();
}
$smtp->quit;

Несколько примечаний:

  • Первое квитирование EHLO необходимо выполнить без SSL (SSL=>0), и после его инициации можно будет установить соединение STARTTLS. Следовательно, это первоначальное рукопожатие EHLO не возвращает ответ 250-AUTH от сервера mailinabox, но при обновлении конструктора SMTP-соединения до STARTTLS ($smtp->starttls()) успешно возвращается 250-AUTH PLAIN LOGIN, после чего вы можете продолжить аутентификацию на SMTP-сервере обычным способом. .
  • Убедитесь, что оба модуля Net :: SMTP и Authen :: SASL cpan установлены / обновлены.
  • Я добавил IP-адрес сервера в свои сети, как описано Биллом Стивенсоном, но не счел это необходимым.
person schulwitz    schedule 18.08.2017