只是为了完整起见,应该提到有一种方法可以发送电子邮件,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 种类型的信息:
- 接收主机是否还活着并且是否收到电子邮件
- 握手期间是否被退回(SMTP 5xx 响应类)
250 2.0.0 Ok
提交消息文本后是否有 SMTP
同样,这仅用于教育目的,除非您准备好与开发符合标准的 SMTP 客户端的项目结合,否则不要在家里这样做。