2017-04-17 5 views
0

PHPを使用していくつかのsmtpホスト(ya​​hoo、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からスクリプトを実行しています。

答えて

1
  if (socket_recv($sock, $buf, 500, MSG_WAITALL) === FALSE) { 

あなたは500のバイトを送信するためにサーバーを待っています。サーバーからのウェルカムメッセージが短い場合は、明示的にMSG_WAITALLと設定しているので、500バイトを待機します。しかし、サーバーはそれ以上のデータを送信せず、クライアントがSMTPダイアログを続行するのを待っているため、接続を閉じることもなく(recvも返す)。これは、あなたがこの行にこだわっていることを意味します。

+0

Steffen Ullrich:ありがとうございました!私はフラグを 'MSG_PEEK'に変更し、何らかの(種類の)応答を得ることができました。何が問題になるのですか、私は完全なバッファを受け取るかどうか分かりません。その価値は正しく変わることがありますか?私はSMTPと通信する必要はありません、私は特定のIPのためのサーバーからの返信だけを参照する必要があります。私はあなたが更新されたコードを見て、私にこの正しい方法を教えていただければ幸いです。どうもありがとう! – fugitive

+0

@fugitive:なぜ、あなたは単純に 'socket_recv'をフラグなしで呼び出さないのか分かりません。それとは別に、SMTPプロトコルを理解し、それに応じて受け取ったデータを解析するために必要なものがすべてあることを確認してください。最も単純で最も一般的なケースでは、正確に1つの行が得られますが、さらに多くの行が存在する可能性があります。詳細については、[the SMTP standard](https://tools.ietf.org/html/rfc5321)を参照してください。 –

関連する問題