569 Stimmen

Die PHP-Mail-Funktion sendet die E-Mail nicht vollständig.

Ihre Nachricht wurde gesendet!';
        } else {
            echo 'Etwas ist schief gelaufen, gehen Sie zurück und versuchen Sie es erneut!';
        }
    }
?>

Ich habe versucht, ein einfaches Mail-Formular zu erstellen. Das Formular selbst befindet sich auf meiner index.html-Seite, aber es wird an eine separate "Vielen Dank für Ihre Einsendung"-Seite, thankyou.php, gesendet, wo der obige PHP-Code eingebettet ist. Der Code wird einwandfrei übermittelt, sendet aber keine E-Mail. Wie kann ich das beheben?

4voto

user3132194 Punkte 1961

Für diejenigen, die keine externen Mail-Programme verwenden möchten und auf einem dedizierten Linux-Server mail() nutzen wollen.

Die Art und Weise, wie PHP E-Mails sendet, wird in der Datei php.ini im Abschnitt [mail function] beschrieben.

Der Parameter sendmail-path beschreibt, wie sendmail aufgerufen wird. Der Standardwert ist sendmail -t -i, also wenn Sie in der Linux-Konsole ein funktionierendes sendmail -t -i < message.txt erhalten - sind Sie fertig. Sie könnten auch mail.log hinzufügen, um zu debuggen und sicherzustellen, dass mail() wirklich aufgerufen wird.

Verschiedene MTAs können sendmail implementieren. Sie erstellen einfach einen symbolischen Link zu ihren Binärdateien unter diesem Namen. Zum Beispiel ist in Debian der Standard Postfix. Konfigurieren Sie Ihren MTA, um E-Mails zu senden, und testen Sie es von der Konsole aus mit sendmail -v -t -i < message.txt. Die Datei message.txt sollte alle Header einer Nachricht und einen Body enthalten, die Zieladresse für den Umschlag wird aus dem To:-Header genommen. Beispiel:

From: myapp@example.com
To: mymail@example.com
Subject: Testmail über sendmail.

Textkörper.

Ich bevorzuge es, ssmtp als MTA zu verwenden, weil es einfach ist und keinen Daemon mit geöffneten Ports benötigt. ssmtp eignet sich nur zum Senden von E-Mails von localhost. Es kann auch authentifizierte E-Mails über Ihr Konto bei einem öffentlichen E-Mail-Dienst senden. Installieren Sie ssmtp und bearbeiten Sie die Konfigurationsdatei /etc/ssmtp/ssmtp.conf. Um auch lokale System-E-Mails an Unix-Konten zu empfangen (zum Beispiel Benachrichtigungen an root von Cron-Jobs), konfigurieren Sie die Datei /etc/ssmtp/revaliases.

Hier ist meine Konfiguration für mein Konto bei Yandex Mail:

root=mymail@example.com
mailhub=smtp.yandex.ru:465
FromLineOverride=YES
UseTLS=YES
AuthUser=abcde@yandex.ru
AuthPass=password

4voto

Daniel Punkte 11500

Stellen Sie sicher, dass Sendmail auf Ihrem Server installiert ist.

Wenn Sie Ihren Code überprüft haben und festgestellt haben, dass dort nichts falsch ist, gehen Sie zu /var/mail und überprüfen Sie, ob dieser Ordner leer ist.

Wenn er leer ist, müssen Sie Folgendes ausführen:

sudo apt-get install sendmail

wenn Sie auf einem Ubuntu-Server sind.

4voto

TonyLuigiC Punkte 185

Dies betrifft nur eine kleine Anzahl von Benutzern, aber ich möchte es für diese kleine Gruppe dokumentiert haben. Ein Mitglied dieser kleinen Gruppe hat 6 Stunden damit verbracht, ein funktionierendes PHP-Mail-Skript zu debuggen, wegen dieses Problems.

Wenn Sie an einer Universität sind, die XAMPP von www.AceITLab.com ausführt, sollten Sie wissen, was unser Professor uns nicht gesagt hat: Die AceITLab-Firewall (nicht die Windows-Firewall) blockiert MercuryMail in XAMPP. Sie müssen einen alternativen E-Mail-Client verwenden, pear funktioniert für uns. Sie müssen an ein Gmail-Konto mit niedrigen Sicherheitseinstellungen senden.

Ja, ich weiß, dass dies für echte E-Mails nutzlos ist. Allerdings haben akademische Einstellungen und die Realität, soweit ich das sehe, oft wenig gemeinsam.

4voto

John Slegers Punkte 41127

Wenn Sie Probleme beim Versenden von E-Mails mit PHP haben, sollten Sie eine Alternative wie PHPMailer oder SwiftMailer in Betracht ziehen.

Ich verwende normalerweise SwiftMailer, wenn ich E-Mails mit PHP versenden muss.


Grundlegende Verwendung:

require 'mail/swift_required.php';

$message = Swift_Message::newInstance()
    // Der Betreff Ihrer E-Mail
    ->setSubject('Jane Doe sendet Ihnen eine Nachricht')
    // Die Absenderadresse(n)
    ->setFrom(array('jane.doe@gmail.com' => 'Jane Doe'))
    // Die Empfängeradresse(n)
    ->setTo(array('frank.stevens@gmail.com' => 'Frank Stevens'))
    // Hier geben Sie den Inhalt Ihrer E-Mail ein
    ->setBody('Neue NachrichtHier geht der Rest meiner Nachricht hin', 'text/html');

if (Swift_Mailer::newInstance(Swift_MailTransport::newInstance())->send($message)) {
    echo json_encode([
        "status" => "OK",
        "message" => 'Ihre Nachricht wurde gesendet!'
    ], JSON_PRETTY_PRINT);
} else {
    echo json_encode([
        "status" => "Fehler",
        "message" => 'Hoppla! Etwas ist schiefgelaufen!'
    ], JSON_PRETTY_PRINT);
}

Siehe die offizielle Dokumentation für weitere Informationen zur Verwendung von SwiftMailer.

2voto

Ronald P Mathews Punkte 1970

Wenn Sie diesen Code auf einem lokalen Server ausführen (d. h. auf Ihrem Computer zu Entwicklungs​​zwecken), wird er die E-Mail nicht an den Empfänger senden. Stattdessen wird er eine .txt-Datei in einem Ordner mit dem Namen mailoutput erstellen.

Falls Sie einen kostenlosen Hosting-Dienst wie 000webhost oder hostinger verwenden, deaktivieren diese Dienstanbieter die mail()-Funktion, um Missbrauch wie E-Mail-Spoofing, Spam usw. zu verhindern. Ich empfehle Ihnen daher, sich an sie zu wenden, um herauszufinden, ob sie diese Funktion unterstützen.

Wenn Sie sicher sind, dass der Dienstanbieter die mail()-Funktion unterstützt, können Sie im PHP-Handbuch weitere Informationen dazu nachschlagen.

PHP mail()

Um zu überprüfen, ob Ihr Hosting-Dienst die mail()-Funktion unterstützt, versuchen Sie diesen Code auszuführen (denken Sie daran, die Empfänger-E-Mail-Adresse zu ändern):

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X