スクリプトからメールを正しく送信する方法(特に-PHP)

テキストの最初の部分は、 ホスティングプロバイダー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つのサブタイプがあり、これらは同じ方法で構文的に使用されますが、目的は異なります。




All Articles