仅为了完整性而提及,通过`PHP`发送电子邮件并知道是否被接收的方法是存在的(这并不意味着它已被交付给用户或在SMTP握手后被静默丢弃)。
理论上,可以纯粹使用内置的流功能(例如
stream_socket_client)编写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"
);
当然,这显然是不完整的(有经验的开发人员会注意到我既没有侦听也没有解析我收到的SMTP响应)。为了使用这种方法,必须在
PHP
语言中进行严格的重新发明轮子。
这将如何用于检测电子邮件是否已发送?
嗯,您至少会有3种类型的信息:
1. 接收主机是否存活并能够接收电子邮件消息
2. 在握手期间是否避免了反弹(SMTP 5xx响应类)
3. 在提交消息文本后是否收到SMTP
250 2.0.0 Ok
再次强调,这仅用于教育目的,除非您准备开发符合标准的SMTP客户端项目,否则请勿在家中尝试。
mail
文档中可以得知:如果邮件成功被接收并且准备发送,则返回TRUE,否则返回FALSE。需要注意的是,即使成功接收邮件并准备发送,也不意味着邮件一定会到达目的地。换句话说,你无法使用PHP检测电子邮件是否已经发送。 - Gordonmail()
语句放在条件中,要么在if语句之前设置$send = mail();
并将$send
放在条件中。 - EM-Creations