Как использовать perl для SMTP-соединения с пользователем и аутентификацией SSL и отправлять электронные письма с вложением

Я использую почтовый сервер SMTP, который требует аутентификации пользователя + ssl для подключения. Я ищу модули perl для подключения к почтовому серверу и отправки электронных писем, но не нашел ничего полезного.

Любое предложение по Perl-модулю или любому Perl-коду будет очень признательно.

РЕДАКТИРОВАТЬ

Я пытался использовать Mail::Sendmail и Net::SMTP::SSL для подключения к серверу sendmail и отправки почты. Ниже приведен пример кода, но пользователь с ошибкой неизвестен.

Ошибка:

mail: Net::SMTP::SSL=GLOB(0x9599850) not found 
RCPT TO: error (550 5.1.1 <[email protected]>... User unknown).

Код:

#!/usr/bin/perl

use strict;
use warnings;
use Mail::Sendmail;
use Net::SMTP::SSL;

my %mail = (
From=> '[email protected]',
To=> '[email protected]',
# Cc will appear in the header. (Bcc will not)
Subject => 'Test message',
'X-Mailer' => "Mail::Sendmail version $Mail::Sendmail::VERSION",
);

$mail{Smtp} = Net::SMTP::SSL->new("mail.server.com", Port=> 465, Debug=>1);
$mail{auth} = {user=>'username', password=>"password", required=>1 };
$mail{'X-custom'} = 'My custom additionnal header';
$mail{Message} = "The message key looks terrible, but works.";
# cheat on the date:
$mail{Date} = Mail::Sendmail::time_to_date( time() - 86400 );
if (sendmail %mail) { print "Mail sent OK.\n" }
else { print "Error sending mail: $Mail::Sendmail::error \n" }

print "\n\$Mail::Sendmail::log says:\n", $Mail::Sendmail::log;

person Space    schedule 06.04.2010    source источник
comment
Судя по комментарию, вы попробовали Net::SMTP::SSL и получили ошибки. Можете ли вы сократить свой код до минимального примера, который показывает ошибку? Это сделало бы helpiing намного проще.   -  person lexu    schedule 06.04.2010
comment
@lexu: я добавил свой код. Любые предложения, пожалуйста.   -  person Space    schedule 07.04.2010
comment
Вы все еще получаете эту ошибку «неизвестный пользователь» или нет? Если нет, то исходный вопрос необходимо отредактировать повторно, поскольку теперь вы хотите отправить почту + вложение с использованием Perl и SSL. В нынешнем виде вы вряд ли получите больше отзывов в противном случае.   -  person lexu    schedule 13.04.2010


Ответы (5)


Я предполагаю, что вы проверили данные в этой строке:

$mail{auth} = {user=>'username', password=>"password", required=>1 };

является ли пользователь «имя пользователя» (в вашем реальном коде «[email protected]»?) с паролем «пароль», известным на mail.server.com?

Если нет, я бы ожидал ошибки User unknown.


EDIT1 Я только что увидел, что у вас нет "Кому" в этом письме, "только" копия, возможно, вашему почтовому серверу это не нравится (мой не возражал, так что тогда :-), или что «произошло» при сокращении кода?


EDIT2 Мне удалось воспроизвести вашу ошибку, заменив строку

$mail{Smtp} = Net::SMTP::SSL->new("mail.server.com", Port=> 465);

с участием

$mail{Smtp} = Net::SMTP::SSL->new("smtp.mail.com", Port=> 465);

