PHP - 在哪些情况下,电子邮件不能被接受交付?

时间:2017-07-20 23:03:29

标签: php email backend

使用以下语句,我们将得到一个布尔值,我们尝试发送的邮件是否被接受传递:

if(mail($to $subject $message $headers))

因为即使我没有连接到互联网,我总是得到true,我认为这个回复与事实是否真实发送无关。那么我可以在哪些情况下获得false?这个“被接受交付”的地方发生了(在我的电脑上,在服务器上,在以太网中......)?

3 个答案:

答案 0 :(得分:2)

mail()函数使用系统邮件程序 - 可以是sendmail,也可以是邮件传输代理。返回值仅表示消息已成功传递到系统配置的任何中间设备(通常是linux系统上的sendmail)。

如果您需要有关可传递性的实际数据,您可以使用SendGrid或MailGun等第三方邮件服务,它们使用API​​发送,也可以报告交付状态和其他数据。

答案 1 :(得分:0)

如php.net文档中所述,

  

mail()如果成功接受邮件,则返回TRUE   交货,否则为FALSE。重要的是要注意,因为   邮件已被接受发送,这并不意味着邮件会发送   实际到达目的地。

换句话说,如果mail()函数获得了发送邮件所需的所有值,则send()函数返回true。但无法知道邮件是否收到,因为PHP不是发送邮件的人。邮件服务器(很可能是exim)是。

有一个很好的PHP库可以帮助您验证电子邮件是否有效/存在并且属于用户。它被称为kickbox

所以在使用mail()函数之前,你可以在kickbox中运行电子邮件,并结合mail()的返回true,你可以假设只要exim完成了他的工作就会发送邮件。

您还可以使用像MailJet这样的API以您的名义发送电子邮件,而不是使用服务器邮件服务器,直接从API接收状态报告,以了解邮件服务器在发送邮件时是否成功。

答案 2 :(得分:0)

由于此处的大多数回复已经回答了您的问题,我是否可以建议一个替代方案,即PHPMailer(https://github.com/PHPMailer/PHPMailer)?

它是一个用PHP发送电子邮件的库,您可以在发送电子邮件时定义SMTP,帐户信息甚至附加文件。它甚至允许对各种类型进行SMTP调试,使用" $ mail-> SMTPDebug = SMTP :: DEBUG_SERVER;"例如。

也很容易使用。您可以在此处参考官方教程:https://github.com/PHPMailer/PHPMailer/wiki/Tutorial