it-swarm.com.de

Senden von E-Mails über SMTP in Perl

Ich versuche, Mail per SMTP in Perl zu senden. 

Ich habe ein Skript dafür geschrieben. 

#!Perl
use warnings;
use strict;
use Net::SMTP;

my $smtpserver = 'server';
my $smtpport = 25;
my $smtpuser   = 'username';
my $smtppassword = 'password';

my $smtp = Net::SMTP->new($smtpserver, Port=>$smtpport, Timeout => 10, Debug => 1);
die "Could not connect to server!\n" unless $smtp;

$smtp->auth($smtpuser, $smtppassword);
$smtp->to('[email protected]');
$smtp->data();
$smtp->datasend("To: mymail\@gmail.com\n");
$smtp->quit;

Wenn ich dieses Skript ausführe, sieht meine Ausgabe folgendermaßen aus:

Net::SMTP>>> Net::SMTP(2.31)
Net::SMTP>>>   Net::Cmd(2.29)
Net::SMTP>>>     Exporter(5.65)
Net::SMTP>>>   IO::Socket::INET(1.31)
Net::SMTP>>>     IO::Socket(1.32)
Net::SMTP>>>       IO::Handle(1.31)
Net::SMTP=GLOB(0x273faf0)<<< 220 server GMX Mailservices E
Net::SMTP=GLOB(0x273faf0)>>> EHLO localhost.localdomain
Net::SMTP=GLOB(0x273faf0)<<< 250-server GMX Mailservices
Net::SMTP=GLOB(0x273faf0)<<< 250-8BITMIME
Net::SMTP=GLOB(0x273faf0)<<< 250-ENHANCEDSTATUSCODES
Net::SMTP=GLOB(0x273faf0)<<< 250-SIZE
Net::SMTP=GLOB(0x273faf0)<<< 250-AUTH=LOGIN PLAIN
Net::SMTP=GLOB(0x273faf0)<<< 250-AUTH LOGIN PLAIN
Net::SMTP=GLOB(0x273faf0)<<< 250 STARTTLS
Net::SMTP=GLOB(0x273faf0)>>> RCPT TO:<[email protected]>
Net::SMTP=GLOB(0x273faf0)<<< 503 5.5.1 MAIL first {mp-eu001}
Net::SMTP=GLOB(0x273faf0)>>> DATA
Net::SMTP=GLOB(0x273faf0)<<< 503 5.5.1 MAIL first {mp-eu001}
Net::SMTP=GLOB(0x273faf0)>>> To: [email protected]
Net::SMTP=GLOB(0x273faf0)>>> .
Net::SMTP=GLOB(0x273faf0)<<< 502 5.5.2 Unimplemented {mp-eu001}
Net::SMTP=GLOB(0x273faf0)>>> QUIT
Net::SMTP=GLOB(0x273faf0)<<< 502 5.5.2 Unimplemented {mp-eu001}

Ich habe nicht genügend Informationen zu Perl und SMTP, daher konnte ich diesen Fehler nicht verstehen.

Wie kann ich das lösen?

17
Selin

Sie müssen eine SMTP-Sitzung (ggf. nach Autorisierung) mit einem MAIL-Befehl starten, der die E-Mail-Adresse des Absenders enthält. Deshalb sagen die Antworten "MAIL first" (5xx ist eine Fehlerantwort). So:

$smtp->auth($smtpuser, $smtppassword);
$smtp->mail('[email protected]');
$smtp->to('[email protected]');

Wenn Sie jedoch kein SMTP-Experte sind, können Sie ein übergeordnetes Modul wie Email :: Sender anstelle des Low-Level Net :: SMTP verwenden.

use strict;
use warnings;

use Email::Sender::Simple qw(sendmail);
use Email::Sender::Transport::SMTP ();
use Email::Simple ();
use Email::Simple::Creator ();

my $smtpserver = 'server';
my $smtpport = 25;
my $smtpuser   = 'username';
my $smtppassword = 'password';

my $transport = Email::Sender::Transport::SMTP->new({
  Host => $smtpserver,
  port => $smtpport,
  sasl_username => $smtpuser,
  sasl_password => $smtppassword,
});

my $email = Email::Simple->create(
  header => [
    To      => '[email protected]',
    From    => '[email protected]',
    Subject => 'Hi!',
  ],
  body => "This is my message\n",
);