вам нужно указать почтовый сервер действительный адрес для отправки сообщения! Когда я указал существующий адрес (строка Cc=>'[email protected]' .. это сработало!

person lexu    schedule 12.04.2010
comment
@lexu: это не так. Мои логин и пароль известны почтовому серверу, и я могу подключиться с помощью других почтовых клиентов. - person Space; 13.04.2010
comment
@Осьминог: странно! Я посмотрю, смогу ли я заставить ваш код работать на меня! - person lexu; 13.04.2010
comment
Спасибо, Лексу: Это будет большим подспорьем для меня. - person Space; 13.04.2010
comment
Я попробовал ваш код, заменив почтовый сервер, идентификатор пользователя и пароль своими известными учетными данными ... и это сработало! Глядя на порт 465, кажется, что это неправильно! - person lexu; 13.04.2010
comment
@Octopus: отчет 465: =› нет, ошибка была в моей памяти! На вашем целевом сервере запущен обмен? В этом случае вам, возможно, придется использовать Net::SMTP::TLS (я предполагаю, я не могу это проверить и не имею опыта обмена) - person lexu; 13.04.2010
comment
Я ничего не знаю о почтовых серверах. Я использую порт 465 с аутентификацией SSL. Кроме того, я не сделал никаких настроек для моего локального sendmail (сервис sendmail даже не запущен). это тоже требуется. - person Space; 13.04.2010
comment
@Octopus: Sendmail — это программа, вызываемая по запросу, а не служба (Linux/Mac, если предположить, что то же самое для Windows). Нет проблем. - person lexu; 13.04.2010
comment
@Octopus: см. редактирование ответа выше! Необходимо попробовать с действительным получателем! - person lexu; 13.04.2010
comment
Спасибо, Лексу, я отредактировал свой вопрос с рабочим кодом. Не могли бы вы также посоветовать, как я могу отправить вложение с этим. Очень ценю любой образец кода Perl. - person Space; 13.04.2010

Такие вещи следует искать на search.cpan.org с такими терминами, как "SMTP" и "SSL". Первым хитом является Net::SMTP::SSL, который описывает себя как замену стандартного Net::SMTP. Это звучит очень актуально; он делает то, что вы хотите?

person Kilian Foth    schedule 06.04.2010
comment
Спасибо, я пробовал использовать эти модули, но письма не доставляются. Я получаю сообщение об ошибке Ошибка отправки почты: Net::SMTP::SSL=GLOB(0x9599850) не найдено RCPT TO: ошибка (550 5.1.1 ‹[email protected]›... Пользователь неизвестен). Любое предложение. - person Space; 06.04.2010

Возможно, вы можете попробовать Net::SMTP::SSL для подключения через аутентификацию SSL и Net::SMTP::Multipart для поддержки вложений и сделать что-нибудь, чтобы заставить их работать вместе.

person Mike    schedule 06.04.2010

Comcast перешел на SSMTP, поэтому мне пришлось изменить свое автоматическое сообщение.

Вот некоторый рабочий код PERL для почтового сервера Comcast. Надеюсь, вы найдете это полезным.

#!/usr/bin/perl

use Net::SMTP::SSL;
use MIME::Base64;


$uptime = `uptime`;

$smtp = Net::SMTP::SSL->new
        (
        "smtp.comcast.net",
        Hello => myhost.comcast.net,
        Port => 465,
        Timeout => 30,
        Debug => 0,
        );
$smtp->datasend ("AUTH LOGIN\n");
$smtp->response();

# Mailbox info
$smtp->datasend (encode_base64('myuserid')); #username
$smtp->response();
$smtp->datasend (encode_base64('mypassword')); # password
$smtp->response();

# Email from
$smtp->mail ('[email protected]');

# Email to
$smtp->to ('[email protected]');

$smtp->data();

$smtp->datasend("To: [email protected]\n");
$smtp->datasend("From: myuserid\@comcast.net\n");
$smtp->datasend("Subject: My Subject Line");

# Line break to separate headers from body
$smtp->datasend("\n");


$smtp->datasend("Uptime Report - At $uptime\n");
$smtp->dataend();

$smtp->quit();

exit;
person mrbill    schedule 02.04.2013

Ошибка, которую вы получаете, является ошибкой RCPT TO, а не ошибкой аутентификации. Это может быть связано с тем, что вы на самом деле пытались отправить почту несуществующему пользователю или потому, что вы пытались ретранслировать через сервер без аутентификации.

Если кажется, что Mail::Sendmail не поддерживает метод аутентификации SMTP ( http://metacpan.org/pod/Mail::Sendmail#LIMITATIONS ), так что, скорее всего, аутентификация даже не проводилась.

Вы должны использовать метод аутентификации Net::SMTP:SSL сразу после создания его экземпляра:

$mail{Smtp}->auth('username','password');
person Mihai    schedule 13.04.2010