0
PHPを使用していくつかのsmtpホスト(yahoo、mail、gmailなど)に接続しようとしています。PHPソケットを使用したSMTPサーバーからの応答の取得
もっと正確には、特定のホストからのIPタイムアウトをバインドします。
私は、メインIPがSMTPホストにアクセスできるかどうかをチェックしていないことに注意してください.IPのインターフェイスにバインドされていることを確認する必要があります。
ソケットに接続してIPをバインドできますが、出力が得られません。 これは私のコードです:
<?php
function error() {
$strerr = socket_last_error();
$strmsg = socket_strerror($strerr);
return $strmsg;
}
$ip = $argv[1];
$port = 25;
$hosts = array(
"smtp.gmail.com",
"mailin-01.mx.aol.com",
"mx2.hotmail.com",
"mta7.am0.yahoodns.net"
);
$host = "smtp.gmail.com";
foreach ($hosts as $key) {
if (!($sock = socket_create(AF_INET, SOCK_STREAM, 0))) {
echo error();
}
if (!socket_bind($sock, $ip)) {
echo "Unable to bind to specific IP.";
}
//Check can we connect to the socket
if (!socket_connect($sock, $key, $port)) {
echo error() . "\n";
}
else {
if (socket_recv($sock, $buf, 150, MSG_PEEK) === FALSE) {
echo error() . "\n";
}
echo $buf;
}
socket_shutdown($sock);
socket_close($sock);
}
私は、CLIからスクリプトを実行しています。
Steffen Ullrich:ありがとうございました!私はフラグを 'MSG_PEEK'に変更し、何らかの(種類の)応答を得ることができました。何が問題になるのですか、私は完全なバッファを受け取るかどうか分かりません。その価値は正しく変わることがありますか?私はSMTPと通信する必要はありません、私は特定のIPのためのサーバーからの返信だけを参照する必要があります。私はあなたが更新されたコードを見て、私にこの正しい方法を教えていただければ幸いです。どうもありがとう! – fugitive
@fugitive:なぜ、あなたは単純に 'socket_recv'をフラグなしで呼び出さないのか分かりません。それとは別に、SMTPプロトコルを理解し、それに応じて受け取ったデータを解析するために必要なものがすべてあることを確認してください。最も単純で最も一般的なケースでは、正確に1つの行が得られますが、さらに多くの行が存在する可能性があります。詳細については、[the SMTP standard](https://tools.ietf.org/html/rfc5321)を参照してください。 –