Moin!
Dies ist eine Lösungsbeschreibung für ein Problem, das mich die letzten zwei Tage beschäftigt hat.
Nun gut, du hast jetzt eine Lösung, aber die Frage ist doch: Wo ist das eigentliche Problem? Und ist deine Lösung schön[TM].
Eine Anwendung der Methode
smtp->auth( 'USERNAME', 'PASSWORD' )
wird unter Umständen scheitern.
Das liegt dann sehr wahrscheinlich daran, dass Net::SMTP einen Fehler bei der Ermittlung des gewünschten Authentifizierungsmechanismus macht, bzw. dass das Resultat der Serverauskunft, das Net::SMTP heranzieht, dem Server wieder nicht gefällt.
Der Fehler steckt also entweder in Net::SMTP oder im benutzten Mailserver.
Im ersten Fall wäre die bessere Vorgehensweise, den Fehler in Net::SMTP zu melden, evtl. gar zu beheben.
Im zweiten Fall wird man sich wünschen, das der Mailserver sich doch bitte standardgemäß verhielte, also entweder korrekt konfiguriert wird (vielleicht hat er ein Problem mit dem von Net::SMTP gewählten Authentifizierungs-Schema, weil er das zwar laut SMTP anbietet, aber nicht versteht), oder der Fehler wird gepatcht. Problem dabei ist natürlich, dass fremde Mailserver sich diesen Wünschen gerne widersetzen.
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();
Ich halte es für problematisch, ohne weitere Checks auf die Verträglichkeit der Methode einfach die Authorisationsmethode LOGIN anzuwenden, und diese auch ohne weitere Checks auf den Erfolg durchzuführen. Fehlerbehandlung sieht leicht anders aus. :)
Spannend wäre, wie erwähnt, die Antwort auf die Frage, was denn im Normalfall so auf der Leitung passiert, wenn smtp->auth() benutzt wird.
- Sven Rautenberg