send_mail クラスの実装
それでは、私が書いたsend mailクラスを紹介していきます。上記の準備知識を踏まえて、以下のように実装していきます。
クラスのメンバー変数
var $lastmessage; // 返された最後の応答メッセージを記録します
var $lastact; // ユーザーを歓迎するために HELO の背後で使用されます
var $debug; //デバッグ情報を表示するかどうか
var $smtp; //smtpサーバー
var $port; //ソケットハンドル
このうち$lastmessageと$lastactを使用しますエラーが発生したときにユーザーが使用できる最後の A 応答メッセージと実行されたコマンドを記録します。テストの必要があるため、$debug 変数も定義しました。その値が true の場合、プロセスの実行中にいくつかの実行情報が表示されます。それ以外の場合は、出力はありません。 $fp は、開いたソケット ハンドルを保存するために使用されます。
クラスの構築
------------------------------------------ ------ --------------------------------------
function send_mail( $smtp, $welcome="" , $debug=false)
{
if(empty($smtp)) die("SMTP を NULL にすることはできません!");
$this->smtp=$smtp;
if( empty($welcome))
{
$this->welcome=gethostbyaddr("localhost");
}
else
$this->welcome=$welcome;
$this->debug=$debug;
$this->lastmessage=" ";
$this->lafact="";
$this->port="25";
}
-------------- -------- -------------------------------------- -------- --------
このコンストラクターは主にいくつかの初期値の決定と設定を完了します。 $welcome は、サーバーにユーザー名を伝えるために HELO ディレクティブで使用されます。 HELO 命令にはマシン名が必要ですが、マシン名がなくても使用できます。ユーザーが $welcome を指定しない場合、ローカル マシン名が自動的に検索されます。
デバッグ情報を表示
------------------------------------------ ----- --------------------------------------
1 関数 show_debug( $message, $inout)
2 {
3 if ($this->debug)
4 {
5 if($inout=="in") //応答情報
6 {
7 $m='< < ';
8 }
9 else
10 $m='>> ';
11 if(!ereg("n$", $message))
12 $message .= "
" ;
13 $message=nl2br( $message);
14 echo "${m}${message}";
15 }
16 }
---- -------- -------------------------------------- -------- ------------------
この関数はデバッグ情報を表示するために使用されます。 $inout には、アップロード命令であるか返される応答であるかを指定できます。アップロード命令である場合は "out" を使用し、返される応答である場合は "in" を使用します。
3行目はデバッグ情報を出力するかどうかを決定します。
5 行目で、応答メッセージであるかどうかを判断し、そうでない場合は 7 行目の情報の前に「>>」を追加します。アップロードの指示。
11-12行目、最後の情報文字列が改行文字かどうかを判断し、そうでない場合はHTML改行マークを追加します。 13 行目は、すべての改行文字を HTML 改行タグに変換します。
14 行目、メッセージ全体を出力し、違いを示すためにメッセージの色をグレーに設定します。コマンドを実行します
-------------------------------------- --- ----------------------------------
1 function do_command($command, $code)
2 {
3 $this->lastat=$command;
4 $this->show_debug($this->lastat, "out");
5 fputs ( $this->fp, $this->gt; lastat ) ;
6 $this->lastmessage = fgets ( $this->fp, 512 );
7 $this->show_debug($this->lastmessage, "in");
8 if(! ereg( "^$code", $this->lastmessage))
9 {
10 return false;
11 }
12 else
13 return true;
14 }
---------- ---------------------------------------------------- --------------- ------------------
ソケットの処理部分を書いていると、一部のコマンドの処理がおかしいことに気づきました。 HELO、MAIL FROM、RCPT TO、QUIT、DATA コマンドなどと非常に似ており、これらはすべて、関連するコンテンツを表示するためにデバッグ情報を表示するかどうかを要求します。同時に、返される応答コードが予期される場合は、処理を続行する必要があります。これは予期されていないため、処理を中断する必要があります。したがって、明確化および単純化のために、これらのコマンドを処理するために一般的な処理関数が特別に作成されます。関数のパラメータの $code は、期待される応答コードです。応答コードが同じであれば、処理は成功したことを意味します。それ以外の場合は、エラーが発生します。
行 3 は、最後に実行されたコマンドを記録します。
4 行目はアップロード コマンドを表示します。
5行目はfputsを使用して命令を実際にサーバーに転送します。
6 行目では、サーバーから受信した応答情報が最後の応答メッセージ変数に格納されます。
7行目は応答情報を表示します。
8 行目は、応答情報が期待されているかどうかを判断し、期待されている場合は 13 行目で成功 (true) を返し、それ以外の場合は 10 行目で失敗 (false) を返します。
このようにして、この関数は、指示や情報を送信して表示する機能を完了する一方で、返された応答が成功したかどうかを判断します。