email.headerregistry: カスタムヘッダーオブジェクト¶
ソースコード: Lib/email/headerregistry.py
Added in version 3.6: [1]
ヘッダーは str のカスタマイズされたサブクラスで表現されます。 与えられたヘッダーを表現するために使用される特定のクラスは、ヘッダーが作成されるときに有効な policy の header_factory で決定されます。 このセクションでは、email ライブラリが RFC 5322 に準拠したメールメッセージを扱うために実装している、特定の header_factory について説明します。このヘッダーは、様々なヘッダータイプに対してカスタマイズされたヘッダーオブジェクトを提供するだけでなく、アプリケーションが独自のカスタムヘッダータイプを追加できるような拡張メカニズムも備えています。
EmailPolicy から派生したポリシーオブジェクトのいずれかを使用する場合、すべてのヘッダーは HeaderRegistry によって生成され、最終的な基底クラスとして BaseHeader を有します。 各ヘッダクラスには、ヘッダの種類によって決まる追加のベースクラスがあります。 例えば、多くのヘッダーは UnstructuredHeader というクラスをもうひとつの基底クラスとして持っています。 ヘッダーに特化した第二のクラスは、ヘッダーの名前によって決定され、 HeaderRegistry に格納されたルックアップテーブルを使用します。 これらすべては、典型的なアプリケーションプログラムに対しては透過的に管理されますが、より複雑なアプリケーションで使用するためにデフォルトの動作を変更するためのインタフェースが提供されています。
以下のセクションでは、まずヘッダーの基本クラスとその属性を説明し、次に HeaderRegistry の動作を変更するための API、そして最後に構造化ヘッダーからパースされたデータを表現するためのサポートクラスについて説明します。
- class email.headerregistry.BaseHeader(name, value)¶
name and value are passed to
BaseHeaderfrom theheader_factorycall. The string value of any header object is the value fully decoded to a string.基底クラスは以下の読み出し専用属性を定義しています:
- name¶
ヘッダーの名前(フィールドの':'の前の部分)。これは
header_factoryの name の呼び出しで渡された値と全く同じです; つまり、大文字・小文字が保持されます。
- defects¶
パース中に見つかったRFCのコンプライアンス問題を報告する
HeaderDefectインスタンスのタプルです。 email パッケージはコンプライアンスに関する問題を完全に検出するように努めています。 報告されるかもしれない欠陥の種類の議論については、errorsモジュールを参照してください。
- max_count¶
このタイプのヘッダーで、同じ
nameを持つことができる最大数。 値としてNoneを指定すると、無制限になります。 この属性のBaseHeaderの値はNoneです; 特殊な header クラスでは、必要に応じてこの値をオーバーライドすることが期待されます。
BaseHeaderは以下のメソッドも提供します。このメソッドはemail ライブラリのコードから呼び出され、一般にアプリケーションプログラムからは呼び出されません:- fold(*, policy)¶
ヘッダを policy に従って正しく折りたたむために必要な
linesep文字を含む文字列を返します。 ヘッダには任意のバイナリデータを含めることができないため、cte_typeが8bitの場合は7bitと同じように扱われます。 もしutf8がFalseであれば、非ASCIIデータは RFC 2047 でエンコードされます。
BaseHeader自身はヘッダーオブジェクトを生成するために使用することはできません。このクラスは、それぞれの特殊化ヘッダーがヘッダーオブジェクトを生成するために協力するプロトコルを定義しています。 具体的には、BaseHeaderはparseという名前のclassmethod()を特殊化されたクラスが提供することを要求しています。このメソッドは以下のように呼び出されます:parse(string, kwds)
kwdsis a dictionary containing one pre-initialized key,defects.defectsis an empty list. The parse method should append any detected defects to this list. On return, thekwdsdictionary must contain values for at least the keysdecoded,defectsandparse_tree.decodedshould be the string value for the header (that is, the header value fully decoded to a string).parse_treeis set to the parse tree obtained from parsing the header. The parse method should assume that string may contain content-transfer-encoded parts, but should correctly handle all valid Unicode characters as well so that it can parse un-encoded header values.その後、
BaseHeaderの__new__がヘッダのインスタンスを生成し、initメソッドを呼び出します。 特殊クラスは、BaseHeaderが提供しない属性を設定したい場合にのみinitメソッドを提供する必要があります。 このようなinitメソッドは以下のようなものです。def init(self, /, *args, **kw): self._myattr = kw.pop('myattr') super().init(*args, **kw)
つまり、特殊クラスが
kwdsの辞書に追加したものはすべて削除して処理し、kwの残りの内容 (とargs) はBaseHeaderのinitメソッドに渡す必要があるのです。
- class email.headerregistry.UnstructuredHeader¶
"unstructured" ヘッダは RFC 5322 におけるデフォルトのヘッダのタイプです。指定された構文を持たないすべてのヘッダは、unstructuredとして扱われます。 構造化されていないヘッダの典型的な例は Subject ヘッダです。
In RFC 5322, an unstructured header is a run of arbitrary text in the ASCII character set. RFC 2047, however, has an RFC 5322 compatible mechanism for encoding non-ASCII text as ASCII characters within a header value. When a value containing encoded words is passed to the constructor, the
UnstructuredHeaderparser converts such encoded words into a string, following the RFC 2047 rules for unstructured text. The parser uses heuristics to attempt to decode certain non-compliant encoded words. Defects are registered in such cases, as well as defects for issues such as invalid characters within the encoded words or the non-encoded text.このヘッダ型には追加の属性はありません。
- class email.headerregistry.DateHeader¶
RFC 5322 は、電子メールヘッダー内の日付について厳密な形式を定めています。
DateHeaderのパーサーはその形式に加え、実際のメールで見かけるさまざまな変形も認識します。このヘッダ型は以下の属性も提供しています:
- datetime¶
ヘッダー値を何らかの有効な日付形式として認識できた場合、この属性にはその日時を表す
datetimeインスタンスが入ります。 入力のタイムゾーンが-0000(UTC だが送信元のタイムゾーン情報はないことを示します) の場合、datetimeは naive なdatetimeになります。+0000を含む特定のタイムゾーンオフセットが見つかった場合、datetimeはdatetime.timezoneでオフセットを記録した aware なdatetimeになります。
ヘッダーの
decoded値は、datetimeを RFC 5322 の規則に従って書式化したものです。 つまり、次のように設定されます。email.utils.format_datetime(self.datetime)
DateHeaderを作成する際に、 value はdatetimeインスタンスである可能性があります。 これは、例えば、次のようなコードは有効であり、期待通りの動作をすることを意味します:msg['Date'] = datetime(2011, 7, 15, 21)
これはnaive な
datetimeであるため、UTC タイムスタンプとして解釈され、結果として-0000というタイムゾーンを持つ値になります。 もっと便利なのはutilsモジュールのlocaltime()関数を使用することです。msg['Date'] = utils.localtime()
この例では、現在のタイムゾーンオフセットを使用して、日付ヘッダーを現在の時刻と日付に設定します。
- class email.headerregistry.AddressHeader¶
アドレスヘッダは最も複雑な構造のヘッダタイプの1つです。
AddressHeaderクラスは、あらゆるアドレスヘッダに対する汎用的なインターフェースを提供します。このヘッダ型は以下の属性も提供しています:
- groups¶
ヘッダー値に含まれるアドレスとグループをエンコードした
Groupオブジェクトのタプルです。 グループに属さないアドレスは、このリストではdisplay_nameがNoneであるシングルアドレスのGroupsとして表現されます。
- addresses¶
ヘッダー値に含まれる全ての個別アドレスをエンコードした
Addressオブジェクトのタプルです。 ヘッダ値にグループが含まれている場合、そのグループに含まれる個々のアドレスは、ヘッダ値でグループが出現した時点でリストに含まれます (つまり、アドレスのリストは一次元のリストに「フラット化」されます)。
The
decodedvalue of the header will have all encoded words decoded to a string.idnaencoded domain names are also decoded to a string. Thedecodedvalue is set by joining thestrvalue of the elements of thegroupsattribute with', '.アドレスヘッダーの値の設定には、
AddressとGroupオブジェクトを自由に組み合わせたリストを使えます。display_nameがNoneのGroupオブジェクトは単独のアドレスとして解釈されます。 このため、元のヘッダーのgroups属性から得たリストを使えば、グループを保持したままアドレス一覧をコピーできます。
- class email.headerregistry.SingleAddressHeader¶
追加の属性を 1 つ持つ、
AddressHeaderの派生クラスです:- address¶
ヘッダー値で表された単一のアドレスです。 ヘッダー値に複数のアドレスが含まれる場合 (デフォルトの
policyでは RFC 違反です)、この属性にアクセスするとValueErrorが発生します。
上記のクラスの多くには、Unique 版もあります (例えば UniqueUnstructuredHeader)。
違いは、Unique 版では max_count が 1 に設定されることだけです。
- class email.headerregistry.MIMEVersionHeader¶
MIME-Version ヘッダーの有効な値は実際には
1.0だけです。 将来に備え、このヘッダークラスは他の有効なバージョン番号もサポートします。 バージョン番号が RFC 2045 に照らして有効であれば、ヘッダーオブジェクトの以下の属性はNone以外の値になります。- version¶
バージョン番号 (文字列)、空白やコメントは除かれます。
- major¶
メジャーバージョン番号 (整数)
- minor¶
マイナーバージョン番号 (整数)
- class email.headerregistry.ParameterizedMIMEHeader¶
MIME ヘッダーはすべて接頭辞
Content-で始まります。 各ヘッダーにはそれぞれの値があり、対応するクラスの説明に記載されています。 また、共通形式の補助パラメータの一覧を持てるものもあります。 このクラスは、パラメータを持つすべての MIME ヘッダーの基底クラスです。- params¶
パラメータ名をパラメータ値に対応付ける辞書です。
- class email.headerregistry.ContentTypeHeader¶
Content-Type ヘッダを扱う
ParameterizedMIMEHeaderクラスです。- content_type¶
maintype/subtype形式のコンテントタイプ文字列。
- maintype¶
- subtype¶
- class email.headerregistry.ContentDispositionHeader¶
Content-Disposition ヘッダを扱う
ParameterizedMIMEHeaderクラスです。- content_disposition¶
一般的に使われる有効な値は
inlineとattachmentだけです。
- class email.headerregistry.ContentTransferEncodingHeader¶
Content-Transfer-Encoding ヘッダを扱います。
- class email.headerregistry.HeaderRegistry(base_class=BaseHeader, default_class=UnstructuredHeader, use_default_map=True)¶
これは
EmailPolicyがデフォルトで使うファクトリです。HeaderRegistryは、base_class と自身のレジストリから取得した専用クラスを使って、ヘッダーインスタンスを作成するためのクラスを動的に構築します。 ヘッダー名がレジストリにない場合、default_class で指定されたクラスを専用クラスとして使います。 use_default_map がTrue(デフォルト) の場合、初期化時にヘッダー名からクラスへの標準の対応付けをレジストリにコピーします。 base_class は常に、生成されたクラスの__bases__一覧の最後のクラスになります。デフォルトのマッピング:
- subject:
UniqueUnstructuredHeader
- date:
UniqueDateHeader
- resent-date:
DateHeader
- orig-date:
UniqueDateHeader
- sender:
UniqueSingleAddressHeader
- resent-sender:
SingleAddressHeader
- to:
UniqueAddressHeader
- resent-to:
AddressHeader
- cc:
UniqueAddressHeader
- resent-cc:
AddressHeader
- bcc:
UniqueAddressHeader
- resent-bcc:
AddressHeader
- from:
UniqueAddressHeader
- resent-from:
AddressHeader
- reply-to:
UniqueAddressHeader
- mime-version:
MIMEVersionHeader
- content-type:
ContentTypeHeader
- content-disposition:
ContentDispositionHeader
- content-transfer-encoding:
ContentTransferEncodingHeader
- message-id:
MessageIDHeader
HeaderRegistryには以下のメソッドがあります:- map_to_type(self, name, cls)¶
name は対応付けるヘッダーの名前です。 レジストリ内では小文字に変換されます。 cls は専用クラスで、base_class と組み合わせて、name に一致するヘッダーをインスタンス化するクラスの作成に使われます。
- __getitem__(name)¶
name ヘッダーの作成を担当するクラスを構築して返します。
- __call__(name, value)¶
name に関連付けられた専用ヘッダークラスをレジストリから取得します (name がレジストリになければ default_class を使います)。 それを base_class と組み合わせてクラスを作成し、同じ引数リストを渡してそのコンストラクタを呼び出し、生成されたインスタンスを返します。
以下のクラスは、構造化ヘッダーから解析したデータの表現に使われます。 通常、アプリケーションからも、特定のヘッダーに代入する構造化された値の作成に使えます。
- class email.headerregistry.Address(display_name='', username='', domain='', addr_spec=None)¶
このクラスは電子メールのアドレスを表すのに使われます。アドレスの一般的な形式は:
[display_name] <username@domain>
もしくは:
username@domain
各部分は RFC 5322 で定められた構文規則に従う必要があります。
As a convenience addr_spec can be specified instead of username and domain, in which case username and domain will be parsed from the addr_spec. An addr_spec must be a properly RFC quoted string; if it is not
Addresswill raise an error. Unicode characters are allowed and will be property encoded when serialized. However, per the RFCs, Unicode is not allowed in the username portion of the address.- display_name¶
アドレスの表示名部分で、引用符はすべて取り除かれます。 アドレスに表示名がなければ、空文字列になります。
- username¶
アドレスの
username部分、クォートは取り除かれます。
- domain¶
アドレスの
domain部分。
- addr_spec¶
アドレスの
username@domain部分で、表示名のないアドレス (上記の 2 番目の形式) として使えるよう正しく引用符が付けられます。 この属性は変更できません。
SMTP (RFC 5321) をサポートするため、
Addressは一つの特殊な場合を扱います。usernameとdomainが両方とも空文字列 (またはNone) の場合、Addressの文字列値は<>になります。
- class email.headerregistry.Group(display_name=None, addresses=None)¶
このクラスはアドレスグループを表すのに使われます。アドレスグループの一般的な形式は:
display_name: [address-list];
グループと単独のアドレスが混在する一覧を扱いやすくするため、
Groupでグループに属さない単独のアドレスを表すこともできます。 その場合、display_name をNoneにし、addresses にそのアドレスだけを含むリストを渡します。- display_name¶
グループの
display_nameです。 値がNoneで、addressesにAddressがちょうど一つある場合、そのGroupはグループに属さない単独のアドレスを表します。
脚注