ホームページ >php教程 >php手册 >PHP を使用して MIME メールを送信する (5)

PHP を使用して MIME メールを送信する (5)

WBOY
WBOYオリジナル
2016-06-21 09:08:12831ブラウズ

マイム

次に検証するメソッドは build_message() です。これは作業の大部分を占めますが、
gen_email() メソッドを通じて呼び出されます。 build_message() はプライベート メソッドであることに注意してください。


function build_message() {

$msg = "";
$boundary = 'PM'.chr(rand(65, 91)).'------'.md5( uniqid(rand())); # 境界識別子
$nparts = sizeof($this->mimeparts);

//ケース 1: 添付ファイル リストがあるため、MIME ヘッダーは multipart/mixed である必要があります
if ( is_array( $this->mimeparts) && ($nparts > 1)) {
$c_ver = "MIME バージョン: 1.0".CRLF;
$c_type = 'Content-Type:
multipart/mixed;'.CRLF ." 境界="$boundary"".CRLF;
$c_enc = "コンテンツ転送エンコーディング: ".BIT7.CRLF;
$c_desc = $c_desc?"コンテンツ説明: $c_desc".CRLF;
$ warning = CRLF.WARNING.CRLF.CRLF;

// MIMIE セグメントがある場合、メール本文も添付ファイルになります
if (!empty($this->body)) {
$this- >attach( $this->body, BODY, TEXT, BIT7);
}

// 次に、メールの各 MIME セグメントを作成します
for ($i=0; $i < $nparts; $i++) {
if (! empty($this->mimeparts[$i]))
$msg .= CRLF.'--'.$boundary.CRLF.$this->mimeparts[$i].CRLF;
$msg . = '--'.$boundary.'--'.CRLF;
$msg = $c_ver.$c_type.$c_enc.$c_desc.$warning.$msg; !empty($this ->body)) $msg .= $this->body.CRLF.CRLF;
return $msg;

?> このメソッドは少し矛盾していますが、そして複雑です。それは見方次第です。

各 MIME セグメントには境界タグがあり、このタグには一意の ID があることを以前 (MIME の基本で) 読みました。エッジ
境界マーカーは以下で使用されます。
添付ファイルを分割する必要がある場所を示す MIME ヘッダー
MIME セグメント。添付ファイルの境界を区切るために各セグメントの前後で実際に使用されます。 (Alexander の写真
と地図付きのメールを思い出してください!)
(覚えておいてください: 範囲の終わりを示すために、最後の境界マークは 2 つのハイフン (--) で終わる必要があります)。
$boundary には境界マークが含まれており、乱数によって一意に生成され、MD5 ハッシュ化されます。さらに、$boundary の前に「PM?」を
付けます。「?」はランダムな文字です。 $boundary の例は
"PMK------2345ee5de0052eba4daf47287953d37e" です (PM は PHP MIME の略なので、可能な
初期値に変更できます!)

MIME ヘッダーを生成するプロセスでは、次の 2 つの状況が発生します。考慮する必要があります。これらの条件は、電子メールの元の本文 (コンストラクター
の $body) の表示方法と MIME ヘッダーの特定の表現に影響します。ケース 1 はこの記事を書く理由であり、次のことがわかります: はい
多くの添付ファイルが含まれています。この場合、「これ
は MIME
エンコーディング メッセージです」という警告文字列がメッセージの一部として挿入されることに注意してください。したがって、実際のメッセージ本文自体も添付ファイルとしてメッセージに追加する必要があります。電子メールのテキストは通常​​、添付ファイルのリスト
の最初の添付ファイルであり、この場合は $mimeparts です。
$mimeparts インデックスを占有するのはまさにこれが理由で、最初のインデックス (0) を電子メールのテキスト部分に使用できるようにします。メール本文は7ビットエンコードで添付する必要があります。

if (!empty($this->body)) {
$this->attach($this->body, BODY, TEXT, BIT7)
}

?>

上記の小さなコードは、電子メールのテキスト部分を MIME 添付ファイルとして添付する作業を完了します。 'BODY' 定数を使用して、attach() に添付ファイルを追加する場所を
指示することに注意してください。

2 番目のケースは、添付ファイルが存在しない場合です。この場合、メッセージ テキストが提供される場合、ローカル変数 $msg に含まれる唯一の情報になります。この場合、MIME ヘッダーは必要ありません。 (ただし、この場合、MIME-Version ヘッダーのみを指定する必要もあります
----戻って、前のデモの最も単純な MIME 情報を見てください。)

MIME 情報ヘッダー (MIME-Version 、Content-Type、
など) は添付ファイルがある場合に作成されます。 MIME ヘッダーを使用してメッセージ本文を作成するには、まず MIME ヘッダーを作成する必要があります。有効な各 MIME セグメントは、$mimeheaders 配列を通じて反復的に処理されます。
ここで実際に境界線マーカーが使用されます。ルールの一貫性に従って、MIME セグメントには 2 つのコネクタ ('--
'.$BOUNDARY.crlf) が接頭辞として付けられ、最後の MIME セグメントの後に、電子メールの範囲を示す境界識別子の後に 2 つのコネクタが追加されます。 。
変数 $msg 内の完全な情報がこのメソッドの値として返されます。
次のメソッド get_email() は、build_message() メソッドによる MIME メッセージの生成を完了します。 build_message() は
なので内部メソッド get_email() は RFC 822 ヘッダーを作成し、build_message() を呼び出した後に MIME 情報を追加します。


function gen_email($force=false) {

if (!empty($this->email) && !$force) return $this->email ; //
処理を保存します
$email = "";
if (empty($this->subject)) $this->subject = NOSUBJECT;
if (!empty($this->from)) $email .= 'From: ' .$this->from.CRLF;
if (!empty($this->headers)) $email .= $this->headers.CRLF;
$email .= $this->build_message() ;
$this->email = $email;
return $this->email;

?> クラスのメンバー $email は、生成された電子メール情報全体を所有します。メッセージの不必要な再生成を避けるために、このメソッドはメール ヘッダーの作成を続行し、$mail が空の場合にのみ build_message() を呼び出します。ただし、gen_email() を呼び出すことで再処理を強制できます。 (「宛先」メッセージが変更された場合、または新しい添付ファイルが追加された場合、呼び出し元は明示的にこれを行いたいと考えています)。

gen_email() は、よりおなじみの From ヘッダーを作成します。さらに、件名が指定されていない場合、件名はデフォルト (No
Subject) に設定されます。
To と Subject
の内容は後で保存されません。このメソッドは完全な電子メール メッセージを返し、MIME メッセージの作成タスクを完了します。






声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。