it-swarm.com.de

PHP Mail-Funktion schließt das Versenden 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 Mailformular zu erstellen. Das Formular selbst befindet sich auf meiner index.html-Seite, reicht jedoch an eine separate Seite "Vielen Dank für Ihre Einreichung", thankyou.php, in die der obige PHP-Code eingebettet ist . Der Code wird einwandfrei übermittelt, sendet jedoch keine E-Mail. bitte helfen.

414
user3818620

Obwohl es Teile dieser Antwort gibt, die sich nur auf die Verwendung der Funktionmail() selbst beziehen, können viele dieser Schritte zur Fehlerbehebung auf jedes PHP mailing angewendet werden System.

Es gibt verschiedene Gründe, warum Ihr Skript anscheinend keine E-Mails versendet. Es ist schwierig, diese Dinge zu diagnostizieren, es sei denn, es liegt ein offensichtlicher Syntaxfehler vor. Wenn Sie keine haben, müssen Sie die folgende Checkliste durchgehen, um mögliche Fallstricke zu ermitteln.

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, die PHP) auftreten, zu beseitigen. Die Fehlerberichterstattung muss aktiviert sein, um diese Fehler zu erhalten. Platzieren Sie den folgenden Code am oberen Rand Ihres PHP -Dateien (oder in einer Master-Konfigurationsdatei) aktivieren die Fehlerberichterstattung.

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

Siehe this Stack Overflow answer für weitere Einzelheiten dazu.

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

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

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

bool-Mail (Zeichenfolge $ to, Zeichenfolge $ subject, Zeichenfolge $ message [ Zeichenfolge $ additional_headers [ Zeichenfolge $ additional_parameters]])

Die Mail-Funktion akzeptiert 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 Mail-Protokolle des Servers

