Come usare perl per la connessione SMTP con utente e SSL Auth e inviare email con allegati
-
24-09-2019 - |
Domanda
Sto usando un server di posta SMTP che richiede l'autenticazione SSL + utente per la connessione. Sto cercando i moduli Perl per la connessione ai server e inviare e-mail di posta elettronica, ma non ho trovato nulla di utile.
Ogni suggerimento per il modulo Perl o qualsiasi codice Perl sarebbe molto apprezzato.
Modifica
Ho cercato di utilizzare Mail :: Sendmail e Net :: SMTP :: SSL per connettersi al server e di invio di posta sendmail. Di seguito è riportato il codice di esempio, ma ricevendo l'utente sconosciuto errore.
Errore:
mail: Net::SMTP::SSL=GLOB(0x9599850) not found
RCPT TO: error (550 5.1.1 <user@mail.com>... User unknown).
Codice:
#!/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;
Soluzione
Suppongo si verificato i dati in questa linea:
$mail{auth} = {user=>'username', password=>"password", required=>1 };
è il 'nome utente' utente (nel codice reallife 'user@mail.com'?) Con la password 'password' noto a mail.server.com?
In caso contrario, mi sarei aspettato un errore di User unknown
.
EDIT1 Ho appena visto che non vi interessa avere 'A' a che la posta, 'solo' un cc, potrebbe il server di posta non è così (il mio non ha mente, così allora :-), o ha fatto quel 'accadere' nel taglio verso il basso il codice?
EDIT2 Sono stato in grado di riprodurre l'errore sostituendo la riga
$mail{Smtp} = Net::SMTP::SSL->new("mail.server.com", Port=> 465);
con
$mail{Smtp} = Net::SMTP::SSL->new("smtp.mail.com", Port=> 465);
è necessario dare l'mailserer un indirizzo valido per inviare il messaggio a! Quando ho fornito uno già esistente per l'indirizzo (la linea Cc=>'user2@server.com'
.. ha funzionato!
Altri suggerimenti
Si dovrebbe cercare queste cose a search.cpan.org
con termini come "SMTP" e "SSL". Il primo colpo è Net::SMTP::SSL
, che si descrive come un rimpiazzo per il Net::SMTP
standard. Che suona molto rilevante; fa fare quello che vuoi?
Forse si può provare Net :: SMTP :: SSL per la connessione di oltre l'autenticazione SSL e Net :: SMTP :: Multipart per gli allegati sostegno e fare qualcosa per farli lavorare insieme.
Comcast si è trasferito a SSMTP, quindi ho dovuto modificare il mio messaggio automatico.
Ecco il codice PERL di lavoro per un server di posta Comcast. Spero che possiate trovare utile.
#!/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;
L'errore che si ottiene è un errore non RCPT TO un errore di autenticazione. Questo potrebbe essere dovuto al fatto che in realtà è tentato di inviare posta ad un utente inesistente o perché si è tentato di trasmettere attraverso il server senza autenticazione.
Se sembra Mail :: Sendmail non ha il supporto per SMTP Auth Method ( http://metacpan.org/pod/Mail::Sendmail#LIMITATIONS ) quindi molto probabilmente l'autenticazione non è stato ancora provato.
Si dovrebbe utilizzare il metodo di autenticazione di Net :: SMTP: destro SSL dopo averlo creato dell'istanza:
$mail{Smtp}->auth('username','password');