メール送信処理
以下が本当の秘密ですが、よく見てください。 :)
---------------------------------------------- --- ----------------------------------
1 関数 send( $to,$from,$subject ,$message )
2 {
3
4 //サーバーに接続します
5 $this->lastact="connect";
6
7 $this->show_debug("SMTP サーバーに接続します : ".$ this->smtp , "out");
8 $this->fp = fsockopen ( $this->smtp, $this->port );
9 if ( $this->fp )
10 {
11
12 set_socket_blocking( $this->fp, true );
13 $this->lastmessage=fgets($this->fp,512);
14 $this->show_debug($this- >lastmessage, " in");
15
16 if (! ereg ( "^220", $this->lastmessage ) )
17 {
18 return false;
19 }
20 else
21 {
22 $this-> lastact="HELO " . $this->ようこそ . "n";
23 if(!$this->do_command($this->lastact, "250"))
25 fclose($this ->fp);
26 return false;
27 }
28
29 $this->lastact="MAIL FROM: $from" . "n";
30 if(!$this- >do_command($ this->lastact, "250"))
31 {
32 fclose($this->fp);
33 return false;
34 }
35
36 $this->lastact= "RCPT TO: $ to" . "n";
37 if(!$this->do_command($this->lastat, "250"))
38 {
39 fclose($this->fp) ;
40 return false ;
41 }
42
43 //テキストを送信
44 $this->lastat="DATAn";
45 if(!$this->do_command($this->lastact, " 354"))
46 {
47 fclose($this->fp);
48 return false;
49 }
50
51 //件名ヘッダーを処理します
52 $head="Subject: $subjectn";
53 if(!empty( $subject) && !ereg($head, $message))
54 {
55 $message = $head.$message;
56 }
57
58 //ヘッダーからの処理
59 $head ="From: $fromn ";
60 if(!empty($from) && !ereg($head, $message))
61 {
62 $message = $head.$message;
63 }
64
65 //ヘッダーへの処理
66 $head="To: $ton";
67 if(!empty($to) && !ereg($head, $message))
68 {
69 $message = $head.$ message;
70 }
71
72 //終了文字列を追加
73 if(!ereg("n.n", $message))
74 $message .= "n.n";
75 $this->show_debug($ message, "out") ;
76 fputs($this->fp, $message);
77
78 $this->lastact="QUITn";
79 if(!$this->do_command($ this->lastact, "250"))
80 {
81 fclose($this->fp);
82 return false;
83 }
84 }
85 return true;
86 }
87 else
88 {
89 $this- >show_debug("接続失敗!", "in");
90 return false;
91 }
92 }
----------------- ------ -------------------------------------------- ------ -------
あまり明確な意味を持つことは言いません。
この関数には合計4つのパラメータがあり、$toは受信者を表し、$fromは送信者を表し、$subjectはメールの件名を表し、$messageはメールの本文を表します。処理が成功した場合は true を返し、失敗した場合は false を返します。
8行目、メールサーバーに接続します。成功した場合、応答コードは220になります。
12 行目はブロック モードを設定し、続行するには情報を返す必要があることを示します。詳細な手順についてはマニュアルを参照してください。
16 行目、応答コードが 220 であるかどうかを判断し、220 である場合は処理を続行します。そうでない場合はエラーが返されます。
22 ~ 27 行目、HELO 命令の処理、予期される応答コードは 250 です。
29 ~ 34 行目、MAIL FROM 命令の処理、予期される応答コードは 250 です。
36 ~ 41 行目、RCPT TO 命令の処理、予期される応答コードは 250 です。
44 ~ 49 行目、DATA コマンドの処理、予期される応答コードは 354 です。
51 ~ 76 行目で電子メールの本文を生成し、送信します。
52~56行目、$subjectが空でない場合はメール本文に件名部分があるかどうかを確認し、ない場合は件名部分を追加します。
59~63行目、$fromが空でない場合、メール本文に送信者部分があるかどうかを確認し、存在しない場合は送信者部分を追加します。
66~70行目、$toが空でない場合、メール本文に受信者部分があるかどうかを確認し、存在しない場合は受信者部分を追加します。
73~74行目、メール本文に終了行があるかどうかを確認し、ない場合はメール本文の終了行を追加します(特殊行として「.」を別行として追加)。
76行目、メール本文を送信します。
78 ~ 83 行目、QUIT を実行してサーバーとの接続を終了します。予期される応答コードは 250 です。
85行目、処理成功フラグ(true)を返します。
81~91行目、サーバーへの接続失敗の処理。
上記は send_mail クラス全体の実装ですが、難しいことではありません。