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.';
}