php-检测是否发送电子邮件
我正在制作一份自动化的时事通讯,我有点被这个问题困住了。 我需要知道电子邮件是否已发送。这是我的密码php-检测是否发送电子邮件,php,email,Php,Email,我正在制作一份自动化的时事通讯,我有点被这个问题困住了。 我需要知道电子邮件是否已发送。这是我的密码 @$send = mail($emailRecipient, $subject, $message, $headers); 我试图将它添加到if语句中,但它不起作用。这里是代码 if( @$send = mail($emailRecipient, $subject, $message, $headers)){ //do something }else{ //do something
@$send = mail($emailRecipient, $subject, $message, $headers);
我试图将它添加到if语句中,但它不起作用。这里是代码
if( @$send = mail($emailRecipient, $subject, $message, $headers)){
//do something
}else{
//do something
}
真相是:不幸的是,你无法可靠地检测到电子邮件是否被发送或接收:电子邮件不是一种可靠的通信形式 调用
mail()
的结果仅表明PHP能够将电子邮件发送给MTA,但这不会表明电子邮件是否实际发送或收件人是否实际收到
如果您想要更可靠,您必须使用除
mail()
之外的其他工具。虽然我从未使用过它,但PHPMailer或其他SMTP库可能会向您提供MTA返回的信息,这将告诉您有关排队传递的更多信息,但如果不轮询跳转消息(可能会或可能不会传递到发件人的收件箱),您无法判断收件人是否收到了电子邮件。首先,我建议使用第三方邮件库(,…)来发送电子邮件,而不是内置的mail
功能。撰写邮件比大多数人意识到的要复杂得多,特别是如果你想写多部分和/或HTML格式的邮件
其次,除了检查邮件是否成功发送到第一个(通常是本地)电子邮件服务之外,几乎不可能确定是否发送了电子邮件。这是由于电子邮件固有的工作方式,对此几乎无能为力
你唯一能(也确实应该)做的就是确保你的系统以一种理智的方式处理被退回的电子邮件。如果一个电子邮件地址不断反弹,考虑取消订阅地址。 你也可以试试这个
$send = mail($to,$subject,$msg);
if($send)
{
echo "Your Account is Successfully Created. You must Activate your account.";
}
else
echo "Failed to send";
仅为完整起见应该提到,有一种方法可以通过
PHP
发送电子邮件,并通过接收MTA(同样,这并不意味着它被发送给用户或在SMTP握手后被悄悄丢弃)来了解它是否真的被接受
理论上,我们可以纯粹在PHP
中编写SMTP客户端,例如使用内置的流函数,以便通过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"
);
$send=mail($emailRecipient,$subject,$message,$headers)
检查返回值$sent like If($send['error_code']==0){echo“successful”}否则{echo“error”}我想在@Daya的答案中添加更多信息,我想在他的答案中进行位修改,具体如下:
如果电子邮件将成功发送,则不是问题,但如果邮件功能有错误,那么开发人员将如何获得错误,为此,他/她可以使用error\u get\u last()
函数获取最后一个错误,修改如下:
if(!$mail) {
print_r( 'Mailer error: ' . error_get_last());
} else {
echo 'Message has been sent.';
}
把@放在邮件之前。i、 e.$send=@mail(..)如果邮件被成功接受以进行传递,则返回TRUE,否则返回FALSE。重要的是要注意,仅仅因为邮件被接受交付,并不意味着邮件将实际到达预定目的地。-换句话说,您无法使用PHP检测电子邮件是否已发送。-1表示“it gives me a error”,但没有说明是哪封邮件。抱歉!:)我相信问题在于您正在检查$send是否被设置为邮件的输出,无论邮件是否成功发送,这都是正确的。需要做的是将mail()
语句置于条件中,或者设置$send=mail()
在if语句之前,只需将$send
置于条件中。需要再等待4分钟:)接受此答案就是PHP声誉如此糟糕的一个完美例子。这只需检查本地邮件服务器(或PHP.ini中配置的SMTP)是否接受发送的电子邮件。邮件服务器随后会尝试将电子邮件发送到收件人的邮件服务器,但这是在PHP的mail()返回后完成的,如其他答案中所述。感谢brenton的建议,我将在将来使用此选项。从现在起,我只需要知道我是否发送了电子邮件。用户是否收到它。谢谢大家!此答案是已接受答案的副本,只是不太准确(缺少@sign)。PHP的mail
不返回数组
if(!$mail) {
print_r( 'Mailer error: ' . error_get_last());
} else {
echo 'Message has been sent.';
}