2016-09-26 1 views
0

Ich versuche, E-Mail mit Net::SMTPS und gmail zu senden:

#! /usr/bin/env perl 

use feature qw(say); 
use strict; 
use warnings; 

use Net::SMTPS; 

my $smtp = Net::SMTPS->new(
    'smtp.gmail.com', 
    Port => 587, 
    Timeout => 20, 
    Debug => 1, 
    doSSL => 'starttls', 
); 
die "Initialization failed: $!" if !defined $smtp; 

my $sender = my $user = '[email protected]'; 
my $password = '????';  
say "Trying to authenticate.."; 
$smtp->auth($user, $password, 'LOGIN' ) or die "could not authenticate\n"; 

my $receiver = '[email protected]';  
$smtp->mail($sender); 
$smtp->to($receiver); 
$smtp->data(); 
$smtp->datasend("To: $receiver\n"); 
$smtp->datasend("From: $sender\n"); 
$smtp->datasend("Content-Type: text/html\n"); 
$smtp->datasend("Subject: Testing Net::SMTPS"); 
$smtp->datasend("\n"); 
$smtp->datasend('The body of the email'); 
$smtp->dataend(); 
$smtp->quit(); 
say "Done."; 

, wenn die Ausgabe läuft dieses Skript (Ubuntu 16.04, Perl Version 5.22.1) ist:

