php - 检测是否发送了电子邮件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php - 检测是否发送了电子邮件相关的知识,希望对你有一定的参考价值。

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

 @$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";
}
另一答案

首先,我建议使用第三方邮件库(SwiftMailerPHPMailerZend_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
");
fwrite($fp, "MAIL FROM: youremailaddress@something.tld
");
fwrite($fp, "RCPT TO: recipient@remotedomain.com
");
fwrite($fp, "DATA
");
fwrite(
    $fp,
    "Subject: your subject text
" . 
    "First line of message body
" .
    "At the end of the message body one single period char should be placed before and after EOL character
" .
    "Like this: 
" .
    ".
" 
);

当然,这显然是不完整的(有经验的开发人员会注意到我既没有收听也没有解析我得到的SMTP响应)。为了使用这种方法,必须严格重新发明PHP语言的轮子。

如何用它来检测是否发送了电子邮件?

那么,你至少会有3种类型的信息:

  1. 是否接收主机是否存在并且完全接收电子邮件
  2. 是否在握手期间没有退回(SMTP 5xx响应类)
  3. 提交消息文本后是否有SMTP 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";
另一答案

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

检查$发送的返回值,如If($ send ['error_code'] == 0){echo“success”; } Else {Echo“错误”; }

以上是关于php - 检测是否发送了电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

PHP实现查看邮件是否被阅读

shell脚本检查进程是不是存在不存在发送邮件

[moka摘录]查看邮件是否已被阅读

PHP必用代码片段

我应该如何使用 Outlook 发送代码片段?

用于打开 Outlook 并发送电子邮件的 PHP 代码