Emails in PHP via SMTP Authentication versenden

Heute kam ich durch Zufall in die Verlegenheit, mich tiefer mit Email via SMTP in PHP zu beschäftigen. Der Grund: In meiner für den Familientreff INSEL Friedrichshafen e.V. programmierten Anwendung zur Durchführung eines Basars werden auch Emails versandt. Seit einigen Tagen schien es unerklärliche Probleme mit dem Versenden von Paßwörtern zu geben. Das lief seit dem GoLive der Anwendung ohne Probleme. Und auf einmal nicht mehr?

“Kurz” zur Erläuterung des plötzlichen Problems:
Wenn sich ein Benutzer neu anmeldet, wird ihm per PHP eine Email mit Paßwort für seinen Account zugeschickt. Das geschah bisher (seit fast 2 Jahren!) einfach mit der Funktion mail(). Zusätzlich versende ich ebenfalls mittels mail() eine Email an den Administrator der Applikation – also an mich. Das dient nur zur Kontrolle, ob alles seinen geordneten Gang geht. Diese Kontroll-Emails an mich kamen auch weiterhin an. Aber neue User beteuerten immer wieder, dass sie keine Paßwortmail bekämen. Die zur Anmeldung verwendeten Emailadressen waren alle ok! Änderungen an der Anwendung habe ich seit einem Jahr nicht mehr gemacht.

Dann schob man bei all-inkl.com am 23.03. einen Wartungszyklus ein. In der Ankündigung hieß es:

… kleinere Konfigurationsarbeiten am Netzwerk sowie Tests der Netzersatzanlagen, durch Simulation eines Stromausfalls, durchgeführt. Dadurch kann es zu einer kurzen Beeinträchtigung der Erreichbarkeit Ihrer Webseiten kommen.
An den Servern selbst werden keine Änderungen durchgeführt. Ihre Webseiten sind im Anschluss an die Wartungsarbeiten wieder wie gewohnt verfügbar.

Interessant, dass die Emailprobleme genau danach anfingen.

Hier muss ich wirklich all-inkl einen Vorwurf machen. Es wurden sehrwohl Änderungen am Server durchgeführt: nämlich der authentifizierte SMTP-Mailversand aktiviert. Sprich: Ohne Anmeldung am SMTP-Server können keine Emails nach “draußen” verschickt werden. Das war bisher definitiv nicht so!

Heute nun wurde das Problem mit dem Emails eklatant – wir befinden uns in der heißen Phase der Vorbereitung für den Frühjahrsbasar! Ich sah mich genötigt, dem PRoblem mehr Aufmerksamkeit zu widmen. User machen zwar immer Fehler, dass weiß ich aus vielel Supportjahren, aber statistisch gesehen ist auch da irgendwann Schluß.

Als erstes stieß ich während meiner Recherchen auf folgendes geniales Testscript zur Validierung von Emailadressen:

// include SMTP Email Validation Class
require_once('smtp_validateEmail.class.php');

// the email to validate
$email = 'user@example.com';
// an optional sender
$sender = 'user@mydomain.com';
// instantiate the class
$SMTP_Validator = new SMTP_validateEmail();
// turn on debugging if you want to view the SMTP transaction
$SMTP_Validator->debug = true;
// do the validation
$results = $SMTP_Validator->validate(array($email), $sender);
// view results
echo $email.' is '.($results[$email] ? 'valid' : 'invalid')."\n";

// send email?
if ($results[$email]) {
  //mail($email, 'Confirm Email', 'Please reply to this email to confirm', 'From:'.$sender."\r\n"); // send email
} else {
  echo 'The email addresses you entered is not valid';
}

Die Klasse gibt es hier zum Download. Den Code packte ich mir in eine PHP-Datei, beförderte diese zusammen mit der Klassendatei auf den Webspace und testete. Zusätzlich fügte ich am Ende noch besagten Mail()-Aufruf ein. Ich wollte ja sehen, ob die Mails unabhängig von der aufrufenden Anwendung versendet wurden.
Alle Email-Adresse die ich prüfte waren ok; es sei denn ich machte absichtlich Fehler rein. Rief ich das Script von themenmix.de aus auf, wurde auch die Mail via mail() verschickt. Beim Aufruf von der Familientreff-Seite aus war an dieser Stelle Ebbe. Nix kam nirgendwo an.

Hier schrieb ich den Support von all-inkl.com an und fragte mal nach. Die Antwort:

Wenn Sie die Mail über SMTP versenden möchten, muß sich das Script am SMTP Server anmelden um eine Mail versenden zu dürfen.

Ähm – mir haute es zunächst die Fragenzeichen raus. Bisher hatte ich mir darum doch nie ein Kopf machen müssen! Darum hatte ich keine Ahnung, was ich davon halten soll und wollte bereits um ein Beispielscript bitten, als mich meine weitere Recherchen auf about.com führten … Das dortige Script von Heinz Tschabitscher adaptierte ich sofort:

<?php
 require_once "Mail.php";

 $from = "Sandra Sender <sender@example.com>";
 $to = "Ramona Recipient <recipient@example.com>";
 $subject = "Hi!";
 $body = "Hi,\n\nHow are you?";

 $host = "mail.example.com";
 $username = "smtp_username";
 $password = "smtp_password";

 $headers = array ('From' => $from,
   'To' => $to,
   'Subject' => $subject);
 $smtp = Mail::factory('smtp',
   array ('host' => $host,
     'auth' => true,
     'username' => $username,
     'password' => $password));

 $mail = $smtp->send($to, $headers, $body);

 if (PEAR::isError($mail)) {
   echo("<p>" . $mail->getMessage() . "</p>");
  } else {
   echo("<p>Message successfully sent!</p>");
  }
 ?>

Ich ermittelte die SMTP-Anmeldedaten aus dem Adminbereich bei all-inkl, fügte diese an den entsprechenden Stellen ein und … es funktionierte!

Mittels dieses Scripts klappt das Versenden von Emails via SMTP Authentication problemlos. Ich musste nur noch die Funktion zum Versenden von Emails in meiner Anwendung anpassen und gut war. Jetzt klappt der Emailversand innerhalb der Basar-Applikation wieder reibungslos.

Und ich bin nebenbei ganz froh, dass ich a) das Thema PHP-Mails via SMTP Authentication auch mal abhandelt habe und b) dieses nette Prüfscript da oben gefunden habe. Das ist ziemlich nützlich!

Schreibe einen Kommentar