569 Stimmen

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

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

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

12voto

Karthik Punkte 317

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


SMTPconfig.php


SMTPmail.php

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);
            // VERBINDUNG SCHLIESSEN UND BEENDEN ... 
            fputs ($SMTPIN, "QUIT\r\n"); 
            fclose($SMTPIN); 
            // 
        } 
        return $talk;
    } 
}
?>

contact_email.php

'.$$_POST['companyName'].''.$$_POST['tel'].''.''.$$_POST['message'];
    $SMTPMail = new SMTPClient ($SmtpServer, $SmtpPort, $SmtpUser, $SmtpPass, $from, $to, $subject, $body);
    $SMTPChat = $SMTPMail->SendMail();
}
?>

11voto

Machavity Punkte 29692

Für alle, die dies zukünftig finden, würde ich mail nicht empfehlen. Es gibt einige Antworten, die darauf eingehen, aber nicht das Warum davon.

Die mail-Funktion von PHP ist nicht nur undurchsichtig, sie verlässt sich vollständig auf den von Ihnen verwendeten MTA (z.B. Sendmail), um die Arbeit zu erledigen. mail wird Ihnen nur mitteilen, wenn der MTA es abgelehnt hat (z.B. Sendmail war aus, als Sie versucht haben zu senden). Es kann Ihnen nicht mitteilen, ob die Mail erfolgreich war, weil es diese übergeben hat. Daher (wie John Conde's Antwort zeigt), müssen Sie nun mit den Protokollen des MTA herumexperimentieren und hoffen, dass es Ihnen genug über das Versagen erzählt, um es zu beheben. Wenn Sie auf einem Shared Host sind oder keinen Zugriff auf die MTA-Protokolle haben, haben Sie Pech. Leider ist das Standardverhalten für die meisten Vanilla-Installationen von Linux auf diese Weise.

Ein Mail-Bibliothek (PHPMailer, Zend Framework 2+, usw.) macht etwas ganz anderes als mail. Sie öffnen eine Verbindung direkt zum empfangenden Mail-Server und senden dann die SMTP-Mail-Befehle direkt über diese Verbindung. Mit anderen Worten, die Klasse fungiert als ihr eigener MTA (beachten Sie, dass Sie den Bibliotheken sagen können, mail für das letztendliche Senden der Mail zu verwenden, aber ich würde Ihnen dringend davon abraten).

Dies bedeutet, dass Sie die Antworten des empfangenden Servers direkt sehen können (in PHPMailer können Sie beispielsweise Debugging-Ausgabe aktivieren). Kein Rätselraten mehr, ob eine E-Mail nicht gesendet wurde oder warum.

Wenn Sie SMTP nutzen (d.h. Sie rufen isSMTP() auf), können Sie eine detaillierte Mitschrift des SMTP-Gesprächs mit der SMTPDebug-Eigenschaft erhalten.

Aktivieren Sie diese Option, indem Sie eine Zeile wie diese in Ihr Skript einfügen:

$mail->SMTPDebug = 2;

Sie erhalten auch den Vorteil einer besseren Benutzeroberfläche. Bei mail müssen Sie alle Ihre Header, Anhänge usw. einrichten. Mit einer Bibliothek haben Sie eine dedizierte Funktion, um das zu erledigen. Das bedeutet auch, dass die Funktion alle kniffligen Teile erledigt (wie Header).

11voto

iatboy Punkte 1293

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 und so weiter einstellen und vor allem Ihren Benutzernamen und Ihr Passwort angeben. Ohne das kann keine E-Mail gesendet werden. Außerdem können Sie die PHPMail-Klasse verwenden, um zu senden.

11voto

vldfr Punkte 183

Versuchen Sie diese beiden Dinge getrennt und gemeinsam:

  1. entfernen Sie das if($_POST['submit']){}
  2. entfernen Sie $from (nur mein Bauchgefühl)

10voto

Stephen M Punkte 101

Ich denke, das sollte funktionieren. Ich habe einfach ein if(isset hinzugefügt und Konkatenation zu den Variablen im Body, um PHP von HTML zu trennen.

Deine Nachricht wurde gesendet!';
    } 
    else 
    { 
        echo 'Etwas ist schief gelaufen, geh zurück und versuch es erneut!'; 
    }
}

?>

CodeJaeger.com

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

Powered by:

X