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


477
<?php
    $name = $_POST['name'];
    $email = $_POST['email'];
    $message = $_POST['message'];
    $from = 'From: yoursite.com';
    $to = 'contact@yoursite.com';
    $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?


2
ist Ihr Programm in einem lokalen Computer oder Live-Host
Tamil Selvan C

6
1. Sind Sie sicher, dass es nicht in Ihren Spam geht? 2. Haben Sie sendmail auf Ihrer Box konfiguriert?
Steven Moseley

Es ist auf einem Live-Host, es geht nicht in meinen Spam. Ich bin nicht sicher, was Sie damit meinen, dass sendmail auf meiner Box konfiguriert ist, also nehme ich nicht an?
user3818620

versuchen Sie es ohne$from
Artem Ilchenko

Antworten:


512

Obwohl es Teile dieser Antwort gibt, die nur für die Verwendung dermail() 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 $ bis, Zeichenfolge $ Betreff, Zeichenfolge $ Nachricht [, Zeichenfolge $ zusätzliche_Köpfe [, 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 die Blockierung dieser Ports aufzuheben.

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. Dies bedeutet lediglich, 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 vermeiden, 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" <john@blacksmiths-international.com>. B. ).
  • Überwachen Sie Ihre Missbrauchskonten, z. B.missbrauch@IhreDomain.com und Postmaster@IhreDomain.com. 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 allgemeine Header wie "Von" und "Antwort an" fehlen:

$headers = array("From: from@example.com",
    "Reply-To: replyto@example.com",
    "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 from@example.com", // missing colon
    "Reply To: replyto@example.com",      // 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 verwendete 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 = 'user@example.com';
// 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('user@example.com', $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 variieren. 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 eingebaute mail()Funktion von PHP 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.)


11
Gut geschrieben, John. Ich möchte nur noch eines hinzufügen: Wenn Sie die Mailserver-Protokolle des sendenden Mailservers (ob lokal oder remote gehostet) überprüfen, kann dies nach Möglichkeit häufig Aufschluss darüber geben, was das Problem verursacht. Diese Protokolle sollten 1) anzeigen, ob die Nachricht vom sendenden Mailserver vom PHP-Skript empfangen wurde oder nicht, und wenn ja, 2) ob der empfangende MX die Zustellung vom sendenden Mailserver akzeptiert hat oder nicht.
mti2935

@ mti2935 Das ist so hilfreich, dass ich überrascht bin, dass ich das verpasst habe. Ich werde es sicher so bald hinzufügen. :)
John Conde

1
Ich würde mit nicht verwenden beginnen mail(), es macht so einen schlechten Job und ist schwieriger zu debuggen als jede andere Mail-Bibliothek

1
Dieselbe Website auf 000webhost sendet E-Mails erfolgreich und schnell auf der Domain netai.net, aber auf site88.net habe ich dieselbe Website in der Konsole, die die Nachricht erfolgreich sendet, aber ich erhalte keine Nachrichten. Auch in der comuf.com Domain bekomme ich eine Fehlermeldung. (Dieselbe Website auf demselben Host funktioniert nur auf der netai.net Domain, net16.net funktioniert auch)
Nicolas Papaconstantinou

1
Meine Frage ( stackoverflow.com/questions/44866673/… ) wurde als Duplikat dieser Frage markiert, aber ich kann es immer noch nicht herausfinden. Irgendwelche Vorschläge?
Zachary Elkins

37

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

$header = "From: noreply@example.com\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
  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.

20

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 = "me@walalang.com";
    $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";
}

2
Ich musste auch verwenden: require ("phpmailer / class.smtp.php");
Doug

15

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 = 'contact@yoursite.com'; 
$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: from@example.com' . "\r\n" .
'Reply-To: reply@example.com' . "\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.


1
Dies hat tatsächlich dazu geführt, dass das Formular gesendet wurde - meine Frage wäre jetzt ... wie zeige ich die eingegebene E-Mail des Benutzers, nachdem ich sie durch den Header ersetzt habe ...
user3818620

verhindert es, dass E-Mails aus dem Spam-Ordner gelangen? Ich habe gesehen, ob wir mit dieser Methode, die Sie in Ihrem Code Google Mail verwendet haben, mehr als 10 E-Mails an Spam senden.
Jewelhuq

