RFC 2822 は電子メールメッセージの形式を規定する基本規格です。 これはほとんどの電子メールが ASCII 文字のみで構成されていたころ普及した RFC 822 標準から発展したものです。RFC 2822 は電子メールが すべて 7-bit ASCII 文字のみから構成されていると仮定して作られた仕様です。
もちろん、電子メールが世界的に普及するにつれ、この仕様は国際化されてきました。 今では電子メールに言語依存の文字セットを使うことができます。 基本規格では、まだ電子メールメッセージを 7-bit ASCII 文字のみを 使って転送するよう要求していますので、多くの RFC でどうやって 非ASCII の電子メールを RFC 2822準拠な形式にエンコードするかが 記述されています。これらの RFC は以下のものを含みます: RFC 2045、 RFC 2046、 RFC 2047、 および RFC 2231。 email パッケージは、 email.Header および email.Charset モジュールでこれらの規格を サポートしています。
ご自分の電子メールヘッダ、たとえば Subject: や To: などのフィールドに非ASCII文字を入れたい場合、 Header クラスを使う必要があります。Message オブジェクトの 該当フィールドに文字列ではなく、Header インスタンスを値として 使うのです。たとえば:
>>> from email.Message import Message >>> from email.Header import Header >>> msg = Message() >>> h = Header('p\xf6stal', 'iso-8859-1') >>> msg['Subject'] = h >>> print msg.as_string() Subject: =?iso-8859-1?q?p=F6stal?=
Subject: フィールドに非ASCII文字をふくめていることに 注目してください。ここでは、含めたいバイト列がエンコードされている 文字セットを指定して Header インスタンスを作成することによって 実現しています。のちにこの Message インスタンスから フラットなテキストを生成するさいに、この Subject: フィールドは RFC 2047 準拠の適切な形式にエンコードされます。MIME 機能のついている メーラなら、このヘッダに埋めこまれた ISO-8859-1 文字をただしく表示するでしょう。
バージョン 2.2.2 で 新たに追加 された仕様です。
以下は Header クラスの説明です:
[s[, charset[, maxlinelen[, header_name[, continuation_ws[, errors]]]]]]) |
オプション引数 s はヘッダの値の初期値です。
これが None
の場合 (デフォルト)、ヘッダの初期値は設定されません。
この値はあとから append() メソッドを呼びだすことによって
追加することができます。s はバイト文字列か、あるいは Unicode 文字列でもかまいません。
この意味については append() の項を参照してください。
オプション引数 charset には 2つの目的があります。
ひとつは append() メソッドにおける charset 引数と
同じものです。もうひとつの目的は、これ以降 charset 引数を
省略した append() メソッド呼び出しすべてにおける、
デフォルト文字セットを決定するものです。コンストラクタに
charset が与えられない場合 (デフォルト)、初期値の s および
以後の append() 呼び出しにおける文字セットとして
us-ascii
が使われます。
行の最大長は maxlinelen によって明示的に指定できます。
最初の行を (Subject: などの s に含まれない
フィールドヘッダの責任をとるため) 短く切りとる場合、
header_name にそのフィールド名を指定してください。
maxlinelen のデフォルト値は 76 であり、header_name の
デフォルト値は None
です。これはその最初の行を
長い、切りとられたヘッダとして扱わないことを意味します。
オプション引数 continuation_ws は RFC 2822準拠の 折り返し用余白文字で、ふつうこれは空白か、ハードウェアタブ文字 (hard tab) である 必要があります。ここで指定された文字は複数にわたる行の行頭に挿入されます。
オプション引数 errors は、append() メソッドにそのまま渡されます。
s[, charset[, errors]]) |
オプション引数 charset がもし与えられた場合、これは
Charset インスタンス (email.Charset を参照) か、
あるいは文字セットの名前でなければなりません。この場合は Charset
インスタンスに変換されます。この値が None
の場合 (デフォルト)、
コンストラクタで与えられた charset が使われます。
s はバイト文字列か、Unicode 文字列です。
こればバイト文字列 (isinstance(s, str)
が真) の場合、
charset はその文字列のエンコーディングであり、
これが与えられた文字セットでうまくデコードできないときは
UnicodeError が発生します。
いっぽう s が Unicode 文字列の場合、charset は
その文字列の文字セットを決定するためのヒントとして使われます。
この場合、RFC 2822準拠のヘッダは RFC 2047 の規則をもちいて作成され、
Unicode 文字列は以下の文字セットを (この優先順位で) 適用してエンコードされます:
us-ascii
、 charset で与えられたヒント、それもなければ utf-8
。
最初の文字セットは UnicodeError をなるべくふせぐために使われます。
オプション引数 errors は unicode() 又は ustr.encode() の呼び出し時に使用し、デフォルト値は ``strict''です。
[splitchars]) |
Header クラスは、標準の演算子や組み込み関数を サポートするためのメソッドもいくつか提供しています。
) |
str(aHeader)
などとすると有用でしょう。
) |
other) |
other) |
さらに、email.Header モジュールは以下のような 便宜的な関数も提供しています。
header) |
この関数はヘッダのそれぞれのデコードされた部分ごとに、
(decoded_string, charset)
という形式の 2要素タプルからなる
リストを返します。charset はヘッダのエンコードされていない部分に
対しては None
を、それ以外の場合はエンコードされた文字列が
指定している文字セットの名前を小文字からなる文字列で返します。
以下はこの使用例です:
>>> from email.Header import decode_header >>> decode_header('=?iso-8859-1?q?p=F6stal?=') [('p\xf6stal', 'iso-8859-1')]
decoded_seq[, maxlinelen[, header_name[, continuation_ws]]]) |
decode_header() はヘッダの値をとってきて、
(decoded_string, charset)
という形式の 2要素タプルからなる
リストを返します。ここで decoded_string はデコードされた文字列、
charset はその文字セットです。
この関数はこれらのリストの項目から、Header インスタンスを返します。 オプション引数 maxlinelen、header_name および continuation_ws は Header コンストラクタに与えるものと同じです。
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。