Die PHP-Mail-Funktion schließt das Senden von E-Mails nicht ab

Jul 09 2014
<?php
    $name = $_POST['name'];
    $email = $_POST['email'];
    $message = $_POST['message'];
    $from = 'From: yoursite.com';
    $to = '[email protected]';
    $subject = 'Customer Inquiry';
    $body = "From: $name\n E-Mail: $email\n Message:\n $message";

    if ($_POST['submit']) {
        if (mail ($to, $subject, $body, $from)) {
            echo '<p>Your message has been sent!</p>';
        } else {
            echo '<p>Something went wrong, go back and try again!</p>';
        }
    }
?>

Ich habe versucht, ein einfaches E-Mail-Formular zu erstellen. Das Formular selbst befindet sich auf meiner index.htmlSeite, wird jedoch auf einer separaten Seite "Vielen Dank für Ihre Übermittlung" thankyou.phpübermittelt, auf der der obige PHP-Code eingebettet ist. Der Code wird perfekt übermittelt, sendet jedoch niemals eine E-Mail. Wie kann ich das beheben?

Antworten

533 JohnConde Jul 09 2014 at 09:21

Obwohl es Teile dieser Antwort gibt, die nur für die Verwendung der mail()Funktion selbst gelten, können viele dieser Schritte zur Fehlerbehebung auf jedes PHP-Mailing-System angewendet werden.

Es gibt verschiedene Gründe, warum Ihr Skript anscheinend keine E-Mails sendet. Es ist schwierig, diese Dinge zu diagnostizieren, es sei denn, es liegt ein offensichtlicher Syntaxfehler vor. Ohne eine müssen Sie die unten stehende Checkliste durchgehen, um mögliche Fallstricke zu finden, auf die Sie möglicherweise stoßen.

Stellen Sie sicher, dass die Fehlerberichterstattung aktiviert ist und alle Fehler gemeldet werden

Die Fehlerberichterstattung ist wichtig, um Fehler in Ihrem Code und allgemeine Fehler, auf die PHP stößt, auszurotten. Die Fehlerberichterstattung muss aktiviert sein, um diese Fehler zu erhalten. Wenn Sie den folgenden Code oben in Ihre PHP-Dateien (oder in eine Master-Konfigurationsdatei) einfügen, wird die Fehlerberichterstattung aktiviert.

error_reporting(-1);
ini_set('display_errors', 'On');
set_error_handler("var_dump");

Siehe Wie kann ich nützliche Fehlermeldungen in PHP erhalten? - diese Antwort für weitere Details dazu.

Stellen Sie sicher, dass die mail()Funktion aufgerufen wird

Es mag albern erscheinen, aber ein häufiger Fehler besteht darin, zu vergessen, die mail()Funktion tatsächlich in Ihren Code einzufügen. Stellen Sie sicher, dass es vorhanden und nicht auskommentiert ist.

Stellen Sie sicher, dass die mail()Funktion korrekt aufgerufen wird

Bool Mail (Zeichenfolge $to , string $Betreff, Zeichenfolge $message [, string $zusätzliche_Header [, Zeichenfolge $ zusätzliche_Parameter]])

Die Mail-Funktion verwendet drei erforderliche Parameter und optional einen vierten und einen fünften. Wenn Ihr Aufruf von mail()nicht mindestens drei Parameter enthält , schlägt dies fehl.

Wenn Ihr Aufruf von mail()nicht die richtigen Parameter in der richtigen Reihenfolge enthält , schlägt dies ebenfalls fehl.

Überprüfen Sie die E-Mail-Protokolle des Servers

Ihr Webserver sollte alle Versuche protokollieren, E-Mails über ihn zu senden. Der Speicherort dieser Protokolle ist unterschiedlich (möglicherweise müssen Sie Ihren Serveradministrator fragen, wo sie sich befinden). Sie befinden sich jedoch normalerweise im Stammverzeichnis eines Benutzers unter logs. Darin befinden sich Fehlermeldungen, die der Server im Zusammenhang mit Ihren Versuchen, E-Mails zu senden, gemeldet hat.

Überprüfen Sie, ob die Portverbindung fehlgeschlagen ist

Portblock ist ein sehr häufiges Problem, mit dem die meisten Entwickler bei der Integration ihres Codes zur Zustellung von E-Mails über SMTP konfrontiert sind. Dies kann leicht in den Server-Maillogs nachverfolgt werden (der Speicherort des Servers des E-Mail-Protokolls kann von Server zu Server variieren, wie oben erläutert). Wenn Sie sich auf einem gemeinsam genutzten Hosting-Server befinden, bleiben die Ports 25 und 587 standardmäßig blockiert. Dieser Block wurde absichtlich von Ihrem Hosting-Anbieter durchgeführt. Dies gilt auch für einige der dedizierten Server. Wenn diese Ports blockiert sind, versuchen Sie, eine Verbindung über Port 2525 herzustellen. Wenn Sie feststellen, dass dieser Port ebenfalls blockiert ist, wenden Sie sich an Ihren Hosting-Anbieter, um diese Ports zu entsperren.

Die meisten Hosting-Anbieter blockieren diese E-Mail-Ports, um ihr Netzwerk vor dem Versenden von Spam-E-Mails zu schützen.

Verwenden Sie die Ports 25 oder 587 für Plain / TLS-Verbindungen und Port 465 für SSL-Verbindungen. Für die meisten Benutzer wird empfohlen, Port 587 zu verwenden, um von einigen Hosting-Anbietern festgelegte Ratenbeschränkungen zu vermeiden.

Verwenden Sie nicht den Operator zur Fehlerunterdrückung

