2011-02-01 7 views
1

プロキシの背後から外部SMTPサーバーに接続しようとしています。 fsockopenにプロキシの背後からウェブサイトを取得させる方法を考えましたが、SMTPサーバーに接続する方法は分かりませんでした。 SMTPサーバーには、TLS接続とユーザー名とパスワードの認証が必要です。fsockopenを使用してSMTPサーバーに接続すると、PHPでプロキシとして動作しません。

プロキシの背後からウェブページを取得するために必要なものは、次のコードです。

<? 
$proxy_fp = fsockopen('111.111.111.111', '80'); 

if (!$proxy_fp) { 
    return false; 
} 

fputs($proxy_fp, "GET http://wwww.google.com HTTP/1.0\r\nHost: 111.111.111.111\r\n\r\n"); 
while (!feof($proxy_fp)) { 
    $proxy_cont .= fread($proxy_fp, 4096); 
} 
fclose($proxy_fp); 
$proxy_cont = substr($proxy_cont, strpos($proxy_cont, "\r\n\r\n") + 4); 
return $proxy_cont; 
?> 

ここで、プロキシをSMTPサーバーに接続させる方法を教えてください。


--- EDIT ---

<? 
$s = "\r\n"; 

$proxy = '24.47.131.253'; 
$port = 8123; 

$fp = fsockopen($proxy, $port); 
socket_set_timeout($fp, 10, 0); 

fputs($fp, "CONNECT smtp.domain.com:25 HTTP/1.0".$s.$s); 

while(!feof($fp)){ 
    $line = fgets($fp, 4000); 
    echo $line."\n"; 
} 
fclose($fp); 
?> 

私は今、回答に基づいてこれを持っています。問題は、SMTPサーバーからの応答が得られず、空の行だけが表示されることです。誰かが私を正しい方向に向けることができますか?

答えて

2

SMTPとHTTPは相互に互換性のあるプロトコルではありません。実際、彼らはお互いに完全に異なっています。あなたは(より完全な参照用see this)要求されたホストとポートへのTCP接続を取得する必要があります - 、CONNECT yourserver:yourport HTTP/1.0を送信する代わりに、GETやPOSTの:あなたが試みることができる何

HTTP CONNECT方法で抜け穴を使用することです。一部のプロキシは、許可された宛先ポートを443(HTTPS)に制限するか、またはCONNECTトラフィックを検査して、人々が任意のサービス(たとえばSMTP)にトンネリングするのを防ぎます。

ほとんどの組織では、このような操作は「アクセス制御やセキュリティポリシーを迂回する」と解釈される可能性があるので注意してください。

+0

はい、HTTP CONNECTメソッドを使用できます。 – arnaud576875

+0

@ user576875:信頼性の低い - HTTPS接続の転送にCONNECTが実装されました。それを他のプロトコルに使用することはせいぜい信頼できません。 – Piskvor

+0

これは信頼できないものではなく、SSHアクセスの場合でも魅力的です。唯一の問題は、ファイアウォールがアウトバウンドSMTP接続を受け入れるかどうかです。それはそれがうまくいくかどうかを判断するためです。 – wimvds

関連する問題