Beat: Perl Net::Smtp Auth Login Verfahren

Beitrag lesen

Hallo.

Dies ist eine Lösungsbeschreibung für ein Problem, das mich die letzten zwei Tage beschäftigt hat.

Tags: SMTP, AUTH LOGIN, PASSWORD, USERNAME, FORMMAILER, NET::SMTP

Problembeschreibung:

Der MailClient, in diesem Fall Perls Net::Smtp befindet sich auf dem localen PC.
Der Smtp-Server befindet sich jedoch auf einem fernen Server.
Viele Mailprovider akzeptieren den Versand von Mails nur, wenn der Mailclient sich beim Server authentifiziert.

Das Problem jedoch ist, wie hat das zu geschehen?
Eine Anwendung der Methode
smtp->auth( 'USERNAME', 'PASSWORD' )
wird unter Umständen scheitern.
Keine Dokumentation im Netz beschreibt dies.
Auf dieser Seite jedoch
http://www.go4expert.com/forums/showthread.php?t=2556
wurde ich auf die Lösung aufmerksam. (mein Dank an den dortigen Poster)

In meinem Fall hat es ebenfalls geholfen, USERNAME und PASSWORD vorher base64 zu encoden.
Der Trick besteht darin, nicht smtp->auth zu verwenden, sondern in drei Schritten die Information AUTH LOGIN, USERNAME, PASSWORD zu übermitteln.

Hier folgen relevante Scriptauszüge sowie die zugehörige Debugging Info, erzeugt durch Net::Smtp.
Möge es anderen helfen.

  
use warnings;  
use strict;  
use MIME::Base64;  
use Net::SMTP;  
  
#....  
  
my $smtp = Net::SMTP->new(  
	Host => 'smtp.server.domain',  
	Hello => 'sender@mail.domain',  
	Timeout => 10,  
		Debug =>1,  
) or die "Keine Connetion";  
  
# Hier der Trick. Kein smtp->auth() sondern:  
  
$smtp->datasend("AUTH LOGIN\n") or die 'auth login';  
$smtp->response();  
  
$smtp->datasend( encode_base64('USERNAME') ) or die 'username';  
$smtp->response();  
  
$smtp->datasend(encode_base64('PASSWORD') ) or die 'password';  
$smtp->response();  
  
# Hier geht es wie gewohnt weiter.  
  
$smtp->mail( 'sender@mail.domain' ) or die '$smtp->mail';  
$smtp->to( 'recipient@mail.domain' ) or die '$smtp->to';  
$smtp->data();  
$smtp->datasend( $mail );  
$smtp->datasend("\n");  
$smtp->dataend();  
$smtp->quit;  

Debugging Info
Hinweise Daten wurden [ANONYMISIERT]
...
Net::SMTP=GLOB(0x1a6c69c)<<< 220 [SERVICENAME]
Net::SMTP=GLOB(0x1a6c69c)>>> EHLO smtp.server.domain
Net::SMTP=GLOB(0x1a6c69c)<<< 250-service domaine
Net::SMTP=GLOB(0x1a6c69c)<<< 250-PIPELINING
Net::SMTP=GLOB(0x1a6c69c)<<< 250-SIZE 20240000
Net::SMTP=GLOB(0x1a6c69c)<<< 250-ETRN
Net::SMTP=GLOB(0x1a6c69c)<<< 250-AUTH PLAIN LOGIN
Net::SMTP=GLOB(0x1a6c69c)<<< 250-AUTH=PLAIN LOGIN
Net::SMTP=GLOB(0x1a6c69c)<<< 250-ENHANCEDSTATUSCODES
Net::SMTP=GLOB(0x1a6c69c)<<< 250-8BITMIME
Net::SMTP=GLOB(0x1a6c69c)<<< 250 DSN
Net::SMTP=GLOB(0x1a6c69c)>>> AUTH LOGIN
Net::SMTP=GLOB(0x1a6c69c)<<< 334 [Base64String]
Net::SMTP=GLOB(0x1a6c69c)>>> [BASE64EncodedUSERNAM]==
Net::SMTP=GLOB(0x1a6c69c)<<< 334 [Base64String]
Net::SMTP=GLOB(0x1a6c69c)>>> [BASE64EncodedPASSWORD]=
Net::SMTP=GLOB(0x1a6c69c)<<< 235 2.0.0 Authentication successful
Net::SMTP=GLOB(0x1a6c69c)>>> .
Net::SMTP=GLOB(0x1a6c69c)<<< 502 5.5.2 Error: command not recognized
Net::SMTP=GLOB(0x1a6c69c)>>> MAIL FROM:sender@mail.domain
Net::SMTP=GLOB(0x1a6c69c)<<< 250 2.1.0 Ok
Net::SMTP=GLOB(0x1a6c69c)>>> RCPT TO:recipient@mail.domain
Net::SMTP=GLOB(0x1a6c69c)<<< 250 2.1.5 Ok
Net::SMTP=GLOB(0x1a6c69c)>>> DATA
Net::SMTP=GLOB(0x1a6c69c)<<< 354 End data with <CR><LF>.<CR><LF>
Net::SMTP=GLOB(0x1a6c69c)>>> From: sender@mail.domain
Net::SMTP=GLOB(0x1a6c69c)>>> To: recipient@mail.domain
Net::SMTP=GLOB(0x1a6c69c)>>> Subject: Dies ist ein Test
Net::SMTP=GLOB(0x1a6c69c)>>> Content-Type: text/plain; charset=utf-8
Net::SMTP=GLOB(0x1a6c69c)>>>
Net::SMTP=GLOB(0x1a6c69c)>>>
Net::SMTP=GLOB(0x1a6c69c)>>> Dies ist der Mailtext
Net::SMTP=GLOB(0x1a6c69c)>>> .
Net::SMTP=GLOB(0x1a6c69c)<<< 250 2.0.0 Ok: queued as A61BE28123
Net::SMTP=GLOB(0x1a6c69c)>>> QUIT
Net::SMTP=GLOB(0x1a6c69c)<<< 221 2.0.0 Bye

mfg Beat

--
><o(((°>           ><o(((°>
   <°)))o><                     ><o(((°>o
Der Valigator leibt diese Fische