Ihr Webserver sollte alle Versuche protokollieren, E-Mails über ihn zu senden. Der Speicherort dieser Protokolle variiert (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 gegebenenfalls im Zusammenhang mit Ihren Versuchen, E-Mails zu senden, gemeldet hat.

Überprüfen Sie, ob die Verbindung zum Port fehlgeschlagen ist

Port Block ist ein weit verbreitetes Problem, mit dem die meisten Entwickler bei der Integration ihres Codes zur Zustellung von E-Mails über SMTP konfrontiert sind. Und dies kann leicht an den Server-Mailboxen nachverfolgt werden (der Speicherort des Mailbox-Protokolls kann, wie oben erläutert, von Server zu Server variieren). Wenn Sie sich auf einem gemeinsam genutzten Hosting-Server befinden, bleiben die Ports 25 und 587 standardmäßig blockiert. Diese Sperre wurde absichtlich von Ihrem Hosting-Provider 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 Versand von Spam-E-Mails zu schützen.

Verwenden Sie die Ports 25 oder 587 für einfache/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 einem Ausdruck in PHP der Operator Fehlerunterdrückung _@_ vorangestellt wird, werden alle Fehlermeldungen, die von diesem Ausdruck generiert werden, ignoriert. Es gibt Umstände, in denen die Verwendung dieses Operators erforderlich ist, aber das Senden von E-Mails nicht einer von ihnen ist.

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

Es ist nur ratsam, wenn Sie mit error_get_last() direkt danach auf konkrete Fehler prüfen.

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

Die mail() Funktion:

Gibt TRUE zurück, wenn die E-Mail erfolgreich zur Zustellung angenommen wurde, andernfalls FALSE. 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 Rückgabewert von FALSE erhalten, wissen Sie, dass der Fehler darin besteht, dass Ihr Server Ihre E-Mails akzeptiert. Dies ist wahrscheinlich kein Codierungsproblem, sondern ein Problem mit der Serverkonfiguration. 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 erfolgreich von PHP an den entsprechenden Handler auf dem Server gesendet wurde. Es gibt noch weitere Fehlerquellen, die außerhalb der Kontrolle von PHP liegen und dazu führen können, dass die E-Mail nicht gesendet wird.

Also wird FALSE Ihnen helfen, in die richtige Richtung zu weisen, während TRUE nicht 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 ermöglicht und das Senden von E-Mails nicht einschränkt

Viele gemeinsam genutzte Webhosts, insbesondere kostenlose Webhosting-Anbieter, lassen das Versenden von E-Mails von ihren Servern nicht zu oder begrenzen die Menge, die in einem bestimmten Zeitraum gesendet werden kann. Dies ist auf ihre Bemühungen zurückzuführen, die Spammer daran zu hindern, ihre günstigeren 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, lesen Sie in den häufig gestellten Fragen nach, ob darin solche Beschrä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 wurden, häufig im Spam-Ordner eines Empfängers. Überprüfen Sie diesen Ordner immer, bevor Sie Fehler in Ihrem Code beheben.

Um zu verhindern, dass über PHP an den Spam-Ordner eines Empfängers gesendete E-Mails gesendet werden, gibt es verschiedene Möglichkeiten, die Sie sowohl in Ihrem PHP= - Code als auch anderweitig in "to" ausführen können Minimieren Sie die Wahrscheinlichkeit, dass Ihre E-Mails als Spam markiert werden. Gute Tipps von Michiel de Mare beinhalten:

  • Verwenden Sie E-Mail-Authentifizierungsmethoden wie SPF und DKIM , um Ihre E-Mails zu bestätigen und Ihr Domain-Name gehören zusammen und verhindern ein Spoofing Ihres Domain-Namens. Die SPF-Website enthält einen Assistenten zum Generieren der DNS-Informationen für Ihre Site.
  • Aktivieren Ihr DNS umkehren 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 ist
  • Stellen Sie sicher, dass die Antwortadresse eine gültige, vorhandene Adresse ist.
  • Verwenden Sie den vollständigen, echten Namen des Empfängers im Feld An und nicht nur die E-Mail-Adresse (z. B. _"John Smith" <[email protected]>_).
  • Überwachen Sie Ihre Missbrauchskonten, z. B. [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 kündigen Ihre Benutzer das Abonnement, indem Sie auf die Schaltfläche Spam klicken. Dies wirkt sich auf Ihre Reputation aus.

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

Stellen Sie sicher, dass alle E-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 die Mail-Header keine Syntaxfehler aufweisen

Ungültige Header sind genauso schlecht wie keine Header. Ein falsches Zeichen reicht möglicherweise aus, um Ihre E-Mail zu entgleisen. Stellen Sie sicher, dass Ihre Syntax korrekt ist, da PHP wird nicht diese Fehler für Sie abfangen.

_$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 E-Mail einen Absender vom Absender haben muss, dürfen Sie nicht nur den Wert any verwenden. Insbesondere benutzerspezifische Absenderadressen sind eine sichere Möglichkeit, Mails blockieren zu lassen:

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

Grund: Ihr Web- oder E-Mail-Server ist nicht auf die SPF/DKIM-Whitelist gesetzt, um vorzutäuschen, für @hotmail- oder @gmail-Adressen verantwortlich zu sein. Es kann sogar vorkommen, dass E-Mails mit _From:_ Absenderdomänen, für die es nicht konfiguriert ist, unbemerkt gelöscht werden.

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 im Funktionsaufruf mail() fest zu codieren:

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

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

An mehrere Konten senden

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

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

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

Wenn Sie für Ihre Formularmethode POST festgelegt haben, stellen Sie sicher, dass Sie _$_POST_ verwenden, um nach Ihren Formularwerten zu suchen. Wenn Sie es auf GET gesetzt haben oder es überhaupt nicht gesetzt haben, stellen Sie sicher, dass Sie _$_GET_ verwenden, um nach Ihren Formularwerten zu suchen.

Stellen Sie sicher, dass Ihr Wert für Formular action auf die richtige Position verweist

Stellen Sie sicher, dass Ihr Attribut form action einen Wert enthält, der auf Ihren PHP Mailing-Code 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 ermöglichen 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, mit der ein Dritter diese E-Mails für Sie sendet.

In einer E-Mail an den technischen Support (nach einem Besuch des Online-Supports oder der häufig gestellten Fragen) sollte geklärt werden, ob auf Ihrem Server E-Mail-Funktionen verfügbar sind.

Stellen Sie sicher, dass der Mailserver localhost 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 eins 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 das kostenlose Mercury Mail verwenden.

Sie können auch SMTP verwenden, um Ihre E-Mails zu senden. Siehe diese großartige Antwort ​​von Vikas Dwivedi , um zu lernen, wie man das macht.

Aktivieren Sie PHPs benutzerdefiniertes _mail.log_

Zusätzlich zu Ihrer MTA- und PHP-Protokolldatei können Sie Protokollierung für die Funktion mail() aktivieren. Es wird nicht die vollständige SMTP-Interaktion aufgezeichnet, sondern mindestens Funktionsaufrufparameter und Aufrufskript.

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

Siehe http://php.net/manual/en/mail.configuration.php für Details. (Am besten aktivieren Sie diese Optionen in _php.ini_ oder _.user.ini_ oder _.htaccess_.)

Fragen Sie bei einem Mail-Testdienst nach

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

Verwenden Sie einen anderen Mailer

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

All dies kann mit einem professionellen SMTP-Server/Dienstanbieter kombiniert werden. (Da typische gemeinsame Webhosting-Pläne für den 15.08. Hinsichtlich E-Mail-Einrichtung und -Konfigurierbarkeit ein Erfolg oder ein Misserfolg sind.)

473
John Conde

Mail-Header in der Mail-Funktion hinzufügen

$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>'; 
}
32
er.irfankhan11
  1. Versuchen Sie immer, Header in der Mail-Funktion zu senden.
  2. Wenn Sie E-Mails über localhost senden, nehmen Sie die SMTP-Einstellungen zum Versenden von E-Mails vor.
  3. Wenn Sie E-Mails über den Server senden, überprüfen Sie, ob die E-Mail-Versandfunktion auf Ihrem Server aktiviert ist.
21
sonam gupta

verwenden Sie die SMTP-Konfiguration zum Versenden Ihrer E-Mail? Versuchen Sie stattdessen, phpmailer zu verwenden. Sie können die Bibliothek unter https://github.com/PHPMailer/PHPMailer herunterladen. Ich habe meine E-Mail auf folgende Weise 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 = "[email protected]"; // 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
oneDerer

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 Funktion mail() funktioniert nicht in localhost. Laden Sie Ihren Code auf einen Server hoch und versuchen Sie es.

14
user1258544

es hat für mich auf 000webhost funktioniert, indem ich Folgendes getan habe:

$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 halben Stunde Verzögerung empfangen

12
bat .t

Meistens ist die Funktion mail() im 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
Karthik

Versuchen Sie diese beiden Thigs getrennt und zusammen:

  1. if($_POST['submit']){} entfernen
  2. $from entfernen (nur mein Bauch)
9
vldfr

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

Sie müssen die Mail-Erweiterung öffnen und SMTP smtp_port usw. und vor allem Ihren Benutzernamen und Ihr Kennwort festlegen. Ohne das kann keine Mail gesendet werden. Sie können auch die PHPMail-Klasse zum Senden verwenden. 

8
iatboy

Ich denke, das sollte den Trick tun. Ich habe gerade einen if(isset und eine Verkettung zu den Variablen im Text 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>'; 
    }
}

