PHP 経由で yahoo 受信者にメールを送信しようとしています。yahoo に接続するたびに、受信者アドレスが存在しない場合でも、250 ステータス コードが表示されます。yahoo から正しいステータス コードを取得するスクリプトを見つけましたが、スクリプトで行った違いや間違いを見つけることができません。さまざまなコマンドを送信して、いくつかのサーバーでスクリプトを実行しようとしましたが、RCPT-TO-command に対して常に 250 応答が返されます。正しい応答が得られないのはなぜですか? 受信者が存在しないときにスクリプトを停止したい!
正しい応答を取得する verify-email.org のログ:
yahoo.com に関する MX レコードが存在します。 g.m.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> OK > RCPT TO: <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 メール FROM: <existing-address@my-domain.com> S 250 送信者 <existing-address@my-domain.com> OK (723.29 ミリ秒) C RCPT TO: <sdjrfvn3r@yahoo.com> S 250 受信者 <sdjrfvn3r@yahoo.com> OK (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 のようなブラックリストに載っていません。
- 「Mail From」に使用したメールアドレスが存在する
- getmxrr() を使用して、yahoo.com の mx エントリを取得します。
- HELO と EHLO を試しました -> 常に同じ応答