Wenn der Fehlerunterdrückung Operator @ auf einen Ausdruck in PHP vorangestellt wird, werden alle Fehlermeldungen , die von diesem Ausdruck erzeugt werden könnten , werden ignoriert. Unter bestimmten Umständen ist die Verwendung dieses Operators erforderlich, das Senden von E-Mails gehört jedoch nicht dazu.

Wenn Ihr Code enthält @mail(...), verbergen Sie möglicherweise wichtige Fehlermeldungen, die Ihnen beim Debuggen helfen. Entfernen Sie das @und prüfen Sie, ob Fehler gemeldet werden.

Es ist nur dann sinnvoll , wenn Sie mit überprüfenerror_get_last() direkt danach für konkrete Ausfälle.

Überprüfen Sie den mail()Rückgabewert

Die mail()Funktion:

Gibt zurück, TRUEwenn die Mail FALSEandernfalls erfolgreich zur Zustellung angenommen wurde . Es ist wichtig zu beachten, dass nur weil die Post zur Zustellung angenommen wurde, dies NICHT bedeutet, dass die Post tatsächlich das beabsichtigte Ziel erreicht.

Dies ist wichtig zu beachten, weil:

  • Wenn Sie einen FALSERückgabewert erhalten, wissen Sie, dass der Fehler darin liegt, dass Ihr Server Ihre E-Mails akzeptiert. Dies ist wahrscheinlich kein Codierungsproblem, sondern ein Serverkonfigurationsproblem. Sie müssen mit Ihrem Systemadministrator sprechen, um herauszufinden, warum dies geschieht.
  • Wenn Sie einen TRUERückgabewert erhalten, bedeutet dies nicht, dass Ihre E-Mail definitiv gesendet wird. Es bedeutet nur, dass die E-Mail von PHP erfolgreich an den jeweiligen Handler auf dem Server gesendet wurde. Es gibt noch weitere Fehlerquellen außerhalb der Kontrolle von PHP, die dazu führen können, dass die E-Mail nicht gesendet wird.

Dies FALSEhilft Ihnen dabei, die richtige Richtung einzuschlagen, was TRUEjedoch nicht unbedingt bedeutet, dass Ihre E-Mail erfolgreich gesendet wurde. Dies ist wichtig zu beachten!

Stellen Sie sicher, dass Ihr Hosting-Anbieter das Senden von E-Mails zulässt und das Senden von E-Mails nicht einschränkt

Viele gemeinsam genutzte Webhosts, insbesondere kostenlose Webhosting-Anbieter, erlauben entweder nicht, dass E-Mails von ihren Servern gesendet werden, oder begrenzen die Menge, die während eines bestimmten Zeitraums gesendet werden kann. Dies ist auf ihre Bemühungen zurückzuführen, Spammer daran zu hindern, ihre billigeren Dienste in Anspruch zu nehmen.

Wenn Sie der Meinung sind, dass Ihr Host E-Mail-Beschränkungen hat oder das Senden von E-Mails blockiert, überprüfen Sie die häufig gestellten Fragen (FAQs), um festzustellen, ob solche Einschränkungen aufgeführt sind. Andernfalls müssen Sie sich möglicherweise an den Support wenden, um zu überprüfen, ob beim Versenden von E-Mails Einschränkungen bestehen.

Überprüfen Sie die Spam-Ordner. Verhindern Sie, dass E-Mails als Spam gekennzeichnet werden

Aus verschiedenen Gründen landen E-Mails, die über PHP (und andere serverseitige Programmiersprachen) gesendet werden, häufig im Spam-Ordner eines Empfängers. Überprüfen Sie dort immer, bevor Sie Fehler in Ihrem Code beheben.

Um zu verhindern, dass über PHP gesendete E-Mails an den Spam-Ordner eines Empfängers gesendet werden, können Sie sowohl in Ihrem PHP-Code als auch auf andere Weise verschiedene Maßnahmen ergreifen, um die Wahrscheinlichkeit zu minimieren, dass Ihre E-Mails als Spam markiert werden. Gute Tipps von Michiel de Mare sind:

  • Verwenden Sie E-Mail-Authentifizierungsmethoden wie SPF und DKIM, um zu beweisen, dass Ihre E-Mails und Ihr Domain-Name zusammengehören, und um das Spoofing Ihres Domain-Namens zu verhindern. Die SPF-Website enthält einen Assistenten zum Generieren der DNS-Informationen für Ihre Site.
  • Überprüfen Sie Ihr Reverse-DNS , um sicherzustellen, dass die IP-Adresse Ihres Mailservers auf den Domainnamen verweist, den Sie zum Senden von E-Mails verwenden.
  • Stellen Sie sicher, dass die von Ihnen verwendete IP-Adresse nicht auf einer schwarzen Liste steht
  • Stellen Sie sicher, dass die Antwortadresse eine gültige, vorhandene Adresse ist.
  • Verwenden Sie im Feld An den vollständigen, echten Namen des Empfängers, nicht nur die E-Mail-Adresse (z "John Smith" <[email protected]>. B. ).
  • Überwachen Sie Ihre Missbrauchskonten, z. [email protected] und [email protected]. Das heißt - stellen Sie sicher, dass diese Konten vorhanden sind, lesen Sie, was an sie gesendet wurde, und reagieren Sie auf Beschwerden.
  • Schließlich machen Sie es wirklich einfach, sich abzumelden. Andernfalls werden sich Ihre Benutzer durch Drücken der Spam- Taste abmelden. Dies wirkt sich auf Ihren Ruf aus.

Siehe Wie stellen Sie sicher, dass E-Mails, die Sie programmgesteuert senden, nicht automatisch als Spam markiert werden? Weitere Informationen zu diesem Thema.

Stellen Sie sicher, dass alle Mail-Header angegeben sind

