[英]php - detect if email is sent
我正在建立一个自动通讯,我有点坚持这个问题。 我需要知道电子邮件是否已发送。 这是我的代码
@$send = mail($emailRecipient, $subject, $message, $headers);
我试图将它添加到 if 语句中,但这里的代码不起作用。
if( @$send = mail($emailRecipient, $subject, $message, $headers)){
//do something
}else{
//do something
}
if(@mail($emailRecipient, $subject, $message, $headers))
{
echo "Mail Sent Successfully";
}else{
echo "Mail Not Sent";
}
首先,我建议使用第三方邮件库( SwiftMailer 、 PHPMailer 、 Zend_Mail ...)来发送电子邮件,而不是使用内置的mail
功能。 撰写邮件比大多数人意识到的要复杂,尤其是当您想要制作多部分和/或 HTML 格式的电子邮件时。
其次,除了检查邮件是否成功发送到第一个(通常是本地)电子邮件服务之外,几乎不可能确定是否发送了电子邮件。 这是由于电子邮件固有的工作方式,对此几乎无能为力。
您唯一可以(并且确实应该)做的事情就是确保您的系统以理智的方式处理退回的电子邮件。 例如。 如果电子邮件地址不断退回,请考虑取消订阅该地址。
事实是这样的:不幸的是,您无法可靠地检测到电子邮件是发送还是接收:电子邮件不是一种可靠的通信形式。
调用mail()
仅表明 PHP 能够将电子邮件发送到 MTA,但这不会表明电子邮件是否已实际发送或收件人是否实际收到。
如果您想要更高的可靠性,则必须使用mail()
以外的其他方法。 虽然我从未使用过它,但 PHPMailer 或其他 SMTP 库可能会给你从 MTA 返回的信息,它会告诉你更多关于排队传递的信息,但不会轮询退回邮件(可能会或可能不会传递到发件人的收件箱)您无法判断收件人是否收到了电子邮件。
只是为了完整起见,应该提到有一种方法可以通过PHP
发送电子邮件,并知道它是否真的被接收 MTA 接受(同样,这并不意味着它被传递给用户或在 SMTP 之后静默丢弃握手)与否。
理论上可以完全用PHP
编写 SMTP 客户端,例如使用内置的Stream 函数(如stream_socket_client) ,以便通过 SMTP 协议请求和响应中形成的直接原始 tcp 连接与接收 MTA 进行对话。
发出 SMTP 命令的一般逻辑如下:
<?php
$fp = stream_socket_client("tcp://fqdn-of-receiving-mta:25", $errno, $errstr, 90);
fwrite($fp, "EHLO LOCALHOST\r\n");
fwrite($fp, "MAIL FROM: youremailaddress@something.tld\r\n");
fwrite($fp, "RCPT TO: recipient@remotedomain.com\r\n");
fwrite($fp, "DATA\r\n");
fwrite(
$fp,
"Subject: your subject text\r\n" .
"First line of message body\r\n" .
"At the end of the message body one single period char should be placed before and after EOL character\r\n" .
"Like this: \r\n" .
".\r\n"
);
当然,这显然是不完整的(有经验的开发人员会注意到我既没有听也没有解析我得到的 SMTP 响应)。 为了使用这种方法,必须在PHP
语言中认真地重新发明轮子。
那么,您至少会拥有 3 种类型的信息:
250 2.0.0 Ok
同样,这仅用于教育目的,除非您准备好与开发符合标准的 SMTP 客户端的项目相结合,否则不要在家里这样做。
你也可以试试这个
$send = mail($to,$subject,$msg);
if($send)
{
echo "Your Account is Successfully Created. You must Activate your account.";
}
else
echo "Failed to send";
我想在@Daya 的回答中添加更多信息,我想在他的回答中做一些修改,如下所示:
如果电子邮件将成功发送,则不是问题,但如果邮件函数有错误,那么开发人员将如何获得错误,为此他/她可以使用error_get_last()
函数获取最后一个错误,修改如下:
if(!$mail) {
print_r( 'Mailer error: ' . error_get_last());
} else {
echo 'Message has been sent.';
}
$send = mail($emailRecipient, $subject, $message, $headers);
检查 $sent 的返回值,如 If($send['error_code'] == 0) { echo "successful"; } Else { 回声“错误”; }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.