Die PHP-Mail-Funktion schließt das Senden von E-Mails nicht ab
<?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.html
Seite, 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
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,
TRUE
wenn die MailFALSE
andernfalls 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
FALSE
Rü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
TRUE
Rü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 FALSE
hilft Ihnen dabei, die richtige Richtung einzuschlagen, was TRUE
jedoch 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 $_POST
nach Ihren Formularwerten suchen. Wenn Sie es eingestellt haben GET
oder gar nicht eingestellt haben, stellen Sie sicher, dass Sie $_GET
nach Ihren Formularwerten suchen.
action
Stellen Sie sicher, dass Ihr Formularwert auf die richtige Position zeigt
action
Stellen 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 localhost
Mailserver 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.ini
oder .user.ini
oder .htaccess
vielleicht.)
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:
- mail-tester.com (kostenlos / einfach)
- glockapps.com (kostenlos / $$$)
- senforensics.com (Anmeldung / $$$)
- mailtrap.io (pro / $$$)
- ultratools /… / emailTest (nur kostenlose / MX-Prüfungen)
- Verschiedene: http://www.verticalresponse.com/blog/7-email-testing-delivery-tools/
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:
- Am beliebtesten ist: PHPMailer
- Ebenso nützlich: SwiftMailer
- Oder sogar die ältere PEAR :: Mail .
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.)
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>';
}
- Versuchen Sie immer, Header in der Mail-Funktion zu senden.
- Wenn Sie E-Mails über localhost senden, nehmen Sie die SMTP-Einstellungen für das Senden von E-Mails vor.
- Wenn Sie E-Mails über einen Server senden, überprüfen Sie, ob die E-Mail-Sendefunktion auf Ihrem Server aktiviert ist.
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";
}
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.
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.
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();
}
?>
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_port
usw. Benutzernamen und vor allem Ihr Kennwort festlegen . Ohne das kann keine Mail gesendet werden. Sie können die PHPMail
Klasse auch zum Senden verwenden.
Probieren Sie diese beiden Dinge getrennt und zusammen aus:
- entferne das
if($_POST['submit']){}
- entfernen
$from
(nur mein Bauch)
Ich denke, das sollte den Trick machen. Ich habe gerade eine if(isset
und 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>';
}
}
?>
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 mail
Funktion 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 ). mail
wird 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 mail
anweisen 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 derSMTPDebug
Eigenschaft 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 mail
Sie 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.
$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>";
}
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!
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>
';
}
}
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;
}
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.
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 $from
Variable 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.)
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 .
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.ini
im Abschnitt beschrieben [mail function]
.
Parameter sendmail-path
beschreibt, wie sendmail aufgerufen wird. Der Standardwert ist sendmail -t -i
. Wenn Sie also sendmail -t -i < message.txt
in der Linux-Konsole arbeiten, sind Sie fertig. Sie können auch mail.log
zum 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.txt
sollte 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/revaliases
Datei.
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
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.
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 .txt
Datei in einem Ordner mit dem Namen erstellt mailoutput
.
Wenn Sie einen kostenlosen Schlauchdienst wie 000webhost
oder 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.
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);
?>
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 !
Es gibt mehrere Möglichkeiten:
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.
Sie erhalten den angegebenen Wert nicht. Probieren Sie Ihren Code mit einem statischen Wert aus.
Verwenden Sie SMTP-Mails, um E-Mails zu senden ...
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';
?>
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 nachsendmail 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 Serverphp.ini
und 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 PHPMailer
mit SMTP, nachdem alle.