18.1.5. email.header:国際化されたヘッダー—Pythonドキュメント
18.1.5。 email.header :国際化されたヘッダー
RFC 2822 は、電子メールメッセージの形式を説明する基本標準です。 これは、ほとんどの電子メールがASCII文字のみで構成されていたときに広く使用されるようになった古い RFC 822 標準から派生しています。 RFC 2822 は、電子メールに7ビットのASCII文字のみが含まれていることを前提に記述された仕様です。
もちろん、電子メールは世界中で展開されているため、国際化されており、言語固有の文字セットを電子メールメッセージで使用できるようになっています。 基本標準では、7ビットのASCII文字のみを使用して電子メールメッセージを転送する必要があるため、非ASCII文字を含む電子メールを RFC 2822 [X226Xにエンコードする方法を説明するRFCが多数作成されています。 ]準拠の形式。 これらのRFCには、 RFC 2045 、 RFC 2046 、 RFC 2047 、および[ X107X] RFC 2231 。 email パッケージは、 email.header および email.charset モジュールでこれらの標準をサポートしています。
Subject または To フィールドなど、電子メールヘッダーに非ASCII文字を含める場合は、 Header クラスを使用してフィールドを割り当てる必要があります。 Message オブジェクトで、ヘッダー値に文字列を使用する代わりに、 Header のインスタンスに追加します。 email.header モジュールから 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 クラスの説明は次のとおりです。
- class email.header.Header([s[, charset[, maxlinelen[, header_name[, continuation_ws[, errors]]]]]])
さまざまな文字セットの文字列を含めることができるMIME準拠のヘッダーを作成します。
オプションの s は初期ヘッダー値です。
None
(デフォルト)の場合、初期ヘッダー値は設定されません。 後で append()メソッド呼び出しを使用してヘッダーに追加できます。 s はバイト文字列またはUnicode文字列の場合がありますが、セマンティクスについては append()のドキュメントを参照してください。オプションの charset には、2つの目的があります。 append()メソッドの charset 引数と同じ意味です。 また、 charset 引数を省略した後続のすべての append()呼び出しのデフォルトの文字セットを設定します。 charset がコンストラクターで指定されていない場合(デフォルト)、
us-ascii
文字セットは s の最初の文字セットと後続の[ X177X] append()呼び出し。最大行長は、 maxlinelen を介して明示的に指定できます。 最初の行をより短い値に分割する場合( s に含まれていないフィールドヘッダーを考慮して、たとえば Subject ) header_name のフィールドの名前を渡します。 デフォルトの maxlinelen は76で、 header_name のデフォルト値は
None
です。これは、長い分割ヘッダーの最初の行では考慮されないことを意味します。オプションの continuation_ws は、 RFC 2822 準拠の折りたたみ空白である必要があり、通常はスペースまたはハードタブ文字のいずれかです。 この文字は継続行の前に付けられます。 continuation_ws のデフォルトは単一のスペース文字( "")です。
オプションのエラーは、 append()メソッドに直接渡されます。
- append(s[, charset[, errors]])
文字列 s をMIMEヘッダーに追加します。
オプションの charset は、指定されている場合、 Charset インスタンス( email.charset を参照)または文字セットの名前である必要があります。これは[ X165X] Charset インスタンス。
None
(デフォルト)の値は、コンストラクターで指定された charset が使用されることを意味します。s は、バイト文字列またはUnicode文字列の場合があります。 バイト文字列の場合(つまり
isinstance(s, str)
がtrue)の場合、 charset はそのバイト文字列のエンコーディングであり、文字列をその文字セットでデコードできない場合はUnicodeError
が発生します。s がUnicode文字列の場合、 charset は文字列内の文字の文字セットを指定するヒントです。 この場合、 RFC 2047 ルールを使用して RFC 2822 準拠のヘッダーを生成すると、Unicode文字列は次のコマンドを使用してエンコードされます。文字セットの順序:
us-ascii
、文字セットヒント、utf-8
。UnicodeError
を引き起こさないように設定された最初の文字が使用されます。オプションのエラーは unicode()または
unicode.encode()
呼び出しに渡され、デフォルトは「strict」です。
- encode([splitchars])
メッセージヘッダーをRFC準拠の形式にエンコードします。長い行を折り返し、非ASCII部分をbase64またはquoted-printableエンコードでカプセル化することもできます。 オプションの splitchars は、 RFC 2822 の最高レベルの構文ブレークを大まかにサポートする、長いASCII行を分割する文字を含む文字列です。 。 これは、 RFC 2047 でエンコードされた行には影響しません。
Header クラスは、標準の演算子と組み込み関数をサポートするための多数のメソッドも提供します。
- __str__()
Header.encode()の同義語。
str(aHeader)
に便利です。
- __unicode__()
組み込みの unicode()関数のヘルパー。 ヘッダーをUnicode文字列として返します。
- __eq__(other)
このメソッドを使用すると、2つの Header インスタンスが等しいかどうかを比較できます。
- __ne__(other)
このメソッドを使用すると、2つの Header インスタンスの不平等を比較できます。
email.header モジュールは、次の便利な機能も提供します。
- email.header.decode_header(header)
文字セットを変換せずにメッセージヘッダー値をデコードします。 ヘッダー値は header にあります。
この関数は、ヘッダーのデコードされた各部分を含む
(decoded_string, charset)
ペアのリストを返します。 charset はヘッダーのエンコードされていない部分のNone
です。それ以外の場合は、エンコードされた文字列で指定された文字セットの名前を含む小文字の文字列です。次に例を示します。
>>> from email.header import decode_header >>> decode_header('=?iso-8859-1?q?p=F6stal?=') [('p\xf6stal', 'iso-8859-1')]
- email.header.make_header(decoded_seq[, maxlinelen[, header_name[, continuation_ws]]])
decode_header()によって返されるペアのシーケンスから Header インスタンスを作成します。
decode_header()はヘッダー値の文字列を受け取り、
(decoded_string, charset)
形式のペアのシーケンスを返します。ここで、 charset は文字セットの名前です。この関数は、これらのペアのシーケンスの1つを取り、 Header インスタンスを返します。 オプションの maxlinelen 、 header_name 、および continuation_ws は、 Header コンストラクターと同じです。