テキストの最初の部分は、 ホスティングプロバイダーNetangelsの指示から取られています 。 2番目は著作権です。スクリプトからPHPにメールを送信することは、Webアプリケーションでは非常に一般的なことです。 残念ながら、実践が示すように、ほとんどの開発者はこの関数を誤って使用し、スクリプトで同じ間違いを犯します。 その結果、受信者への手紙のエンコードが間違っていたことがわかりました。届かないか、届きましたが、作成者が望んでいたものとはまったく異なる方法で表示されます。
あなたのメッセージが本当に真実に送られることを確実にするために、あなたはメールメッセージのフォーマットについて少なくとも基本的な考えを持たなければなりません。 メールメッセージの形式はいくつかの標準化文書で説明されており、その主なものは
RFC 822 (英語でプレーンテキストを送信するための形式を記述)と
RFC 2045以降(任意のデータを送信するためのこの形式の拡張を記述しています)です。
メール形式
以下は、上記の標準に従ってコンパイルされ、すぐに送信できるテキストメッセージの最も単純な例です。
From:=?Windows-1251?B?0J7RgtC / 0YDQsNCy0LjRgtC10LvRjD89?= <Putin@kremlin.ru>
To:=?Windows-1251?B?0J / QvtC70YPRh9Cw0YLQtdC70Yw / PQ ==?= <Info@netangels.ru>
件名:=?Windows-1251?B?0Y3RgtC + INGC0LXQvNCwINGB0L7QvtCx0YnQtdC90LjRjz89?=
コンテンツタイプ:テキスト/プレーン; charset = "windows-1251"
コンテンツ転送エンコード:8ビット
これはロシア語のメールです
複数の行が含まれています
メールを送信するクライアント(MS OutlookまたはMozilla Thunderbird)がメッセージを準備して受信者に送信するのはこの形式です(ちなみに、ほとんどのメールクライアントでは、たとえば、キーボードショートカットCtrl + Uを使用して、Mozilla Thunderbirdでメッセージのソースコードを表示できます) 。 PHP言語のスクリプトのタスクは、まったく同じ文字形式を実現することです。
上記の例からわかるように、電子メールには2つの部分が含まれています。ヘッダーは一方(上部)に配置され、文字のテキストは他方(下部)に配置されます。 これらの部分は、空の文字列によって互いに分離されています。 見出しは、文字の件名(Subject)、送信者の名前とアドレス(From)、受信者(To)およびその他の情報を含む行で構成されます。 最も単純な場合、各行には「TitleName:TitleTitle」のペアが含まれます。 特に、標準に従って、見出しにASCIIテーブルに存在しない文字(ラテン文字、数字、句読点、および擬似文字)が含まれてはならないことを強調する必要があります。
メールメッセージのヘッダーでのロシア文字の適切な使用
したがって、明示的な形式では、タイトル内のロシア語のテキストは存在しないはずです。したがって、そこに含めるには、このテキストを最初にエンコードする必要があります。 標準では、「禁止」文字をエンコードする方法が説明されています。 一般的な形式は次のとおりです。
=? エンコード? エンコード方法? エンコードされたテキスト?=
エンコーディングは、「windows-1251」、「koi8-r」、「utf-8」などのリストのいずれかです。 すべての場合において、原則として、メッセージのエンコードはサイトが動作するエンコードと一致します。 つまり、ほとんどの場合、「windows-1251」であり、頻度は低くなりますが「utf-8」です。
エンコード方法は、ロシア文字が安全なセットに変換される方法を示します。 2つの方法が定義されています:いわゆる「Qエンコード」(1つの文字「Q」で示されます)と「Base64」(1つの文字「B」で示されます)。
残念ながら、PHPには通常の文字列をQエンコードされたテキストに変換できる標準関数はありませんが、Base64でも同様の変換を実行できる関数があります。 そのため、電子メールメッセージの件名行を正しく作成するためのPHPコードは次のようになります。
$ subject = "=?windows-1251?b?"。 base64_encode($ _ POST ["subject"])。 「?= ";
ここでは、変数$ _POST ["subject"]に、エンコードウィンドウwindows-1251にロシア語で記録されたメールメッセージの件名があると想定しています。
送信者または受信者のアドレスは、「user@example.com」または「Username <user@example.com>」の形式で記述できます。 2番目の場合、ユーザー名は前の例と同じ方法で変換する必要があります。 以下は、変数$ _POST ["username"]にユーザー名が含まれ、変数$ _POST ["email"]に電子メールアドレスが含まれていることを前提とする例です。
$ sender = "=?windows-1251?B?"。 base64_encode($ _ POST ["ユーザー名"])。 「?= <」。 $ _POST ["電子メール"]。 ">";
コンテンツタイプ:multipart / ???
添付ファイル付きのレターやHTMLレターを送信する問題を解決した開発者は、この見出しに精通しています。 また、多くの場合、
PEAR :: Mail_mimeなどのライブラリを使用せずに作成された文字は正しく表示されません。 練習では、RFC(特に
RFC 2046 )で設定された標準を厳密に遵守してレターを作成すると、クライアントプログラムの大部分(Mozilla Thunderbirdなどの基準を遵守したい人を含む)がレターを正しく表示します。 さらに、このドキュメントの読者がコマンドの基本的な構文を理解し、境界とは何か、文字の各部分にContent-typeを指定する必要がある理由を理解するという事実から進みます。 主な間違いに注意してください。
間違い1-無効なサブタイプ
マルチパートタイプには、混合、代替、関連の3つのサブタイプがあり、これらは同じ方法で構文的に使用されますが、目的は異なります。
- 混合-単一のメールメッセージ内に、互いに独立した複数の部分があり、同等の部分がある場合に使用されます。 このような手紙の最も単純な例は、添付ファイル付きのメッセージです。
代替-単一のメールメッセージに、異なるクライアントソフトウェアでの表示を目的とした同じ情報を含む複数の部分(たとえば、同じメッセージのテキストバージョンとHTMLバージョン)が含まれる場合に使用します。
関連-1つの最終メッセージを形成する複数の部分が1つのメールメッセージに含まれる場合に使用されます。 顕著な例は、写真付きのHTMLレターです。 標準に従って、この場合にのみ、要素のContend-id(<img src = "cid:image">の形式)へのリンクが機能するはずです。
指示どおりに覚えて使用してください。
間違い2-部品の間違った順序
文字で示されている部分の順序は、多くの場合、メッセージがクライアントに表示される方法にとって非常に重要です。
- 混合-タスクの部品の順序は関係ありません。
代替-部品はより単純なものからより複雑なものへと順番に並べられるべき RFCは、クライアントのクライアントによるレターバージョンの1つを選択するプロセスを次のように規制します。「一般的に、メールクライアントは、利用可能なドキュメントの最新バージョンを表示する必要があります。」 つまり テキストおよびHTMLバージョンのレターを作成するときは、テキストを前に置く必要があります。
関連-メイン部分(HTMLドキュメントなど)がキューの最初に配置されます。 以下は他のすべてです。 概して、規格はドキュメントの主要部分を示す特別なパラメータ「start」を規制していますが、乱用しない方が良いです。
3番目のエラー-1つのサブタイプのみを選択してください
多くの場合、プログラムからレターを作成する開発者は、レターのどの部分にもContent-type:multipartがあることを忘れてしまいます。これは、レターの各部分が適切な場所になるようにツリー構造の類似性を構築できることを意味します。 ここに、テキストとHTMLバージョン(写真付きHTML)が付いたレターの構造、および添付されたMS Word文書がどのように見えるかを示します。
- コンテンツタイプ:マルチパート/混合
- コンテンツタイプ:マルチパート/代替
- コンテンツタイプ:テキスト/プレーン
コンテンツタイプ:マルチパート/関連
- コンテンツタイプ:テキスト/ html
コンテンツタイプ:image / jpeg
コンテンツタイプ:image / jpeg
コンテンツタイプ:アプリケーション/ msword
そして最後に、さらにいくつかの推奨事項