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 インスタンスを使うのです。 Header クラスは email.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 クラスの説明です:
別の文字セットの文字列をふくむ MIME準拠なヘッダを作成します。
オプション引数 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) である必要があります。ここで指定された文字は複数にわたる行の行頭に挿入されます。 continuation_ws のデフォルト値は1つのスペース文字(” ”)です。
オプション引数 errors は、 append() メソッドにそのまま渡されます。
この MIME ヘッダに文字列 s を追加します。
オプション引数 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” です。
メッセージヘッダを RFC に沿ったやり方でエンコードします。おそらく長い行は折り返され、非ASCII部分は base64 または quoted-printable エンコーディングで包含されるでしょう。オプション引数 splitchars には長いASCII行を分割する文字の文字列を指定し、 RFC 2822 の highest level syntactic breaks の大まかなサポートの為に使用します。この引数は RFC 2047 でエンコードされた行には影響しません。
Header クラスは、標準の演算子や組み込み関数をサポートするためのメソッドもいくつか提供しています。
Header.encode() と同じです。 str(aHeader) などとすると有用でしょう。
さらに、 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')]
decode_header() によって返される 2要素タプルのリストから Header インスタンスを作成します。
decode_header() はヘッダの値をとってきて、 (decoded_string, charset) という形式の 2要素タプルからなるリストを返します。ここで decoded_string はデコードされた文字列、 charset はその文字セットです。
この関数はこれらのリストの項目から、 Header インスタンスを返します。オプション引数 maxlinelen 、 header_name および continuation_ws は Header コンストラクタに与えるものと同じです。