Das OP hat diese Zeile: $from = 'From: yoursite.com'; Was nicht wie eine vollständig gültige E-Mail-Adresse aussieht, gibt es keinen lokalen Teil. Sie haben den From-Header ersetzt und zusätzliche hinzugefügt. Oder besser gesagt, das $fromObige ist in Ihrem Beispiel überflüssig. Und Missbildungen waren wahrscheinlich das ursprüngliche Problem des OP.
Progrock

13

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@gmail.com', $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

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();
}
?>

Ist es eine gute Idee, den SMTP-Benutzer und das Kennwort im Klartext auf dem Server zu speichern?
Juri

@Juri wahrscheinlich nicht ... Gott, ich kann nicht herausfinden, wie die Mail-Funktion funktioniert :. (

9

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 auch die verwendenPHPMail Klasse auch zum Senden verwenden.


9

Probieren Sie diese beiden Dinge getrennt und zusammen aus:

  1. entferne das if($_POST['submit']){}
  2. entfernen $from(nur mein Darm)

8

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 = 'contact@yoursite.com'; 
    $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

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
$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

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' => 'name@domain.com',
        'smtp_pass' => 'password',
        'mailtype' => 'html',
        'charset' => 'iso-8859-1',
        'wordwrap' => TRUE
);
$message = 'Your msg';
$this->load->library('email', $config);
$this->email->from('name@domain.com', 'Title');
$this->email->to('emaildestination@domain.com');
$this->email->subject('Header');
$this->email->message($message);

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

Für mich geht das!


1
fsockopen () [function.fsockopen]: php_network_getaddresses: getaddrinfo fehlgeschlagen: Ein solcher Host ist nicht bekannt. - Wenn ich auf diesen Fehler stoße, was ist dann der Grund und was muss getan werden?
Choudhury Saadmaan Mahmid

1
"Works for me" ist nur eine anekdotische Information, aber nicht wirklich eine Erklärung. Port und SMTP-Passwort wären für die meisten Benutzer irreführend.
Mario

Was ist "Konfigurations-E-Mail" ? Haben Sie eine Referenz?
Peter Mortensen

4

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

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

Es ist ein Plugin, das über alles verfügt, was zum Senden von E-Mails erforderlich ist. 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 = 'correo@gmail.com';
    $mail->Password = 'contrasenia';
    $mail->SMTPSecure = 'ssl';
    $mail->Port = 465;

    // Recipients
    $mail->setFrom('correo@gmail.com', 'my name');
    $mail->addAddress('destination@correo.com');

    // 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;
}

1
IANA hat Port 465 durch Port 587 ersetzt. Dies ist der Standard-Mailübermittlungsport. Wenn ein E-Mail-Client oder ein ausgehender Server eine E-Mail sendet, die von einem geeigneten Mailserver weitergeleitet werden soll, sollte immer der SMTP-Port 587 als Standardport verwendet werden. Siehe mailgun.com/blog/which-smtp-port-understanding-ports-25-465-587 . Ein weiser Rat: Öffnen Sie keine Ports auf Ihrem Computer, wenn Sie nicht genau wissen, was Sie tun!
Harm

3

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 überprü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.


Das ist viel zu grob, um nützlich zu sein. Die bloße Installation eines MTA ermöglicht es selten, darauf zuzugreifen. Eine vollständige Installationsanleitung für sendmail / postfix / qmail wäre hier nicht zum Thema.
Mario

Bezieht sich dieser Kommentar auf meine Antwort? Weil mir das nicht passiert ist und ich es nicht genau so gelöst habe. Es gibt verschiedene mögliche Antworten auf die Frage, von denen meine eine ist, nachdem ich in der Vergangenheit alle oben genannten Fragen ausprobiert habe. Meine Antwort hatte das Problem für mich gelöst, daher habe ich sie hier als eine weitere mögliche Lösung angeboten.
Daniel

Ja sicher. Es ist eine von vielen möglichen Antworten. Es ist jedoch immer noch ein Weg zur oberflächlichen IMO. Die Verallgemeinerung in "Sie benötigen einen MTA" wie ... - und hier sind einige Setup-Anleitungen verknüpft ... könnte jedoch praktischer sein.
Mario