Net::SMTPS>>> Net::SMTPS(0.04) 
Net::SMTPS>>> IO::Socket::INET6(2.72) 
Net::SMTPS>>>  IO::Socket(1.38) 
Net::SMTPS>>>  IO::Handle(1.35) 
Net::SMTPS>>>   Exporter(5.72) 
Net::SMTPS>>> Net::SMTP(3.05) 
Net::SMTPS>>>  Net::Cmd(3.05) 
Net::SMTPS>>>  IO::Socket::IP(0.37) 
Net::SMTPS=GLOB(0x10b2dd8)<<< 220 smtp.gmail.com ESMTP x131sm3965376lff.44 - gsmtp 
Net::SMTPS=GLOB(0x10b2dd8)>>> EHLO localhost.localdomain 
Net::SMTPS=GLOB(0x10b2dd8)<<< 250-smtp.gmail.com at your service, [195.139.193.120] 
Net::SMTPS=GLOB(0x10b2dd8)<<< 250-SIZE 35882577 
Net::SMTPS=GLOB(0x10b2dd8)<<< 250-8BITMIME 
Net::SMTPS=GLOB(0x10b2dd8)<<< 250-STARTTLS 
Net::SMTPS=GLOB(0x10b2dd8)<<< 250-ENHANCEDSTATUSCODES 
Net::SMTPS=GLOB(0x10b2dd8)<<< 250-PIPELINING 
Net::SMTPS=GLOB(0x10b2dd8)<<< 250-CHUNKING 
Net::SMTPS=GLOB(0x10b2dd8)<<< 250 SMTPUTF8 
Net::SMTPS=GLOB(0x10b2dd8)>>> STARTTLS 
Net::SMTPS=GLOB(0x10b2dd8)<<< 220 2.0.0 Ready to start TLS 
Net::SMTPS=GLOB(0x10b2dd8)>>> EHLO localhost.localdomain 
Net::SMTPS=GLOB(0x10b2dd8)<<< 250-smtp.gmail.com at your service, [195.139.193.120] 
Net::SMTPS=GLOB(0x10b2dd8)<<< 250-SIZE 35882577 
Net::SMTPS=GLOB(0x10b2dd8)<<< 250-8BITMIME 
Net::SMTPS=GLOB(0x10b2dd8)<<< 250-AUTH LOGIN PLAIN XOAUTH2 PLAIN-CLIENTTOKEN OAUTHBEARER XOAUTH 
Net::SMTPS=GLOB(0x10b2dd8)<<< 250-ENHANCEDSTATUSCODES 
Net::SMTPS=GLOB(0x10b2dd8)<<< 250-PIPELINING 
Net::SMTPS=GLOB(0x10b2dd8)<<< 250-CHUNKING 
Net::SMTPS=GLOB(0x10b2dd8)<<< 250 SMTPUTF8 
Trying to authenticate.. 
Use of uninitialized value $_ in pattern match (m//) at /usr/share/perl/5.22/Net/Cmd.pm line 250. 
Use of uninitialized value in join or string at /usr/share/perl/5.22/Net/Cmd.pm line 249. 
Net::SMTPS=GLOB(0x10b2dd8)>>> AUTH 
Net::SMTPS=GLOB(0x10b2dd8)<<< 555 5.5.2 Syntax error. x131sm3965376lff.44 - gsmtp 
could not authenticate 

ich frage mich, warum ich diesen Fehler:

Use of uninitialized value $_ in pattern match (m//) at /usr/share/perl/5.22/Net/Cmd.pm line 250. 
Use of uninitialized value in join or string at /usr/share/perl/5.22/Net/Cmd.pm line 249. 

wenn sie versuchen, zu authentifizieren?

+1

Haben Sie versucht, Net :: SMTP zu verwenden? AFAIR-Versionen von Net :: SMTP über 3.0 unterstützen SMTPS und STARTLS. – AnFi

+0

@ AndrzejA.Filip Danke für die Informationen. Ich habe jetzt 'Net :: SMTP' ausprobiert und es scheitert auch bei' $ smtp-> auth ($ user, $ password) '. Dieses Mal gibt es keinen internen Syntaxfehler wie in 'Net :: SMTPS', stattdessen gibt es 'undef' zurück, was auf einen Fehler bei der Authentifizierung hinweist. Ich habe bemerkt, dass es auch eine '$ smtp-> Auth (SASL)' gibt, wo Sie stattdessen ein 'Authen :: SASL'-Objekt angeben können. Aber ich bin nicht sicher, wie man das macht, basierend auf der Dokumentation in ['Authen :: SASL :: XS'] (https://metacpan.org/pod/Authen::SASL::XS) –

Antwort

1

Versuchen Sie den folgenden Code. Ändern Sie Benutzer und Passwort.
Es verbindet sich mit SMTPS. Es scheint auf meinem Linux zu funktionieren.
Net :: SMTP erfordert $ smtp-> starttls(), um den Befehl STARTTLS auszuführen.

#!/usr/local/bin/perl 
use strict; 
use warnings; 
use utf8; 

use Net::SMTP 3.0; 
# Force use of Authen::SASL::Perl - it may fix problems with other alternatives 
use Authen::SASL qw(Perl); 

my $smtp = Net::SMTP->new(
    'smtp.gmail.com', 
    SSL=>1, 
    Timeout => 20, 
    Debug => 1, 
); 
die "Initialization failed: $!" if !defined $smtp; 

my $sender = my $user = '[email protected]'; 
my $password = '????'; 
print "Trying to authenticate.."; 
$smtp->auth($user, $password) or die "could not authenticate\n"; 

my $receiver = '[email protected]'; 
$smtp->mail($sender); 
$smtp->to($receiver); 
$smtp->data(); 
$smtp->datasend("To: $receiver\n"); 
$smtp->datasend("From: $sender\n"); 
$smtp->datasend("Content-Type: text/html\n"); 
$smtp->datasend("Subject: Testing Net::SMTP"); 
$smtp->datasend("\n"); 
$smtp->datasend('The body of the email'); 
$smtp->dataend(); 
$smtp->quit(); 
+0

Danke für den Code, aber es funktioniert nicht. Immer noch ist die Authentifizierung das Problem. Hier ist die Ausgabe, die ich bekomme: http://pastebin.com/JEMCKHNy –

+0

Meine letzte Vermutung: Versuchen Sie, die Verwendung von Authen :: SASL :: Perl -> 'verwenden Sie Authen :: SASL qw (Perl); Authen :: SASL :: Perl ist in Perl implementiert und unterstützt die Methoden 'PLAIN' und' LOGIN'. – AnFi

+0

Nochmals vielen Dank für Ihre Zeit. Mit 'Authen :: SASL :: Perl funktioniert es immer noch nicht, aber ich bekomme mehr Informationen, wenn ich versuche, mich jetzt zu authentifizieren. [Hier] (http://pastebin.com/MfUjiwkA) ist das Skript, und [hier] (http://pastebin.com/WcCWz1Fc) ist die Ausgabe. Jetzt bekomme ich die Nachricht: 'Bitte loggen Sie sich über Ihren Webbrowser ein und versuchen Sie es erneut.' Ich denke, ich muss vielleicht XOAuth2 Login verwenden, aber es scheint, dass es nicht von 'Authen :: SASL unterstützt wird. Ich bin in der Lage, [python-oauth2] (https://github.com/joestump/python-oauth2) zu verwenden, um Mail mit 'smtp.gmail.com' an Port 587 zu senden, aber ich frage mich, wie man das in Perl macht? –

Verwandte Themen