In den letzten Tagen habe ich viel Zeit damit verbracht meinem Webmail-Client Roundcube beizubringen E-Mails per SMTP zu versenden. Obwohl der SMTP-Server korrekt eingetragen war und auch die Anmeldeinformationen stimmten, erschien beim Versand immer nur die Fehlermeldung
SMTP Fehler (220): Die Authentisierung ist fehlgeschlagen.
Auch das Fehlerprotokoll war nicht viel aussagekräftiger:
ERROR: STARTTLS failed () ERROR: Invalid response code received from server (-1) ERROR: Invalid response code received from server (-1) SMTP Error: Authentication failure: STARTTLS failed (Code: ) in [...]/program/lib/Roundcube/rcube.php on line 1708
Dem Protokoll lässt sich zwar noch entnehmen, dass keine verschlüsselte Verbindung hergestellt werden kann – das war’s dann aber auch. Und so vielfältig wie die Ursachen dafür sein können, so vielfältig fallen auch die Ergebnisse einer Internetsuche zu diesem Thema aus. Also habe ich mich gezwungenermaßen selber schrittweise durch den Quelltext gearbeitet.
Roundcube nutzt (in Version 1.1) für den Versand über SMTP das PEAR-Modul Net_SMTP, das seinerseits wiederum Net_Socket verwendet, das für verschlüsselte Verbindungen auf die PHP Extension OpenSSL aufsetzt. Ungeschickterweise werden beim Versuch eine verschlüsselte Verbindung aufzubauen in der Funktion Net_Socket->enableCrypto() alle OpenSSL-Fehlermeldungen durch den Fehler-Kontroll-Operator @ unterdrückt:
return @stream_socket_enable_crypto($this->fp, $enabled, $type);
Entfernt man das @ vor dem Befehl, so taucht plötzlich auch eine sinnvolle Fehlermeldung im Protokoll auf:
PHP Warning: stream_socket_enable_crypto(): Peer certificate CN=`smtp.example.com' did not match expected CN=`123.45.67.89' in [...]/program/lib/Net/Socket.php on line 646
In meinem konkreten Fall lag der Fehler also darin begründet, dass der Vergleich zwischen dem im Zertifikat verwendeten Common Name (dem Hostname des SMTP-Servers) und dem erwarteten Common Name (der IP) fehlschlug. Abhilfe lässt sich durch einen entsprechenden Parameter in der Roundcube-Konfiguration schaffen, der den erwarteten Common Name setzt:
$config['smtp_conn_options'] = array(
'ssl' => array(
'peer_name' => 'smtp.example.com',
),
);
Für andere Probleme (YMMV) hilft ein Blick auf die SSL-Kontext-Optionen für PHP.
Ein Kommentar
Schreibe einen Kommentar →