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運行腳本。
Steffen Ullrich:謝謝你的幫助!我已將標誌更改爲'MSG_PEEK',並能夠獲得某種(類型)的響應。什麼麻煩我,我不知道我會收到完整的緩衝區,並且這個值可以變化嗎?我不需要與SMTP通信,我只需要查看服務器對特定IP的回覆。如果你看一下更新的代碼,我會很感激,並讓我知道這是正確的方式。非常感謝! – fugitive
@fugitive:我不知道你爲什麼不簡單地調用'socket_recv'沒有任何標誌。除此之外,要確保您擁有了解SMTP協議所需的一切,並解析相應的數據。在最簡單和最常見的情況下,您只能得到一行,但可能會有更多行。有關更多信息,請參閱[SMTP標準](https://tools.ietf.org/html/rfc5321)。 –