使用以下语句,我们将得到一个布尔值,我们尝试发送的邮件是否被接受传递:
if(mail($to $subject $message $headers))
因为即使我没有连接到互联网,我总是得到true
,我认为这个回复与事实是否真实发送无关。那么我可以在哪些情况下获得false
?这个“被接受交付”的地方发生了(在我的电脑上,在服务器上,在以太网中......)?
答案 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