PHP: SMTP-E-Mail kommt nicht an?
Hey, ich habe diesen PHP-Code für SMTP um E-Mails zu senden, aber er funktioniert nicht. Hat jemand eine Idee?
Code:
<?php
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
function sendMail($user_email, $user_name, $mailContent, $mailSubject, $emailAltBody = null) {
include BASE_PATH . 'app/notifications/mail_templates/mail_style.php';
$mail = new PHPMailer(true);
try {
$mail->SMTPDebug = 1;
$mail->isSMTP();
$mail->SMTPAuth = true;
$mail->Host = 'text';
$mail->SMTPSecure = 'ssl';
$mail->SMTPAutoTLS = true;
$mail->Username = 'text';
$mail->Password = 'text';
$mail->Port = 465;
$mail->setFrom('text', 'text');
$mail->addAddress($user_email, $user_name);
$mail->isHTML(true);
$mail->Subject = $mailSubject;
$mail->Body = $emailBody;
$mail->AltBody = $emailAltBody;
$mail->CharSet = 'utf-8';
$mail->send();
return true;
}
catch (Exception $e) {
return 'abc';
return 'Message could not be sent. Mailer Error: '.$mail->ErrorInfo;
}
}
3 Antworten
Ein Problem das Du nicht ohne € Einsatz lösen könntest, dein Copy&Screening+Paste PHP Verschnitt ist bekannt dafür dass es spamt. Deswegen landen die Mails kategorisch im Spamordner per Voreinstellung.
Versuch es mit Cold Fusion oder MS Aspx. PHP rockt aber nicht wenn man es abkupfert.
Rufst du die Funktion überhaupt irgendwo auf?
Wenn ja, wäre die nächste Frage, ob du alle Daten (Nutzername, Passwort, etc.) korrekt setzt, ob deine Webseite valide Zertifikate nutzt und ob die E-Mail überhaupt zum Mailserver geschickt wird. Hierfür wäre es notwendig, sich etwaige Fehlermeldungen und weitere Feedbacks zurückgeben zu lassen.
Das führt mich zu deinem catch-Block, dessen Inhalt du noch einmal ändern solltest.
Zum einen wird der zweite return-Befehl nie ausgeführt, da bereits das Erste den Programmfluss aus den Funktionskörper herauskatapultiert. Dabei liefert der doch eher die interessanten Informationen.
Zum anderen wäre es besser, in jedem Fall einen konsistenten Typ zurückzuliefern. Im Fehlerfall wäre der Wert false passender. Aktuell würde so eine Nutzung:
if (sendMail(/* your arguments ... */)) {
print "Success";
}
in jedem Fall den Erfolgsfall verkünden. Solche Fehler können sich schnell einschleichen.
Der bessere catch-Block würde daher so aussehen:
catch (Exception $e) {
print 'Message could not be sent. Mailer Error: '.$mail->ErrorInfo;
return false;
}
Und noch besser wäre es, wenn die Ausgabe der Fehlermeldung (zumindest die genaue Fehlerausgabe) in ein Log einfließen würde.
Innerhalb des try-Blocks wiederum würde ich das Ergebnis von send weiterleiten.
return $mail->send();
Lass dir das Ergebnis der Funktion in jedem Fall ausgeben. Nutze dafür var_dump, um zu verhindern, dass PHP die Ausgabe verfälscht.
var_dump(sendMail(/* your arguments ... */));
Wenn die E-Mail laut Angabe erfolgreich verschickt wurde, kann es wohl nur noch beim Mailserver hängen (SMTP wird nicht unterstützt / Anfrage wird blockiert / ...) oder beim Empfänger (E-Mail wird als SPAM/Junk erkannt).
Schaue in das error.log, wahrwscheinlich steht da, was der Fehler sein wird ;)