SMTPサーバーでプロキシを介してTELNETに接続するスクリプトをPHPで作成したいと考えています。私がこれまでに持っているのは、これらの2つのバリアントです:
1 FSOCKOPEN (この接続をプロキシできない)
$connection = fsockopen("smtp.comcast.net",25,$errno,$errstr,10);
if(!$connection)
{
echo "Connection error";
}
else
{
$command = "HELO smtp.comcast.net\r\n";
fwrite($connection,$command);
while (!feof($connection))
{
echo fgets($connection, 128)."\n";
}
$command = "AUTH LOGIN\r\n";
fwrite($connection,$command);
while (!feof($connection))
{
echo fgets($connection, 128)."\n";
}
$command = base64_encode("username")."\r\n";
fwrite($connection,$command);
while (!feof($connection))
{
echo fgets($connection, 128)."\n";
}
$command = base64_encode("password")."\r\n";
fwrite($connection,$command);
while (!feof($connection))
{
echo fgets($connection, 128)."\n";
}
$command = "QUIT\r\n";
fwrite($connection,$command);
while (!feof($connection))
{
echo fgets($connection, 128)."\n";
}
}
しかし、それは私を出力しています:
220 omta01.emeryville.ca.mail.comcast.net comcast ESMTP server ready
250 omta01.emeryville.ca.mail.comcast.net hello [xx.xx.xx.xx], pleased to meet you
334 VXNlcm5hbWU6
魔女は大丈夫です
そして別の変種
2 カールクラス
class ProxySmtp
{
private $server;
private $port;
private $proxy;
private $timeout;
private $curl_connection;
public function __construct($server,$port,$timeout = 10,$proxy = NULL)
{
echo "SERVER: $server:$port \n";
echo "PROXY: $proxy \n";
echo "TIMEOUT: $timeout \n";
// Set the config
$this->server = $server;
$this->port = $port;
$this->timeout = $timeout;
$this->proxy = $proxy;
// Start the curl
$this->curl_connection = curl_init($this->server.":".$this->port);
var_dump($this->curl_connection);
}
// Setters
public function setServer($newserver)
{
$this->server = $newserver;
}
public function setPort($newport)
{
$this->port = $newport;
}
public function setProxy($newproxy)
{
$this->proxy = $newproxy;
}
public function setTimeout($newtimeout)
{
$this->timeout = $newtimeout;
}
// Getters
public function getServer()
{
echo $this->server;
return $this->server;
}
public function curl_telnet($query)
{
if (!function_exists('curl_init'))
{
user_error('"curl_init()" function does not exist.', E_USER_WARNING);
return false;
}
curl_setopt($this->curl_connection, CURLOPT_TIMEOUT,$this->timeout);
curl_setopt($this->curl_connection, CURLOPT_CONNECTTIMEOUT,$this->timeout);
curl_setopt($this->curl_connection, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($this->curl_connection, CURLOPT_CUSTOMREQUEST,$query);
if($this->proxy != NULL)
{
echo "USING PROXY : ".$this->proxy."\n";
curl_setopt($this->curl_connection,CURLOPT_PROXY,$this->proxy);
curl_setopt($this->curl_connection,CURLOPT_PROXYTYPE,CURLPROXY_SOCKS5);
}
$output=curl_exec($this->curl_connection);
//curl_close($this->curl_connection);
if($output == false)
{
echo "CONNECTION ERROR!\n";
}
return $output;
}
public function __destruct()
{
$Destroy = curl_close($this->curl_connection);
echo "Object destroyed (".$Destroy.")! \n";
}
}
// Server,port,timeout,proxy(optional)
$ProxyAndPort = $Proxy.":".$ProxyPort;
$Smtp = new ProxySmtp($Server,$Port,$Timeout,$ProxyAndPort);
var_dump($Smtp->getServer());
var_dump($Smtp->curl_telnet("EHLO $User \r\n"));
var_dump($Smtp->curl_telnet("AUTH LOGIN \r\n"));
var_dump($Smtp->curl_telnet(base64_encode($user)." \r\n"));
var_dump($Smtp->curl_telnet(base64_encode($pass)." \r\n"));
var_dump($Smtp->curl_telnet("QUIT \r\n"));
魔女がくれます
string(389) "220 omta12.westchester.pa.mail.comcast.net comcast ESMTP server ready
250-omta12.westchester.pa.mail.comcast.net hello [85.204.11.249], pleased to meet you
250-HELP
250-AUTH LOGIN PLAIN
250-SIZE 36700160
250-ENHANCEDSTATUSCODES
250-8BITMIME
250-STARTTLS
250 OK
500 5.5.1 command unrecognized
500 5.5.1 command unrecognized
450 4.7.0 too many invalid commands (closing session)
....
....
そして、私を非常に悩ませている6つの質問があります。
1 なぜ簡単なコマンドでそれが私に与えられる500 5.5.1
のですか? これは不可能です!450 4.7.0
EHLO
2 最初の例は で動作しますfsockopen
が、'curl' ウィッチを使用した例はより強力で、プロキシ機能とオブジェクトとクラスを備えていると考えられるのはなぜですか?
3 この ProxySmtp クラスが他のサーバーでも問題なく動作するのはなぜですか?
4 上記のすべてのコマンドを cmd.exe (RAW スタイル) で複製し、電子メールを送信できるのはなぜですか?
5 「\r\n」を使用して telnet に「行を実行してください」と言うのは正しいですか?
6 最初のスクリプトを「プロキシ化」することは可能ですか? (プロキシを介して fsockopen を作成します)
ヒント 私が理解したことについては、次のような行でコマンドを COMCAST に送信することはできません。
$command = "HELO smtp.comcast.net\r\n";
$command .= "AUTH LOGIN\r\n";
$command .= base64_encode("username")."\r\n";
$command .= base64_encode("password")."\r\n";
$command .= "QUIT\r\n";
fwrite($connection,$command);
while (!feof($connection))
{
echo fgets($connection, 128)."\n";
}
次のようにする必要があります(LINE、SENT、LINE、SENT ...):
$command = "HELO smtp.comcast.net\r\n";
fwrite($connection,$command);
while (!feof($connection))
{
echo fgets($connection, 128)."\n";
}
$command = "AUTH LOGIN\r\n";
fwrite($connection,$command);
while (!feof($connection))
{
echo fgets($connection, 128)."\n";
}
$command = base64_encode("username")."\r\n";
fwrite($connection,$command);
while (!feof($connection))
{
echo fgets($connection, 128)."\n";
}
$command = base64_encode("password")."\r\n";
fwrite($connection,$command);
while (!feof($connection))
{
echo fgets($connection, 128)."\n";
}
$command = "QUIT\r\n";
fwrite($connection,$command);
while (!feof($connection))
{
echo fgets($connection, 128)."\n";
}
CURL はこれを望んでいないようです。
これがどのように機能しないのか本当に理解できず、WebMail サーバー管理者を構築するためにクラスを操作する必要があるため、PHP クラスを使用する必要があります。これは最初の部分であり、IMAP および POP3 プロトコルにも入る必要があります。同じように。