MIME エンコード方式の概要 (投稿者: Chen Junqing、2000 年 10 月 24 日 15:09) MIME エンコード方式の概要 Subject: =?gb2312?B?xOO6w6Oh?= これがメールの件名ですが、エンコードされているため、内容がわかりません。元のテキストは「Hello!」です。まず、MIME エンコードの 2 つの方法を見てみましょう。 電子メールをエンコードする本来の理由は、インターネット上の多くのゲートウェイが漢字などの 8 ビットの内部コード文字を正しく送信できないためです。エンコードの原理は、受信機が正しく送信できるように 8 ビット コンテンツを 7 ビット形式に変換し、受信後に 8 ビット コンテンツに復元することです。 MIME は「MultiPurpose Internet Mail Extensions」の略称で、MIME プロトコルが登場する以前は UUENCODE などの暗号化方式がありましたが、MIME プロトコルのアルゴリズムがシンプルで拡張しやすいため、現在ではメールのエンコードが主流となっています。 8 ビット文字の送信に使用されるだけでなく、電子メールに添付された画像、音声などのバイナリ ファイルの送信にも使用され、多くの MIME ベースのアプリケーションが拡張されています。エンコード方式に関して、MIME は Base64 と QP (Quote-Printable) の 2 つのエンコード方式を定義しています。Base64 は汎用方式であり、その原理は非常に単純です。つまり、3 バイトのデータが 4 バイトで表現されるため、この 4 バイトのうち、実際に使用されるのは最初の 6 ビットだけなので、7 ビット文字しか送信できなくても問題ありません。 Base 64 の略語は通常「B」です。このレターの件名は Base64 エンコーディングを使用します。 もう 1 つの方法は、QP (Quote-Printable) 方法で、通常は「Q」方法と略されます。その原理は、8 ビット文字を 2 つの 16 進値で表し、先頭に「=」を追加することです。したがって、QP エンコード後のファイルは通常、 =B3=C2=BF=A1=C7=E5=A3=AC=C4=FA=BA=C3=A3=A1 のようになっていることがわかります。 PHP には、デコードを簡単に実装できる 2 つの関数があります。base64_decode() と quote_printable_decode() です。前者は、base64 エンコードのデコードに使用でき、後者は、QP エンコード方式のデコードに使用できます。 次に、Subject: =?gb2312?B?xOO6w6Oh?= の内容を見てみましょう。これは完全なエンコードではなく、その一部のみが 2 つのマークで囲まれています。後で説明しますが、このテキストの文字セットは GB2312 であり、? の後の B は Base64 エンコーディングを表します。この分析を通じて、この MIME デコード関数を見てみましょう: (この関数は、PHPX.COM の Web マスターである Sadly によって提供されています。私はそれをクラスに追加し、いくつかの修正を加えました。ありがとうございます) function decode_mime ( $string) { $pos = strpos($string, =?); if (!is_int($pos)) { $string を返す } $preceding = substr($string, 0, $pos) ); // 先行するテキストを保存します。 $search = substr($string, $pos+2); /* MIME ヘッダーの仕様では、これが単一のエンコードされた単語の最長です */ $d1 = strpos($search, ? ); if (!is_int( $d1)) { Return $string; } $charset = substr($string, $pos+2, $d1); //文字セットの定義部分を取得します $search = substr($) search, $d1+1); / /文字セット定義以降の部分 =>$search; $d2 = strpos($search, ?); if (!is_int($d2)) { return $string ; } $encoding = substr($search, 0, $d2 ); ////2 つの間のエンコード方法の一部?: q または b $search = substr($search, $d2+1); = strpos($search, ?=); //$d2+ 1 と $end の間はエンコードされた内容です: => $endcoded_text; if (!is_int($end)) { return $string = substr($) search, 0, $end); $rest = substr ($string, (strlen($preceding . $charset . $encoding . $encoded_text)+6)); 6 文字のスイッチ ($encoding) { case Q: case q: //$encoded_text = str_replace(_, %20, $encoded_text); //$encoded_text = str_replace(=, %, $encoded_text); urldecode($encoded_text); $decoded=quoted_printable_decode( $encoded_text); if (strto lower($charset) == windows-1251) { $decoded = Convert_cyr_string($decoded, w, k); windows-1251) { $decoded =convert_cyr_string($decoded, w, k); $decoded を返します。 $rest); } } この関数は、再帰的メソッドを使用して、上記の件名セグメントを含む文字をデコードします。プログラムにコメントが追加されました。 PHP プログラミングの基本的な知識があれば誰でも理解できると思います。この関数も、base64_decode() と quote_printable_decode() という 2 つのシステム関数を呼び出してデコードされますが、電子メール ソース ファイルで大量の文字列分析が必要になります。ただし、PHP の文字列操作は、すべての言語の中で最も便利で無料であると言えます。関数 $preceding の最後の戻り値 $this->decode_mime($rest); この関数は実際には後で紹介する MIME デコード クラスに配置されるため、 >Decode_mime が使用されます。 ($rest) この形式のメソッド呼び出し。 それでは本文を見てみましょう。これは、MIME の一部のヘッダー情報に関連しています。最初に簡単に説明します (さらに詳しく知りたい場合は、MIME の公式ドキュメントを参照してください)。 MIME-Version: 1.0 使用される MIME のバージョン番号を示します (通常は 1.0); Content-Type: テキストの種類を定義します。たとえば、text/plain はテキストの種類を知るために使用します。フォーマットされていないテキスト本文、text/html は Html ドキュメントを表し、image/gif は gif 形式の画像を表します。 この記事で説明する必要があるのは、電子メールで一般的に使用される複合タイプです。マルチパート タイプは、テキストが複数の部分で構成されていることを示します。次のサブタイプは、電子メールで使用される 3 つのタイプです。 multipart/alternative: テキストが 2 つの部分で構成されていることを示し、どちらかを選択できます。それらのいずれかです。主な機能は、エッセイにテキスト形式と HTML 形式の両方がある場合、表示する 2 つの本文のいずれかを選択できることです。HTML 形式をサポートするメール クライアント ソフトウェアでは通常、HTML 本文が表示されますが、HTML 形式をサポートしないメール クライアント ソフトウェアでは HTML 本文が表示されます。 ; テキスト本文を表示します。 multipart/mixed: テキストと添付ファイルの間の関係を参照して、文書の複数の部分が混合されていることを示します。電子メールの MIME タイプが multipart/mixed の場合、電子メールに添付ファイルが含まれていることを意味します。multipart/relative: ドキュメントの複数の部分が関連していることを意味し、通常は Html テキストとその関連画像を記述するために使用されます。 たとえば、電子メールに添付ファイルが含まれ、HTML 形式とテキスト形式の両方の本文がある場合、電子メールの構造は次のようになります。 Content-Type: multipart/mixed Part 1: Content Type: multipart/alternative : テキスト本文; HTML 形式のテキスト パート 2: 添付ファイルの電子メールの終了文字="----=_NextPart_000_0007_01C03166.5B1E9510"、連絡先タイプ: multipart/* の各コンテンツには、複数の部分間の区切りを示すこのような記述があります。この区切り記号はテキスト内にありません。文書内では、セクションの始まりを示すために「--」と境界が使用され、文書の最後に「--」が追加され、その後に「--」が追加されます。最後に「」は文書の終わりを示します。複合タイプはネストできるため、電子メール内に複数の境界が存在する可能性があります。 最も重要な MIME ヘッダー タグもあります。 Content-Transfer-Encoding:base64 これは、ドキュメントのこの部分のエンコード方式を示します。これは、上で紹介した Base64 または QP (Quote-Printable) です。この記述を識別することによってのみ、正しい解読方法を使用して解読することができます。 スペースの制限があるため、これは MIME の唯一の紹介です。以下に、MIME メールをデコードするためのクラスを示し、それについて簡単に説明します。