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

我试着创建了一个简单的邮件表单。表单本身在我的index.html页面上,但它提交到一个单独的“感谢您的提交”页面thanks . PHP,其中嵌入了上述PHP代码。 代码完美地提交,但从未发送电子邮件。我该如何解决这个问题?


当前回答

对于任何发现这一点的人,我不建议使用邮件。有一些答案涉及到这个问题,但没有解释为什么会这样。

PHP's mail function is not only opaque, it fully relies on whatever MTA you use (i.e. Sendmail) to do the work. mail will only tell you if the MTA failed to accept it (i.e. Sendmail was down when you tried to send). It cannot tell you if the mail was successful because it's handed it off. As such (as John Conde's answer details), you now get to fiddle with the logs of the MTA and hope that it tells you enough about the failure to fix it. If you're on a shared host or don't have access to the MTA logs, you're out of luck. Sadly, the default for most vanilla installs for Linux handle it this way.

邮件库(PHPMailer、Zend Framework 2+等)的功能与邮件非常不同。它们直接打开接收邮件服务器的套接字,然后通过该套接字直接发送SMTP邮件命令。换句话说,类充当自己的MTA(注意,您可以告诉库使用邮件来最终发送邮件,但我强烈建议您不要这样做)。

这意味着您可以直接看到来自接收服务器的响应(例如,在PHPMailer中,您可以打开调试输出)。不用再猜测邮件是否发送失败或原因。

如果您正在使用SMTP(即您正在调用isSMTP()),您可以使用SMTPDebug属性获得SMTP对话的详细记录。 通过在脚本中包含如下一行来设置该选项: $mail->SMTPDebug = 2;

您还可以获得更好的界面。对于邮件,你必须设置所有的标题,附件等。有了库,就有了专门的函数来实现这一点。这也意味着函数正在处理所有棘手的部分(比如头文件)。

其他回答

这可能是一个问题,“From:”$电子邮件地址在这部分的$头:

From: \"$name\" <$email>

尝试一下,发送一封没有标题部分的电子邮件,比如:

mail('user@example.com', $subject, $message); 

如果是这种情况,请尝试使用在您试图从中发送邮件的系统中已经创建的电子邮件帐户。

以我为例,这封电子邮件发送得很好,但却很难收到,因为整个信息在一行中超过998个字符。我需要使用以下行使最大长度为70的行:wordwrap($email_message, 70, "\r\n");。

https://www.rfc-editor.org/rfc/rfc5322#section-2.1.1

该规范对一行中的字符数量有两个限制。每行字符必须不超过998个字符,不超过78个字符,不包括CRLF字符。

只需在发送邮件之前添加一些标题:

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

还有一件事。mail()函数在本地主机中不起作用。将代码上传到服务器并尝试。

$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>";
}

Debian 10.0.0 ('Buster')的Sendmail安装实际上很简单!

php . ini

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

标准sendmail包安装(允许'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

其他有用的命令:

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

验证(发送能力)

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

以上花费了大约5分钟。然后我浪费了5个小时…别忘了检查你的垃圾邮件文件夹!