Einige Spam-Programme lehnen E-Mails ab, wenn häufig verwendete Header wie "Von" und "Antwort an" fehlen:

$headers = array("From: [email protected]",
    "Reply-To: [email protected]",
    "X-Mailer: PHP/" . PHP_VERSION
);
$headers = implode("\r\n", $headers);
mail($to, $subject, $message, $headers);

Stellen Sie sicher, dass Mail-Header keine Syntaxfehler aufweisen

Ungültige Header sind genauso schlecht wie keine Header. Ein falsches Zeichen könnte alles sein, was Sie brauchen, um Ihre E-Mail zu entgleisen. Double-Check , um sicherzustellen , Ihre Syntax korrekt ist als PHP wird nicht diese Fehler für Sie fangen.

$headers = array("From [email protected]", // missing colon
    "Reply To: [email protected]",      // missing hyphen
    "X-Mailer: "PHP"/" . PHP_VERSION      // bad quotes
);

Verwenden Sie keinen falschen From:Absender

Während die Mail einen Absender von: haben muss, dürfen Sie nicht einfach irgendeinen Wert verwenden. Insbesondere vom Benutzer angegebene Absenderadressen sind ein todsicherer Weg, um Mails zu blockieren:

$headers = array("From: $_POST[contactform_sender_email]"); // No!

Grund: Ihr Web- oder Sende-Mail-Server ist nicht SPF / DKIM-Whitelist, um vorzutäuschen, für @ hotmail- oder @ gmail-Adressen verantwortlich zu sein. Es kann sogar stillschweigend E-Mails mit From:Absenderdomänen löschen, für die es nicht konfiguriert ist.

Stellen Sie sicher, dass der Empfängerwert korrekt ist

Manchmal ist das Problem so einfach wie ein falscher Wert für den Empfänger der E-Mail. Dies kann auf die Verwendung einer falschen Variablen zurückzuführen sein.

$to = '[email protected]';
// other variables ....
mail($recipient, $subject, $message, $headers); // $recipient should be $to

Eine andere Möglichkeit, dies zu testen, besteht darin, den Empfängerwert fest in den mail()Funktionsaufruf zu codieren :

mail('[email protected]', $subject, $message, $headers); 

Dies kann für alle mail()Parameter gelten.

An mehrere Konten senden

Senden Sie Ihre E-Mail an mehrere E-Mail-Konten bei verschiedenen E-Mail-Anbietern , um Probleme mit E-Mail-Konten auszuschließen . Wenn Ihre E-Mails nicht im Google Mail-Konto eines Benutzers ankommen, senden Sie dieselben E-Mails an ein Yahoo-Konto, ein Hotmail-Konto und ein reguläres POP3-Konto (wie Ihr vom ISP bereitgestelltes E-Mail-Konto).

Wenn die E-Mails bei allen oder einigen anderen E-Mail-Konten ankommen, wissen Sie, dass Ihr Code E-Mails sendet, aber es ist wahrscheinlich, dass der E-Mail-Kontoanbieter sie aus irgendeinem Grund blockiert. Wenn die E-Mail bei keinem E-Mail-Konto ankommt, hängt das Problem eher mit Ihrem Code zusammen.

Stellen Sie sicher, dass der Code mit der Formularmethode übereinstimmt

Wenn Sie Ihre Formularmethode auf festgelegt haben POST, stellen Sie sicher, dass Sie $_POSTnach Ihren Formularwerten suchen. Wenn Sie es eingestellt haben GEToder gar nicht eingestellt haben, stellen Sie sicher, dass Sie $_GETnach Ihren Formularwerten suchen.

actionStellen Sie sicher, dass Ihr Formularwert auf die richtige Position zeigt

actionStellen Sie sicher, dass Ihr Formularattribut einen Wert enthält, der auf Ihren PHP-Mailingcode verweist.

<form action="send_email.php" method="POST">

Stellen Sie sicher, dass der Webhost das Senden von E-Mails unterstützt

Einige Webhosting-Anbieter erlauben oder aktivieren das Senden von E-Mails über ihre Server nicht. Die Gründe hierfür können unterschiedlich sein. Wenn sie jedoch das Senden von E-Mails deaktiviert haben, müssen Sie eine alternative Methode verwenden, bei der diese E-Mails von einem Dritten für Sie gesendet werden.

Eine E-Mail an den technischen Support (nach einem Besuch des Online-Supports oder häufig gestellte Fragen) sollte klarstellen, ob auf Ihrem Server E-Mail-Funktionen verfügbar sind.

Stellen Sie sicher, dass der localhostMailserver konfiguriert ist

Wenn Sie auf Ihrer lokalen Workstation mit WAMP, MAMP oder XAMPP entwickeln, ist wahrscheinlich kein E-Mail-Server auf Ihrer Workstation installiert. Ohne eine kann PHP standardmäßig keine E-Mails senden.

Sie können dies überwinden, indem Sie einen einfachen Mailserver installieren. Für Windows können Sie die kostenlose Mercury Mail verwenden .

Sie können auch SMTP verwenden, um Ihre E-Mails zu senden. Sehen Sie sich diese großartige Antwort von Vikas Dwivedi an, um zu erfahren, wie das geht.

Aktivieren Sie die benutzerdefinierte PHP mail.log

Zusätzlich zur Protokolldatei Ihres MTA und PHP können Sie die Protokollierung für die mail()Funktion speziell aktivieren . Es wird nicht die gesamte SMTP-Interaktion aufgezeichnet, sondern zumindest Funktionsaufrufparameter und Aufrufskript.

ini_set("mail.log", "/tmp/mail.log");
ini_set("mail.add_x_header", TRUE);

Weitere Informationen finden Sie unter http://php.net/manual/en/mail.configuration.php . (Am besten aktivieren Sie diese Optionen im php.inioder .user.inioder .htaccessvielleicht.)

