2017-04-17 66 views
0

我正嘗試使用PHP連接smtp主機(yahoo,mail,gmail等),並檢查響應。使用PHP套接字獲取來自SMTP服務器的響應

更確切地說 - 是否綁定來自特定主機的IP超時。

請注意,我沒有檢查是否能夠訪問SMTP主機的主IP,我需要檢查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個字節。如果來自服務器的歡迎消息較短,則您仍等待500字節,因爲您已明確設置了MSG_WAITALL。但是服務器不會發送更多數據,也不會關閉連接(這會使recv返回),因爲它正在等待客戶端繼續使用SMTP對話框。這意味着你被困在這條線上。

+0

Steffen Ullrich:謝謝你的幫助!我已將標誌更改爲'MSG_PEEK',並能夠獲得某種(類型)的響應。什麼麻煩我,我不知道我會收到完整的緩衝區,並且這個值可以變化嗎?我不需要與SMTP通信,我只需要查看服務器對特定IP的回覆。如果你看一下更新的代碼,我會很感激,並讓我知道這是正確的方式。非常感謝! – fugitive

+0

@fugitive:我不知道你爲什麼不簡單地調用'socket_recv'沒有任何標誌。除此之外,要確保您擁有了解SMTP協議所需的一切,並解析相應的數據。在最簡單和最常見的情況下,您只能得到一行,但可能會有更多行。有關更多信息,請參閱[SMTP標準](https://tools.ietf.org/html/rfc5321)。 –