?>
7
Stephen M

Für jeden, der dies vorhat, würde ich die Verwendung von mail nicht empfehlen. Es gibt einige Antworten, die darauf ansprechen, aber nicht das warum davon.

Die mail-Funktion von PHP ist nicht nur undurchsichtig, sie hängt vollständig davon ab, welchen MTA Sie verwenden (d. H. Sendmail), um die Arbeit auszuführen. mail sagt Ihnen NUR, ob der MTA ihn nicht akzeptiert hat (d. h. Sendmail war beim Versuch des Sendens inaktiv). Es kann Ihnen nicht sagen, ob die Mail erfolgreich war, weil sie ausgehändigt wurde. Als solches (als Antwort von John Conde) können Sie sich jetzt mit den Protokollen des MTA beschäftigen und hoffen, dass es Ihnen genug Informationen darüber gibt, dass das Problem nicht behoben wurde. Wenn Sie sich auf einem gemeinsam genutzten Host befinden oder keinen Zugriff auf die MTA-Protokolle haben, haben Sie kein Glück. Leider wird der Standard für die meisten Vanilla-Installationen für Linux auf diese Weise gehandhabt. 

Eine E-Mail-Bibliothek ( PHPMailer , Zend Framework 2+ usw.) hat etwas anderes als mail. Sie öffnen einen Socket direkt zum empfangenden Mailserver und senden dann die SMTP-Mailbefehle direkt über diesen Socket. Mit anderen Worten, die Klasse fungiert als ihr eigener MTA (Beachten Sie, dass Sie die Bibliotheken anweisen können, mail zu verwenden, um die E-Mail schließlich zu senden. Ich würde jedoch dringend empfehlen, dies nicht zu tun.

Das bedeutet für Sie, dass Sie die Antworten des empfangenden Servers direkt sehen können (in PHPMailer können Sie zum Beispiel das Debugging von Ausgaben aktivieren ). Kein Erraten mehr, ob eine Mail nicht gesendet werden konnte oder warum.

Wenn Sie SMTP verwenden (d. H. Sie rufen isSMTP() auf), können Sie mithilfe der SMTPDebug-Eigenschaft ein detailliertes Transkript der SMTP-Konversation abrufen.

Setzen Sie diese Option, indem Sie eine solche Zeile in Ihr Skript aufnehmen:

$mail->SMTPDebug = 2;

Sie profitieren außerdem von einer besseren Schnittstelle. Mit mail müssen Sie alle Ihre Header, Anhänge usw. einrichten. Mit einer Bibliothek haben Sie dazu eine eigene Funktion. Es bedeutet auch, dass die Funktion alle komplizierten Teile (wie Header) ausführt.

7
Machavity

Sie können die Konfigurations-E-Mail nach Codeigniter verwenden, beispielsweise mit smtp (einfacher Weg):

$config = Array(
        'protocol' => 'smtp',
        'smtp_Host' => 'mail.domain.com', //your smtp Host
        'smtp_port' => 26, //default port 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
}

Es funktioniert für mich!

Versuche dies

<?php
$to = "[email protected], [email protected]";
$subject = "HTML email";

$message = "
    <html>
    <head>
       <title>HTML email</title>
    </head>
    <body>
      <p>This email contains HTML Tags!</p>
      <table>
        <tr>
         <th>Firstname</th>
         <th>Lastname</th>
        </tr>
        <tr>
          <td>John</td>
          <td>Doe</td>
        </tr>
      </table>
    </body>
    </html>";

// Always set content-type when sending HTML email
$headers = "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type:text/html;charset=UTF-8" . "\r\n";

// More headers
$headers .= 'From: <[email protected]>' . "\r\n";
$headers .= 'Cc: [email protected]' . "\r\n";

mail($to,$subject,$message,$headers);
?> 
5
Ganga Reddy
$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>";
}
5
Chirag patel

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>
        '; 
    }
}
3

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