Wenden Sie sich an einen Mail-Testdienst

Es gibt verschiedene Zustellungs- und Spam-Überprüfungsdienste, mit denen Sie Ihr MTA / Webserver-Setup testen können. In der Regel senden Sie eine Mail-Sonde an: ihre Adresse, erhalten dann später einen Zustellungsbericht und konkretere Fehler oder Analysen:

Verwenden Sie einen anderen Mailer

Die in PHP integrierte mail()Funktion ist praktisch und erledigt oft die Arbeit, hat aber auch Mängel . Glücklicherweise gibt es Alternativen, die mehr Leistung und Flexibilität bieten, einschließlich der Behandlung vieler der oben beschriebenen Probleme:

All dies kann mit einem professionellen SMTP-Server / Dienstanbieter kombiniert werden. (Weil typische gemeinsam genutzte Webhosting-Pläne für 08/15 in Bezug auf die Einrichtung / Konfigurierbarkeit von E-Mails ein Erfolg oder Misserfolg sind.)

39 er.irfankhan11 Jul 27 2015 at 21:01

Fügen Sie der Mail-Funktion einen Mail-Header hinzu:

$header = "From: [email protected]\r\n";
$header.= "MIME-Version: 1.0\r\n";
$header.= "Content-Type: text/html; charset=ISO-8859-1\r\n";
$header.= "X-Priority: 1\r\n";

$status = mail($to, $subject, $message, $header);

if($status)
{
    echo '<p>Your mail has been sent!</p>';
} else {
    echo '<p>Something went wrong. Please try again!</p>';
}
25 sonamgupta May 20 2015 at 20:23
  1. Versuchen Sie immer, Header in der Mail-Funktion zu senden.
  2. Wenn Sie E-Mails über localhost senden, nehmen Sie die SMTP-Einstellungen für das Senden von E-Mails vor.
  3. Wenn Sie E-Mails über einen Server senden, überprüfen Sie, ob die E-Mail-Sendefunktion auf Ihrem Server aktiviert ist.
21 oneDerer Jul 09 2014 at 09:55

Wenn Sie zum Senden Ihrer E-Mail eine SMTP-Konfiguration verwenden, verwenden Sie stattdessen PHPMailer . Sie können die Bibliothek von https://github.com/PHPMailer/PHPMailer herunterladen .

Ich habe meine E-Mail wie folgt erstellt:

function send_mail($email, $recipient_name, $message='')
{
    require("phpmailer/class.phpmailer.php");

    $mail = new PHPMailer();

    $mail->CharSet = "utf-8";
    $mail->IsSMTP();                                      // Set mailer to use SMTP
    $mail->Host = "mail.example.com";  // Specify main and backup server
    $mail->SMTPAuth = true;     // Turn on SMTP authentication
    $mail->Username = "myusername";  // SMTP username
    $mail->Password = "p@ssw0rd"; // SMTP password

    $mail->From = "[email protected]";
    $mail->FromName = "System-Ad";
    $mail->AddAddress($email, $recipient_name);

    $mail->WordWrap = 50;                                 // Set word wrap to 50 characters
    $mail->IsHTML(true);                                  // Set email format to HTML (true) or plain text (false)

    $mail->Subject = "This is a Sampleenter code here Email";
    $mail->Body    = $message;
    $mail->AltBody = "This is the body in plain text for non-HTML mail clients";
    $mail->AddEmbeddedImage('images/logo.png', 'logo', 'logo.png');
    $mail->addAttachment('files/file.xlsx');

    if(!$mail->Send())
    {
       echo "Message could not be sent. <p>";
       echo "Mailer Error: " . $mail->ErrorInfo;
       exit;
    }

    echo "Message has been sent";
}
17 user1258544 Jul 09 2014 at 10:22

Fügen Sie einfach einige Header hinzu, bevor Sie E-Mails senden:

<?php 
$name = $_POST['name'];
$email = $_POST['email'];
$message = $_POST['message'];
$from = 'From: yoursite.com'; 
$to = '[email protected]'; 
$subject = 'Customer Inquiry';
$body = "From: $name\n E-Mail: $email\n Message:\n $message";

$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-type: text/html\r\n";
$headers .= 'From: [email protected]' . "\r\n" .
'Reply-To: [email protected]' . "\r\n" .
'X-Mailer: PHP/' . phpversion();

mail($to, $subject, $message, $headers);

Und noch etwas. Die mail()Funktion funktioniert in localhost nicht. Laden Sie Ihren Code auf einen Server hoch und versuchen Sie es.

13 bat.t Sep 29 2015 at 21:25

Bei 000webhost hat es für mich wie folgt funktioniert:

$headers  = "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type: text/html; charset=iso-8859-1" . "\r\n";
$headers .= "From: ". $from. "\r\n";
$headers .= "Reply-To: ". $from. "\r\n";
$headers .= "X-Mailer: PHP/" . phpversion();
$headers .= "X-Priority: 1" . "\r\n";

Geben Sie beim Senden der E-Mail direkt die E-Mail-Adresse ein:

mail('[email protected]', $subject, $message, $headers)

Verwenden Sie ''und nicht "".

Dieser Code funktioniert, aber die E-Mail wurde mit einer Verzögerung von einer halben Stunde empfangen.

10 Karthik Jun 23 2016 at 16:02

Meistens ist die mail()Funktion beim Shared Hosting deaktiviert. Eine bessere Option ist die Verwendung von SMTP. Die beste Option wäre Google Mail oder SendGrid.


SMTPconfig.php

<?php 
    $SmtpServer="smtp.*.*";
    $SmtpPort="2525"; //default
    $SmtpUser="***";
    $SmtpPass="***";
?>

