14

我正在构建一个自动通讯,我有点被这个问题困扰。我需要知道电子邮件是否已发送。这是我的代码

 @$send = mail($emailRecipient, $subject, $message, $headers);

我试图将它添加到 if 语句中,但它在这里不起作用是代码。

if( @$send = mail($emailRecipient, $subject, $message, $headers)){
   //do something
}else{
  //do something
}
4

7 回答 7

33
if(@mail($emailRecipient, $subject, $message, $headers))
{
  echo "Mail Sent Successfully";
}else{
  echo "Mail Not Sent";
}
于 2013-01-07T07:13:50.497 回答
13

首先,我建议使用第三方邮件库(SwiftMailerPHPMailerZend_Mail ...)而不是内置mail函数来发送电子邮件。撰写邮件比大多数人意识到的要复杂,尤其是如果您想编写多部分和/或 HTML 格式的电子邮件。

其次,除了检查邮件是否成功发送到第一个(通常是本地)电子邮件服务之外,几乎不可能确定是否发送了电子邮件。这是由于电子邮件固有的工作方式,并且对此无能为力。

您唯一可以(并且确实应该)做的事情就是确保您的系统以理智的方式处理退回的电子邮件。例如。如果电子邮件地址不断退回,请考虑取消订阅该地址。

于 2013-01-07T07:24:51.563 回答
5

这是事实:不幸的是,您无法可靠地检测是否发送或接收了电子邮件:电子邮件不是一种可靠的通信形式。

调用的结果mail()仅表明 PHP 能够将电子邮件发送到 MTA,但这不会表明电子邮件是否实际发送或收件人实际收到了它。

如果您想要更高的可靠性,则必须使用mail(). 虽然我从未使用过它,但 PHPMailer 或其他 SMTP 库可能会为您提供 MTA 返回的信息,这将告诉您有关排队传递的更多信息,但不会轮询退回邮件(可能会或可能不会传递到发件人的收件箱)您无法判断收件人是否收到了电子邮件。

于 2013-01-07T07:21:40.690 回答
2

只是为了完整起见,应该提到有一种方法可以发送电子邮件,PHP并通过接收 MTA 知道它是否真的被接受(这并不意味着它被传递给用户或在 SMTP 握手后静默丢弃) 或不。

理论上可以编写一个纯粹的 SMTP 客户端,例如使用像stream_socket_clientPHP这样的内置流函数,以便通过在 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 种类型的信息:

  1. 接收主机是否还活着并且是否收到电子邮件
  2. 握手期间是否被退回(SMTP 5xx 响应类)
  3. 250 2.0.0 Ok提交消息文本后是否有 SMTP

同样,这仅用于教育目的,除非您准备好与开发符合标准的 SMTP 客户端的项目结合,否则不要在家里这样做。

于 2018-03-02T12:13:21.857 回答
0

你也可以试试这个

$send = mail($to,$subject,$msg);
if($send)
{
    echo "Your Account is Successfully Created. You must Activate your account.";
}
else
    echo "Failed to send";
于 2014-12-10T09:16:43.227 回答
0

我想在@Daya 的回答中添加更多信息,我想在他的回答中进行一些修改,如下所示:

如果电子邮件发送成功,则不是问题,但如果邮件功能有错误,那么开发人员将如何得到错误,为此他/她可以使用error_get_last()函数获取最后一个错误,修改如下:

if(!$mail) {
  print_r( 'Mailer error: ' . error_get_last());
} else {
  echo 'Message has been sent.';
}
于 2020-01-27T12:39:31.330 回答
-3

$send = mail($emailRecipient, $subject, $message, $headers);

检查 $sent 的返回值,例如 If($send['error_code'] == 0) { echo "successful"; } 否则 { 回声“错误”;}

于 2018-03-02T12:22:23.673 回答