繁体   English   中英

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

[英]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";
}

首先,我建议使用第三方邮件库( 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\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. 提交消息文本后是否收到 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";

我想在@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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM