Come usare perl per la connessione SMTP con utente e SSL Auth e inviare email con allegati

StackOverflow https://stackoverflow.com/questions/2583987

  •  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;
È stato utile?

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');
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top