sendmail($email, { transport => $transport });
26
cjm

Hier ist eine aktualisierte Version des Skripts von cjm, das derzeit mit Google Mail unter Verwendung von STARTTLS funktioniert (nicht mit anderen SMTP-Diensten getestet) Es verwendet Email :: Sender :: Transport :: SMTPS anstelle von Email :: Sender :: Transport :: SMTP

Für Ihr Google Mail-Konto muss "Zugriff für weniger sichere Apps" zulässig sein ("aktiviert"). Wobei "weniger sicher" nicht unverschlüsselt bedeutet, es scheint nur zu bedeuten, dass OAuth 2.0 nicht verwendet wird 

use strict;
use warnings;

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

my $smtpserver = 'smtp.gmail.com';
my $smtpport = 587;
my $smtpuser   = '[email protected]';
my $smtppassword = 'password';

my $transport = Email::Sender::Transport::SMTPS->new({
  Host => $smtpserver,
  ssl  => 'starttls',
  port => $smtpport,
  sasl_username => $smtpuser,
  sasl_password => $smtppassword,
  debug => 1,
});


my $email = Email::Simple->create(
  header => [
    To      => '[email protected]',
    From    => '[email protected]',
    Subject => 'Hi!',
  ],
  body => "This is my message\n",
);

sendmail($email, { transport => $transport });
6
Michael Johnson

Es beschwert sich über das Fehlen eines MAIL FROM:-SMTP-Befehls. Ohne auf eine Dokumentation zu schauen, würde ich vermuten, dass es so aussieht wie $smtp->from('[email protected]') Wie @cjm schreibt, brauchen Sie $smtp->mail('[email protected]');

Zugegeben, es scheint ein bisschen dumm zu sein, einen Benutzernamen angeben zu müssen, nachdem Sie sich gerade authentifiziert haben, aber es ist aus historischer Sicht und aus Gründen der Rückwärtskompatibilität sinnvoll (die STARTTLS ESMTP-Spezifikation kann nur angeben, was Sie zur Authentifizierung tun müssen) Der Rest der Sitzung erfolgt wie bei normalem SMTP, nachdem die Authentifizierung abgeschlossen ist. Es wäre jedoch sinnvoll, dass Net::SMTP Sie vor diesen Implementierungsdetails abschirmt.

1
tripleee

Leider schlägt Net :: SMTP :: SSL in (sehr) Ende 2014 1 von 1 Installationstests fehl, weshalb gmail (und andere) webbasierte Server nicht erreichbar sind. Ohne einen eigenen Mail-Server zu installieren, kann ich E-Mails von Perl nur über OLE an Outlook senden. Outlook verwendet dann seine Verbindungen, um Dinge zu ermöglichen.

Ich hoffe, jemand kann mich falsch beweisen. 

0
Mike

Für E-Mail-Dienste, die STARTTLS verwenden, empfiehlt es sich, das neuere Modul NET :: SMTPS zu verwenden. Versuchen Sie den folgenden Code:

my $msg = MIME::Lite ->new (  
From => '[email protected]',
To => '[email protected]',
Subject => 'Test Message',
Data => 'This is a test',
Type => 'text/html'
);

my $USERNAME = '[email protected]';
my $PASSWORD = 'abc123'; 

my $smtps = Net::SMTPS->new("smtp.mail.att.net", Port => 587,  doSSL => 'starttls', SSL_version=>'TLSv1');

$smtps->auth ( $USERNAME, $PASSWORD ) or die("Could not authenticate with bellsouth.\n");

$smtps ->mail('[email protected]');
$smtps->to('[email protected]');
$smtps->data();
$smtps->datasend( $msg->as_string() );  
$smtps->dataend();  
$smtps->quit;
0
Morey

Übrigens - wenn auch etwas spät, sowieso für zukünftige Leser. Haben Sie die Mail tatsächlich erhalten?

Es sind keine Fehler in der angehängten Ausgabe vorhanden. Sie haben Debug (Debug => 1) in Ihrem Konstruktor aktiviert. Diese Nachrichten werden gelöscht, sobald Sie den Wert auf 0 gesetzt haben. Der Vorteil der Verwendung von SMTP besteht darin, dass es in der Standardinstallation enthalten ist. Es müssen keine Module hinzugefügt werden. 

0
RB1987