Как использовать Perl для SMTP-соединения с пользователем и SSL-аутентификации и отправлять электронные письма с вложениями - PullRequest
2 голосов
/ 06 апреля 2010

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

Буду очень признателен за любые предложения для модуля perl или любого кода perl.

EDIT

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

Ошибка:

mail: Net::SMTP::SSL=GLOB(0x9599850) not found 
RCPT TO: error (550 5.1.1 <user@mail.com>... User unknown).

Код:

#!/usr/bin/perl

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

my %mail = (
From=> 'user1@server.com',
To=> 'user2@server.com',
# 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;

Ответы [ 5 ]

2 голосов
/ 13 апреля 2010

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

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

- это имя пользователя 'username' (в вашем коде reallife 'user@mail.com'?) С паролем 'password', известным вmail.server.com?

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


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


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

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

с

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

вам необходимо указать действующему адресу почтового ящика для отправки сообщения!Когда я предоставил существующий адрес (строка Cc=>'user2@server.com' .. это сработало!

0 голосов
/ 02 апреля 2013

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 ('myuserid@comcast.net');

# Email to
$smtp->to ('anyuser@gmail.com');

$smtp->data();

$smtp->datasend("To: anyuser@gmail.com\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;
0 голосов
/ 13 апреля 2010

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

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

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

$mail{Smtp}->auth('username','password');
0 голосов
/ 06 апреля 2010

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

0 голосов
/ 06 апреля 2010

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

...