SMTPmail.php

<?php
class SMTPClient
{

    function SMTPClient ($SmtpServer, $SmtpPort, $SmtpUser, $SmtpPass, $from, $to, $subject, $body)
    {

        $this->SmtpServer = $SmtpServer;
        $this->SmtpUser = base64_encode ($SmtpUser);
        $this->SmtpPass = base64_encode ($SmtpPass);
        $this->from = $from;
        $this->to = $to;
        $this->subject = $subject;
        $this->body = $body;

        if ($SmtpPort == "") 
        {
            $this->PortSMTP = 25;
        }
        else
        {
            $this->PortSMTP = $SmtpPort;
        }
    }

    function SendMail ()
    {
        $newLine = "\r\n";
        $headers = "MIME-Version: 1.0" . $newLine;  
        $headers .= "Content-type: text/html; charset=iso-8859-1" . $newLine;  

        if ($SMTPIN = fsockopen ($this->SmtpServer, $this->PortSMTP)) 
        {
            fputs ($SMTPIN, "EHLO ".$HTTP_HOST."\r\n"); 
            $talk["hello"] = fgets ( $SMTPIN, 1024 ); 
            fputs($SMTPIN, "auth login\r\n");
            $talk["res"]=fgets($SMTPIN,1024);
            fputs($SMTPIN, $this->SmtpUser."\r\n");
            $talk["user"]=fgets($SMTPIN,1024);
            fputs($SMTPIN, $this->SmtpPass."\r\n");
            $talk["pass"]=fgets($SMTPIN,256);
            fputs ($SMTPIN, "MAIL FROM: <".$this->from.">\r\n"); 
            $talk["From"] = fgets ( $SMTPIN, 1024 ); 
            fputs ($SMTPIN, "RCPT TO: <".$this->to.">\r\n"); 
            $talk["To"] = fgets ($SMTPIN, 1024); 
            fputs($SMTPIN, "DATA\r\n");
            $talk["data"]=fgets( $SMTPIN,1024 );
            fputs($SMTPIN, "To: <".$this->to.">\r\nFrom: <".$this->from.">\r\n".$headers."\n\nSubject:".$this->subject."\r\n\r\n\r\n".$this->body."\r\n.\r\n");
            $talk["send"]=fgets($SMTPIN,256);
            //CLOSE CONNECTION AND EXIT ... 
            fputs ($SMTPIN, "QUIT\r\n"); 
            fclose($SMTPIN); 
            // 
        } 
        return $talk;
    } 
}
?>

contact_email.php

<?php 
include('SMTPconfig.php');
include('SMTPmail.php');
if($_SERVER["REQUEST_METHOD"] == "POST")
{
    $to = "";
    $from = $_POST['email'];
    $subject = "Enquiry";
    $body = $_POST['name'].'</br>'.$_POST['companyName'].'</br>'.$_POST['tel'].'</br>'.'<hr />'.$_POST['message'];
    $SMTPMail = new SMTPClient ($SmtpServer, $SmtpPort, $SmtpUser, $SmtpPass, $from, $to, $subject, $body);
    $SMTPChat = $SMTPMail->SendMail();
}
?>
9 iatboy Aug 05 2014 at 10:49

Wenn Sie nur die mail()Funktion verwenden, müssen Sie die Konfigurationsdatei vervollständigen.

Sie müssen die Mail-Erweiterung öffnen und den SMTP smtp_portusw. Benutzernamen und vor allem Ihr Kennwort festlegen . Ohne das kann keine Mail gesendet werden. Sie können die PHPMailKlasse auch zum Senden verwenden.

9 vldfr Feb 11 2015 at 22:20

Probieren Sie diese beiden Dinge getrennt und zusammen aus:

  1. entferne das if($_POST['submit']){}
  2. entfernen $from(nur mein Bauch)
8 StephenM Jan 03 2015 at 09:32

