【发布时间】:2011-06-22 01:02:06
【问题描述】:
我尝试通过 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 > 发件人:=250 发件人 好的 > RCPT 收件人: =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 邮件来自:S 250 发件人 正常(723.29 毫秒) C RCPT 收件人: S 250 收件人 正常(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 -> 总是相同的响应
【问题讨论】:
-
您是否找到了从 yahoo 获取正确 554 代码的解决方案?我也在寻找解决方案很长时间。
-
试试这个。 pypi.python.org/pypi/validate_email。但我不确定您是否会看到 yahoo.com 地址的结果有任何变化,因为他们不合作。
-
我写了一个 python 脚本来破解 verify-email.org gist.github.com/arulrajnet/eaecf393eebd57264e09 你可以使用它。但是你必须使用代理来绕过每小时 5 个请求的限制。
标签: php email smtp yahoo verify