我尝试通过 php 向 yahoo 收件人发送邮件。每次我连接到雅虎时,我都会收到收件人地址的 250 状态代码,即使它不存在。我找到了一个从 yahoo 获得正确状态代码的脚本,但我找不到我在脚本中所做的差异或错误。我尝试发送不同的命令并在多台服务器上运行脚本,但对于 RCPT-TO-command,我总是得到 250 响应。为什么我没有得到正确的响应?当收件人不存在时,我想停止我的脚本!
得到正确响应的 verify-email.org 的日志:
存在有关 yahoo.com 的 MX 记录。 连接到 g.mx.mail.yahoo.com SMTP 成功。 =220 mta1062.mail.sp2.yahoo.com ESMTP YSmtp 服务就绪 > HELO verify-email.org =250 mta1062.mail.sp2.yahoo.com > 发件人:<check@verify-email.org> =250 发件人 <check@verify-email.org> 好的 > RCPT 收件人:<sdjrfvn3r@yahoo.com> =554 传递错误:dd 此用户没有 yahoo.com 帐户 (sdjrfvn3r@yahoo.com) [0] - mta1062.mail.sp2.yahoo.com
我的脚本得到错误响应的日志:
C 连接到 h.mx.mail.yahoo.com S 220 mta1144.mail.mud.yahoo.com ESMTP YSmtp 服务就绪 C HELO my-domain.com S 250 mta1144.mail.mud.yahoo.com(152.70 毫秒) C 邮件来自:<existing-address@my-domain.com> S 250 发件人 <existing-address@my-domain.com> 正常(723.29 毫秒) C RCPT 收件人:<sdjrfvn3r@yahoo.com> S 250 收件人 <sdjrfvn3r@yahoo.com> 正常(152.67 毫秒) C 关闭套接字连接 S 连接优雅关闭
您可以在此处找到正常工作的脚本:http: //verify-email.org
我的脚本:
while(preg_match('/^\d\d\d-/', $r = fgets($sock))) {
$response .= $r;
}
$response .= $r;
return $response;
}
$mxRecord = "a.mx.mail.yahoo.com";
$domain = 'example.com';
$mailFrom = 'mailfrom@example.com';
$rcptTo = 'doesntexist2011@yahoo.com';
$commands = array(
"HELO ".$domain."\r\n",
"MAIL FROM: <".$mailFrom.">\r\n",
"RCPT TO: <".$rcptTo.">\r\n",
// "DATA\r\n",
// ... email subject and content
// ".\r\n",
"QUIT\r\n"
);
if($sock = fsockopen($mxRecord, 25, $errno, $errstr, 30)) {
foreach($array as $cmd) {
echo htmlentities($cmd);
echo '<br />';
fwrite($sock, $cmd);
echo htmlentities(getResponse($sock));
echo '<hr />';
}
fclose($sock);
}
else {
echo 'no connection';
}
?>
一些信息:
- 我使用了自己的域(不是 example.com)
- 该脚本位于我的域所指的服务器上
- 该服务器不在 spamhaus.org 之类的任何黑名单上
- “邮件发件人”中使用的邮件地址确实存在
- 我使用 getmxrr() 来获取 yahoo.com 的 mx 条目
- 我尝试过 HELO 和 EHLO -> 总是相同的响应