Ich denke, das sollte den Trick machen. Ich habe gerade eine if(issetund eine Verkettung zu den Variablen im Body hinzugefügt, um PHP von HTML zu trennen.

<?php
    $name = $_POST['name'];
    $email = $_POST['email'];
    $message = $_POST['message'];
    $from = 'From: yoursite.com'; 
    $to = '[email protected]'; 
    $subject = 'Customer Inquiry';
    $body = "From:" .$name."\r\n E-Mail:" .$email."\r\n Message:\r\n" .$message;

if (isset($_POST['submit'])) 
{
    if (mail ($to, $subject, $body, $from)) 
    { 
        echo '<p>Your message has been sent!</p>';
    } 
    else 
    { 
        echo '<p>Something went wrong, go back and try again!</p>'; 
    }
}

?>
8 Machavity May 20 2016 at 19:45

Für alle, die dies in Zukunft finden, würde ich die Verwendung nicht empfehlen mail. Es gibt einige Antworten, die dies berühren, aber nicht das Warum .

Die mailFunktion von PHP ist nicht nur undurchsichtig, sondern hängt auch vollständig von dem MTA ab, den Sie für die Arbeit verwenden (z. B. Sendmail ). mailwird Ihnen nur mitteilen, wenn der MTA dies nicht akzeptiert hat (dh Sendmail war nicht verfügbar, als Sie versuchten zu senden). Es kann Ihnen nicht sagen, ob die E-Mail erfolgreich war, weil sie übergeben wurde. Als solches (wie die Antwortdetails von John Conde ) können Sie jetzt mit den Protokollen des MTA herumspielen und hoffen, dass es Ihnen genug über den Fehler bei der Behebung sagt. Wenn Sie sich auf einem gemeinsam genutzten Host befinden oder keinen Zugriff auf die MTA-Protokolle haben, haben Sie kein Glück. Leider wird dies bei den meisten Vanilla-Installationen für Linux standardmäßig so gehandhabt.

Eine E-Mail-Bibliothek ( PHPMailer , Zend Framework 2+ usw.) macht etwas ganz anderes als mail. Sie öffnen einen Socket direkt an den empfangenden Mailserver und senden dann die SMTP-Mail-Befehle direkt über diesen Socket. Mit anderen Worten, die Klasse fungiert als eigener MTA (beachten Sie, dass Sie die Bibliotheken mailanweisen können, die E-Mails letztendlich zu senden, aber ich würde Ihnen dringend empfehlen, dies nicht zu tun).

Dies bedeutet, dass Sie die Antworten vom empfangenden Server direkt sehen können (in PHPMailer können Sie beispielsweise die Debugging-Ausgabe aktivieren ). Keine Vermutung mehr, ob eine E-Mail nicht gesendet werden konnte oder warum.

Wenn Sie SMTP verwenden (dh anrufen isSMTP()), können Sie mithilfe der SMTPDebugEigenschaft eine detaillierte Abschrift der SMTP-Konversation abrufen .

Stellen Sie diese Option ein, indem Sie eine Zeile wie diese in Ihr Skript aufnehmen:

$mail->SMTPDebug = 2;

Sie erhalten auch den Vorteil einer besseren Benutzeroberfläche. Mit müssen mailSie alle Ihre Header, Anhänge usw. einrichten. Mit einer Bibliothek haben Sie eine spezielle Funktion, um dies zu tun. Dies bedeutet auch, dass die Funktion alle kniffligen Teile (wie Header) ausführt.

6 Chiragpatel Jul 13 2015 at 14:27
$name = $_POST['name'];
$email = $_POST['email'];
$reciver = '/* Reciver Email address */';
if (filter_var($reciver, FILTER_VALIDATE_EMAIL)) {
    $subject = $name;
    // To send HTML mail, the Content-type header must be set.
    $headers = 'MIME-Version: 1.0' . "\r\n";
    $headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n";
    $headers .= 'From:' . $email. "\r\n"; // Sender's Email
    //$headers .= 'Cc:' . $email. "\r\n"; // Carbon copy to Sender
    $template = '<div style="padding:50px; color:white;">Hello ,<br/>'
        . '<br/><br/>'
        . 'Name:' .$name.'<br/>'
        . 'Email:' .$email.'<br/>'
        . '<br/>'
        . '</div>';
    $sendmessage = "<div style=\"background-color:#7E7E7E; color:white;\">" . $template . "</div>";
    // Message lines should not exceed 70 characters (PHP rule), so wrap it.
    $sendmessage = wordwrap($sendmessage, 70);
    // Send mail by PHP Mail Function.
    mail($reciver, $subject, $sendmessage, $headers);
    echo "Your Query has been received, We will contact you soon.";
} else {
    echo "<span>* invalid email *</span>";
}
6 dEsta88 Oct 07 2014 at 05:33

Sie können Konfigurations-E-Mail von CodeIgniter verwenden . Zum Beispiel mit SMTP (einfacher Weg):

$config = Array(
        'protocol' => 'smtp',
        'smtp_host' => 'mail.domain.com', // Your SMTP host
        'smtp_port' => 26, // Default port for SMTP
        'smtp_user' => '[email protected]',
        'smtp_pass' => 'password',
        'mailtype' => 'html',
        'charset' => 'iso-8859-1',
        'wordwrap' => TRUE
);
$message = 'Your msg';
$this->load->library('email', $config);
$this->email->from('[email protected]', 'Title');
$this->email->to('[email protected]');
$this->email->subject('Header');
$this->email->message($message);

if($this->email->send()) 
{
   // Conditional true
}

Für mich geht das!

4 GauravSirauthiya Jun 23 2015 at 17:58

Versuche dies

if ($_POST['submit']) {
    $success= mail($to, $subject, $body, $from);
    if($success)
    { 
        echo '
        <p>Your message has been sent!</p>
        ';
    } else { 
        echo '
        <p>Something went wrong, go back and try again!</p>
        '; 
    }
}
4 JackCh Mar 20 2018 at 02:09

Möglicherweise liegt das Problem in der Konfiguration des Mailservers. Um diese Art von Problemen zu vermeiden oder sich keine Gedanken über das Mail-Server-Problem machen zu müssen, empfehle ich die Verwendung von PHPMailer .

Es ist ein Plugin, das alles Notwendige zum Senden von E-Mails enthält. Sie müssen lediglich berücksichtigen, dass der SMTP-Port (Port: 25 und 465) aktiviert ist.

require_once 'PHPMailer/PHPMailer.php';
require_once '/servicios/PHPMailer/SMTP.php';
require_once '/servicios/PHPMailer/Exception.php';

$mail = new \PHPMailer\PHPMailer\PHPMailer(true);
try {
    //Server settings
    $mail->SMTPDebug = 0;
    $mail->isSMTP();
    $mail->Host = 'smtp.gmail.com';
    $mail->SMTPAuth = true;
    $mail->Username = '[email protected]';
    $mail->Password = 'contrasenia';
    $mail->SMTPSecure = 'ssl';
    $mail->Port = 465;

    // Recipients
    $mail->setFrom('[email protected]', 'my name');
    $mail->addAddress('[email protected]');

    // Attachments
    $mail->addAttachment('optional file');         // Add files, is optional

    // Content
    $mail->isHTML(true);// Set email format to HTML
    $mail->Subject = utf8_decode("subject");
    $mail->Body    = utf8_decode("mail content");
    $mail->AltBody = '';
    $mail->send();
}
catch (Exception $e) {
    $error = $mail->ErrorInfo;
}
3 Daniel Sep 24 2017 at 10:50

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

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

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

sudo apt-get install sendmail

Wenn Sie sich auf einem Ubuntu-Server befinden.

3 aidangig Jan 31 2016 at 21:15

Zunächst haben Sie möglicherweise zu viele Parameter für die Funktion mail () ... Sie können maximal fünf haben, mail(to, subject, message, headers, parameters);

Was die $fromVariable betrifft, sollte dies automatisch von Ihrem Webhost kommen, wenn Sie das Linux- cPanel verwenden . Es kommt automatisch von Ihrem cPanel-Benutzernamen und Ihrer IP-Adresse.

$name = $_POST['name'];
$email = $_POST['email'];
$message = $_POST['message'];
$from = 'From: yoursite.com';
$to = '[email protected]';
$subject = 'Customer Inquiry';
$body = "From: $name\n E-Mail: $email\n Message:\n $message";

Stellen Sie außerdem sicher, dass Ihre mail () - Funktion die richtige Reihenfolge der Variablen aufweist.

Das in dieser Reihenfolge, oder es besteht die Möglichkeit, dass es nicht funktioniert.mail($to, $subject, $message, etc.)

3 JohnSlegers Feb 10 2016 at 20:23

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

Normalerweise benutze ich SwiftMailer, wenn ich Mails mit PHP senden muss.


Grundlegende Verwendung:

require 'mail/swift_required.php';

$message = Swift_Message::newInstance()
    // The subject of your email
    ->setSubject('Jane Doe sends you a message')
    // The from address(es)
    ->setFrom(array('[email protected]' => 'Jane Doe'))
    // The to address(es)
    ->setTo(array('[email protected]' => 'Frank Stevens'))
    // Here, you put the content of your email
    ->setBody('<h3>New message</h3><p>Here goes the rest of my message</p>', 'text/html');

if (Swift_Mailer::newInstance(Swift_MailTransport::newInstance())->send($message)) {
    echo json_encode([
        "status" => "OK",
        "message" => 'Your message has been sent!'
    ], JSON_PRETTY_PRINT);
} else {
    echo json_encode([
        "status" => "error",
        "message" => 'Oops! Something went wrong!'
    ], JSON_PRETTY_PRINT);
}

Weitere Informationen zur Verwendung von SwiftMailer finden Sie in der offiziellen Dokumentation .

3 user3132194 Jun 21 2017 at 19:07

Für diejenigen, die keine externen Mailer verwenden und mail () auf einem dedizierten Linux-Server senden möchten.

Die Art und Weise, wie PHP Mails verschickt, wird php.iniim Abschnitt beschrieben [mail function].

Parameter sendmail-pathbeschreibt, wie sendmail aufgerufen wird. Der Standardwert ist sendmail -t -i. Wenn Sie also sendmail -t -i < message.txtin der Linux-Konsole arbeiten, sind Sie fertig. Sie können auch mail.logzum Debuggen hinzufügen und sicherstellen, dass mail () wirklich aufgerufen wird.

Verschiedene MTAs können implementiert werden sendmail. Sie stellen unter diesem Namen nur eine symbolische Verknüpfung zu ihren Binärdateien her. In Debian ist der Standardwert beispielsweise Postfix . Konfigurieren Sie Ihren MTA so, dass E-Mails gesendet und von der Konsole aus mit getestet werden sendmail -v -t -i < message.txt. Die Datei message.txtsollte alle Überschriften einer Nachricht und einen Text enthalten. Die Zieladresse für den Umschlag wird aus der To:Überschrift entnommen . Beispiel:

From: [email protected]
To: [email protected]
Subject: Test mail via sendmail.

Text body.

Ich bevorzuge die Verwendung von ssmtp als MTA, da dies einfach ist und kein Daemon mit geöffneten Ports ausgeführt werden muss. ssmtp eignet sich nur zum Senden von E-Mails von localhost . Es kann auch authentifizierte E-Mails über Ihr Konto in einem öffentlichen Postdienst senden. Installieren Sie ssmtp und bearbeiten Sie die Konfigurationsdatei /etc/ssmtp/ssmtp.conf. Um auch lokale Systemmail an Unix-Konten empfangen zu können (z. B. Warnungen an root von Cron-Jobs), konfigurieren Sie die /etc/ssmtp/revaliasesDatei.

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

[email protected]
mailhub=smtp.yandex.ru:465
FromLineOverride=YES
UseTLS=YES
[email protected]
AuthPass=password
2 TonyLuigiC Apr 05 2017 at 08:09

Dies betrifft nur eine kleine Handvoll Benutzer, aber ich möchte, dass es für diese kleine Handvoll dokumentiert wird. Dieses Mitglied dieser kleinen Handvoll verbrachte aufgrund dieses Problems 6 Stunden mit der Fehlerbehebung bei einem funktionierenden PHP-Mail-Skript.

Wenn Sie eine Universität besuchen, an der XAMPP von www.AceITLab.com ausgeführt wird, 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 Mail-Client verwenden, Pear arbeitet für uns. Sie müssen an ein Google Mail-Konto mit geringen Sicherheitseinstellungen senden.

Ja, ich weiß, das ist für E-Mails aus der realen Welt völlig nutzlos. Nach allem, was ich gesehen habe, haben akademische Umgebungen und die reale Welt oft wenig gemeinsam.

1 Ron Apr 01 2017 at 10:30

Wenn Sie diesen Code auf einem lokalen Server (dh Ihrem Computer für Entwicklungszwecke) ausführen, wird die E-Mail nicht an den Empfänger gesendet. Es wird eine .txtDatei in einem Ordner mit dem Namen erstellt mailoutput.

Wenn Sie einen kostenlosen Schlauchdienst wie 000webhostoder verwenden hostinger, deaktivieren diese Dienstanbieter die mail()Funktion, um eine unbeabsichtigte Verwendung von E-Mail-Spoofing, Spam usw. zu verhindern. Ich möchte, dass Sie sich an sie wenden, um zu erfahren, ob sie diese Funktion unterstützen.

Wenn Sie sicher sind, dass der Dienstanbieter die Funktion mail () unterstützt, können Sie dieses PHP-Handbuch für weitere Informationen überprüfen.

PHP mail ()

Versuchen Sie, diesen Code auszuführen, um zu überprüfen, ob Ihr Hosting-Service die Funktion mail () unterstützt (denken Sie daran, die E-Mail-Adresse des Empfängers zu ändern) :

<?php
    $to      = '[email protected]';
    $subject = 'the subject';
    $message = 'hello';
    $headers = 'From: [email protected]' . "\r\n" .
        'Reply-To: [email protected]' . "\r\n" .
        'X-Mailer: PHP/' . phpversion();

    mail($to, $subject, $message, $headers);
?>
1 BadLoser Aug 21 2019 at 16:14

Die Sendmail- Installation für Debian 10.0.0 ('Buster') war in der Tat trivial!

php.ini

[mail function]
sendmail_path=/usr/sbin/sendmail -t -i
; (Other directives are mostly windows)

Standardinstallation des sendmail- Pakets (erlaubt 'send'):

su -                                        # Install as user 'root'
dpkg --list                                 # Is install necessary?
apt-get install sendmail sendmail-cf m4     # Note multiple package selection
sendmailconfig                              # Respond all 'Y' for new install

Verschiedene nützliche Befehle:

which sendmail                              # /usr/sbin/sendmail
which sendmailconfig                        # /usr/sbin/sendmailconfig
man sendmail                                # Documentation
systemctl restart sendmail                  # As and when required

Überprüfung (der Sendefähigkeit)

echo "Subject: sendmail test" | sendmail -v <yourEmail>@gmail.com

Das oben genannte dauerte ungefähr 5 Minuten. Dann habe ich 5 Stunden verschwendet ... Vergiss nicht, deinen Spam-Ordner zu überprüfen !

SuReSh Apr 28 2015 at 13:08

Es gibt mehrere Möglichkeiten:

  1. Sie haben ein Serverproblem. Der Server hat keinen Mailserver. Ihre E-Mail funktioniert also nicht, da Ihr Code in Ordnung ist und die E-Mail mit dem Typ funktioniert.

  2. Sie erhalten den angegebenen Wert nicht. Probieren Sie Ihren Code mit einem statischen Wert aus.

  3. Verwenden Sie SMTP-Mails, um E-Mails zu senden ...

krishna Dec 23 2018 at 21:25

Sie können Ihre Fehler sehen durch:

error_reporting(E_ALL);

Und mein Beispielcode lautet:

<?php
    use PHPMailer\PHPMailer\PHPMailer;
    require 'PHPMailer.php';
    require 'SMTP.php';
    require 'Exception.php';

    $name = $_POST['name'];
    $mailid = $_POST['mail'];
    $mail = new PHPMailer;
    $mail->IsSMTP();
    $mail->SMTPDebug = 0;                   // Set mailer to use SMTP
    $mail->Host = 'smtp.gmail.com';         // Specify main and backup server
    $mail->Port = 587;                      // Set the SMTP port
    $mail->SMTPAuth = true;                 // Enable SMTP authentication
    $mail->Username = '[email protected]';  // SMTP username
    $mail->Password = 'password';           // SMTP password
    $mail->SMTPSecure = 'tls';              // Enable encryption, 'ssl' also accepted

    $mail->From = '[email protected]';
    $mail->FromName = 'name';
    $mail->AddAddress($mailid, $name);       // Name is optional
    $mail->IsHTML(true);                     // Set email format to HTML
    $mail->Subject = 'Here is the subject';
    $mail->Body    = 'Here is your message' ;
    $mail->AltBody = 'This is the body in plain text for non-HTML mail clients';
    if (!$mail->Send()) {
       echo 'Message could not be sent.';
       echo 'Mailer Error: ' . $mail->ErrorInfo;
       exit;
    }
    echo 'Message has been sent';
?>
ofricofri Aug 16 2020 at 08:44

Wenn Sie mit einer auf Hostgator gehosteten App nicht weiterkommen, hat dies mein Problem gelöst. Vielen Dank an den Mann, der die detaillierte Lösung gepostet hat. Falls der Link eines Tages offline geht, haben Sie dort die Zusammenfassung:

  • Suchen Sie auf Ihrem Server nach dem Sendmail-Pfad. Eine einfache Möglichkeit, dies zu überprüfen, besteht darin, vorübergehend den folgenden Code auf eine Seite zu schreiben, auf die nur Sie zugreifen können, um die generierten Informationen zu lesen : <?php phpinfo(); ?>. Öffnen Sie diese Seite und suchen Sie nach sendmail path. (Dann vergessen Sie nicht, diesen Code zu entfernen!)
  • Problem und Lösung: Wenn in Ihrem Sendmail-Pfad nur "Pfad" angegeben ist -t -i, bearbeiten Sie den Server php.iniund fügen Sie die folgende Zeile hinzu:sendmail_path = /usr/sbin/sendmail -t -i;

Nachdem mail()ich jedoch E- Mails mit der PHP- Funktion senden konnte , stellte ich fest, dass keine authentifizierten E-Mails gesendet wurden, was zu einem weiteren Problem führte. Die E-Mails fielen alle in die Junk-Mailbox meiner Hotmail, und einige E-Mails wurden nie zugestellt, was vermutlich damit zusammenhängt, dass sie nicht authentifiziert sind. Deshalb habe ich von wechseln entschieden mail()zu PHPMailermit SMTP, nachdem alle.