我有以下代码适用于某些服务器,但不适用于其他服务器:
$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,但我没有看到任何电子邮件。
答案 0 :(得分:1)
$ status为true并不表示收件人收到邮件。它只是意味着邮件功能成功地将邮件传递给LOCAL传递代理。之后,它已经脱离了PHP的手。
这个过程看起来像这样:
mail()
mail()
向本地邮件服务器发送邮件(sendmail,postfix,exim等)。mail()
,在成功完成电子邮件的“投放”后,返回TRUE
由于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设置正确。