PHP邮件功能不会向某些服务器发送电子邮件

时间:2010-06-09 08:59:12

标签: php email

我有以下代码适用于某些服务器,但不适用于其他服务器:

$Name = "myname"; //senders name
            $email_sender = "myemail.dia@gmail.com"; //senders e-mail adress
            $recipient = $email; //recipient
            $mail_body = "The text for the mail..."; //mail body
            $subject = "Subject for reviever"; //subject
            $header = "From: ". $Name . " <" . $email_sender . ">\r\n"; 
                        $status = mail($recipient, $subject, $mail_body, $header); 
            print('ENVOI '. $status);

$ status变量为true,但我没有看到任何电子邮件。

3 个答案:

答案 0 :(得分:1)

$ status为true并不表示收件人收到邮件。它只是意味着邮件功能成功地将邮件传递给LOCAL传递代理。之后,它已经脱离了PHP的手。

这个过程看起来像这样:

  1. PHP脚本调用mail()
  2. mail()向本地邮件服务器发送邮件(sendmail,postfix,exim等)。
  3. mail(),在成功完成电子邮件的“投放”后,返回TRUE
  4. 本地邮件服务器连接到收件人的邮件服务器,发送邮件
  5. 收件人的邮件服务器会尽其所能将电子邮件收集到收件人的收件箱中。
  6. 由于mail()返回true,这意味着至少您的发送代码足够正确,不会导致事情在该阶段爆炸。这会在您和收件人的邮件服务器之间留下交付问题:

    a)收件人可能正在使用灰名单(在这种情况下邮件应该最终显示)。也许您的服务器在灰名单超时期限到期之前放弃,因此永远不会进行重试尝试。

    b)您的邮件服务器已列入黑名单。您的服务器和/或其他潜在垃圾邮件源位于同一个网络块中,已添加到收件人订阅的一个或多个反垃圾邮件RBL列表中。

    c)也许远程服务器对标题的正确性非常敏感,而且你的服务器对一个或多个标题有点过于宽松。

    至少这些问题应该在你自己的邮件服务器的maillog中可见(在大多数Unix-ish系统上通常是/ var / log / maillog)。尝试在观看日志的同时发送测试邮件,以查看邮件如何通过系统进行处理。还要检查服务器的外发邮件队列(mailq命令)。也许丢失的信息会卡在那里。

    然后是更大的问题:

    d)远程邮件服务器正在接受该邮件,但由于它被标记为垃圾邮件或被感染,因此默默地抛弃它。这是您无法从自己的邮件日志中检测到的,因为这完全是在收件人端完成的。所有你会看到的是“250 OK”成功消息。

    为此,您需要收件人帮助诊断问题。

答案 1 :(得分:0)

这可能有也可能没有关系,但你有一个非常简单的标题,我会用下面的内容替换你的标题变量,看看是否会改变你的任何内容。

$headers = 'From: ' .$email_sender. "\r\n" .
    'Reply-To: ' .$email_sender. "\r\n" .
    'X-Mailer: PHP/' . phpversion();

答案 2 :(得分:0)

确保有问题的服务器上的smtp设置正确。