3

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 = 'contact@yoursite.com';
$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 mail($to, $subject, $message, etc.)in dieser Reihenfolge, oder es besteht die Möglichkeit, dass es nicht funktioniert.


3

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('jane.doe@gmail.com' => 'Jane Doe'))
    // The to address(es)
    ->setTo(array('frank.stevens@gmail.com' => '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

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. Zum Beispiel in Debian 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: myapp@example.com
To: mymail@example.com
Subject: Test mail via sendmail.

Text body.

Ich bevorzuge die Verwendung von ssmtp als MTA, da es 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:

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

2

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 niedrigen 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.


Das ist zu seltsam spezifisch und wird in der Tat niemand anderem helfen. Verwenden Sie bitte den Link [Löschen] unter Ihrer Antwort.
Mario

Was ist "Birne" in diesem Zusammenhang? Meinen Sie PEAR , das PHP-Software-Repository? Oder etwas anderes? ZB Peer ?
Peter Mortensen

Meinst du wirklich "kostbares kleines" ? Ist es etwas zu wünschen? Warum?
Peter Mortensen

1

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 auf 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      = 'nobody@example.com';
    $subject = 'the subject';
    $message = 'hello';
    $headers = 'From: webmaster@example.com' . "\r\n" .
        'Reply-To: webmaster@example.com' . "\r\n" .
        'X-Mailer: PHP/' . phpversion();

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

1

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 !


0

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 ...


0

Sie können libmail verwenden: http://lwest.free.fr/doc/php/lib/index.php3?page=mail&lang=de

include "libmail.php";
$m = new Mail(); // Create the mail
$m->From($_POST['form']);
$m->To($_POST['to']);
$m->Subject($_POST['subject']);
$m->Body($_POST['body']);
$m->Cc($_POST['cc']);
$m->Priority(4);
// Attach a file of type 'image/gif' to be displayed in the message if possible
$m->Attach("/home/leo/toto.gif", "image/gif", "inline");
$m->Send(); // Send the mail
echo "Mail was sent:"
echo $m->Get(); // Show the mail source

5
Wichtig zu erwähnen: Dies ist lediglich ein mail()Funktionsumbruch. Fügt nur die Nachrichtenkonstruktion und einige Gimmicks hinzu.
Mario

0

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 = 'someone@gmail.com';  // SMTP username
    $mail->Password = 'password';           // SMTP password
    $mail->SMTPSecure = 'tls';              // Enable encryption, 'ssl' also accepted

    $mail->From = 'someone@gmail.com';
    $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';
?>

1
SMTPDebug = 0ist nicht hilfreich. Ein einfaches "Passwort" würde auch nicht mit GMail funktionieren. Diese Antwort trägt hier nicht viel dazu bei.
Mario

-2

Vorausgesetzt, Ihr sendmail-System funktioniert, muss Ihr Code wie folgt geändert werden:

<?php
    $name = $_POST['name'];
    $email = $_POST['email'];
    $message = $_POST['message'];

    $header ="
Content-Type: text/html; charset=UTF-8\r\n
MIME-Version: 1.0\r\n
From: \"$name\" <$email>\r\n
Reply-To: no-reply@yoursite.com\r\n
X-Mailer: yoursite.com mailer\r\n
";

    $to = '"Contact" <contact@yoursite.com>'; 
    $subject = 'Customer Inquiry';
    $body =<<<EOB
<!DOCTYPE html>
<html>
    <body>
        $message
    </body>
</html>
EOB;

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

Auf diese Weise können Sie HTML-basierte E-Mails senden.

Von bemerkenswertem Interesse:

  1. Wir haben eine mehrzeilige Header-Zeichenfolge erstellt (jede Zeile durch \ r \ n getrennt).
  2. Wir haben den Inhaltstyp hinzugefügt, um auszudrücken, dass wir HTML zurückgeben, damit Sie bessere E-Mails verfassen können (Sie können Ihrer Nachricht wie gewünscht HTML-Code hinzufügen, einschließlich CSS, wie Sie es auf einer HTML-Seite tun würden).

Hinweis: Für die <<<EOBSyntax muss der letzte EOB-Marker als Zeilenanfang beginnen und darf nach dem Semikolon kein Leerzeichen oder ein beliebiges Zeichen enthalten.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.