Ich verwende SwiftMailer normalerweise, wenn ich Mails mit PHP verschicken muss.


Grundnutzung:

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

In der offiziellen Dokumentation finden Sie weitere Informationen zur Verwendung von SwiftMailer.

2
John Slegers

Möglicherweise ist das Problem die Konfiguration des Mail-Servers. Um diese Art von Problemen zu vermeiden, oder Sie müssen sich nicht um das Mail-Server-Problem kümmern. Ich empfehle Ihnen, PHPMailer zu verwenden. Es ist ein Plugin, das alles enthält, was Sie senden müssen Bei E-Mails müssen Sie nur den SMTP-Port (Port: 25 und 465) aktivieren

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;
     }
2
Jack Ch

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

Die Art und Weise, wie PHP-Mails gesendet werden, ist in php.ini im Abschnitt [mail function]..__ beschrieben. Der 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.

Unterschiedliche MTAs können sendmail implementieren, sie stellen lediglich symbolische Links zu ihren Binärdateien unter diesem Namen her. Zum Beispiel ist in debian standardmäßig postfix. Konfigurieren Sie Ihren MTA für das Senden von E-Mails und testen Sie ihn mit sendmail -v -t -i < message.txt von der Konsole aus. Die Datei message.txt sollte alle Header einer Nachricht und einen Haupttext enthalten. Die Zieladresse für den Umschlag wird aus dem Header To: übernommen. 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 Versenden von E-Mails vom lokalen Host. Es kann auch authentifizierte E-Mails über Ihr Konto in einem öffentlichen E-Mail-Dienst senden. Installieren Sie ssmtp und bearbeiten Sie die Konfiguration /etc/ssmtp/ssmtp.conf. Damit Sie auch lokale System-E-Mails an Unix-Konten weiterleiten 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
2
user3132194

Vergewissern Sie sich, dass Sendmail auf Ihrem Server installiert ist.

Wenn Sie Ihren Code überprüft und festgestellt haben, dass dort nichts stimmt, wechseln Sie zu/var/mail und prüfen Sie, ob der Ordner leer ist.

Wenn es leer ist, müssen Sie Folgendes tun:

Sudo apt-get install sendmail

wenn Sie sich auf einem Ubuntu-Server befinden.

2
Daniel

Zuerst,

Möglicherweise haben Sie zu viele Parameter für die mail () - Funktion ....__ Sie können 5 max. mail(to,subject,message,headers,parameters); Soweit die $from-Variable gilt, sollte dies automatisch von Ihrem Webhost stammen, wenn Sie Linux cPanel verwenden. Es stammt 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 Sie die richtige Reihenfolge der Variablen in Ihrer mail () - Funktion haben . Die mail($to,$subject,$message,etc.) in dieser Reihenfolge. Andernfalls besteht die Möglichkeit, dass sie nicht funktioniert . Lassen Sie mich wissen, ob dies hilft.

1
aidangig

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

In dem Fall, dass Sie einen kostenlosen Abrechnungsdienst wie 000webhost Oder hostinger verwenden, deaktivieren diese Dienstanbieter die Funktion mail(), um die unbeabsichtigte Verwendung von E-Mail-Spoofing, Spam usw. zu verhindern. Ich bevorzuge, 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 in diesem PHP Handbuch nachschlagen, PHP mail ()

Um zu überprüfen, ob Ihr Hosting-Service die Funktion mail () unterstützt, versuchen Sie, diesen Code auszuführen . (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);
?>

Hoffe das hat geholfen.

1

Sie können leere () und isset () - Funktionen verwenden. Wenn Sie möchten, dass es mit anderen Dateien funktioniert, ändern Sie einfach den action='yourphp.php' in die HTML-Datei, die ich Ihnen gebe, und store the PHP script für diese yourphp.php-Datei. Sie müssen auch Ihren index.html in index.php ändern, um die PHP - Funktionalität zu aktivieren. 

PHP 

<?php

    error_reporting(0);
    $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 (!(empty($_POST['name']))) {
                        if (!(empty($_POST['email']))){
                            if (!(empty($_POST['message']))){
                                mail ($to, $subject, $body, $from);
                                echo '<p>Your message has been sent!</p>';
                            }else{
                                echo '<p>Fill your message please.</p>';}
                        }else {
                            echo '<p>Fill your email please.</p>';}
                }else{
                    echo '<p>Fill your name please.</p>';}              
    }else{
            echo '<p>Fill the form.</p>';}
?>

HTML

<html>
    <form method="post" action="?">
        <table>
            <tr><td>Name</td><td><input type='text' name='name' id='name'/></td></tr>
            <tr><td>Email</td><td><input type='text' name='email' id='email'/></td></tr>
            <tr><td>Message</td><td><input type='text' name='message' id='message'/></td></tr>
            <tr><td></td><td><input type='submit' name='submit' id='submit'/></td></tr>
        </table>
    </form>
</html>

Freundliche Grüße!

1
Bishop

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 6 Stunden damit, ein funktionierendes PHP Mail-Skript aufgrund dieses Problems zu beheben. 

Wenn Sie eine Universität besuchen, die XAMPP von www.AceITLab.com betreibt, 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 ein Konto mit niedrigen Sicherheitseinstellungen an ein Google Mail-Konto senden. 

Ja, ich weiß, das ist für echte E-Mails völlig unbrauchbar. Nach meiner Einschätzung haben akademische Einstellungen und die reale Welt jedoch oft wenig Gemeinsamkeiten. 

1
TonyLuigiC

sendmail Die 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)

Standard sendmail Paketinstallation (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  

Bestätigung (der Fähigkeit zu senden)

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

Oben dauerte es ca. 5 Minuten.

Dann habe ich 5 Stunden verschwendet ...
VERGESSEN SIE NICHT, IHREN SPAM-ORDNER ZU PRÜFEN !!!!

0
Bad Loser

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
0
Salim Ibrogimov

Sofern 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: [email protected]\r\n
X-Mailer: yoursite.com mailer\r\n
";

    $to = '"Contact" <[email protected]>'; 
    $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 besonderem Interesse:

  1. wir haben einen mehrzeiligen Header-String 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 beliebigen HTML-Code, einschließlich CSS, hinzufügen, wie Sie es auf einer HTML-Seite tun würden).

Hinweis: Für die <<<EOB-Syntax muss der letzte EOB-Marker am Zeilenanfang beginnen und darf nach dem Semikolon kein Leerzeichen oder sonstiges Zeichen enthalten.

0