email.headerregistry:カスタムヘッダーオブジェクト—Pythonドキュメント
email.headerregistry :カスタムヘッダーオブジェクト
ソースコード: :source: `Lib / email / headerregistry.py`
バージョン3.6の新機能: 1
ヘッダーは、 str のカスタマイズされたサブクラスで表されます。 特定のヘッダーを表すために使用される特定のクラスは、ヘッダーの作成時に有効な policy の header_factory によって決定されます。 このセクションでは、 RFC 5322 準拠の電子メールメッセージを処理するために電子メールパッケージによって実装される特定のheader_factory
について説明します。アプリケーションが独自のカスタムヘッダータイプを追加するための拡張メカニズムを提供します。
EmailPolicy から派生したポリシーオブジェクトのいずれかを使用する場合、すべてのヘッダーは HeaderRegistry によって生成され、最後の基本クラスとして BaseHeader を持ちます。 各ヘッダークラスには、ヘッダーのタイプによって決定される追加の基本クラスがあります。 たとえば、多くのヘッダーには、他の基本クラスとしてクラス UnstructuredHeader があります。 ヘッダーの特殊な2番目のクラスは、 HeaderRegistry に格納されているルックアップテーブルを使用して、ヘッダーの名前によって決定されます。 これらはすべて、一般的なアプリケーションプログラムに対して透過的に管理されますが、より複雑なアプリケーションで使用するためにデフォルトの動作を変更するためのインターフェイスが提供されています。
以下のセクションでは、最初にヘッダーの基本クラスとその属性について説明し、次に HeaderRegistry の動作を変更するためのAPIについて説明し、最後に構造化ヘッダーから解析されたデータを表すために使用されるサポートクラスについて説明します。
- class email.headerregistry.BaseHeader(name, value)
name および value は、 header_factory 呼び出しから
BaseHeader
に渡されます。 ヘッダーオブジェクトの文字列値は、Unicodeに完全にデコードされた value です。この基本クラスは、次の読み取り専用プロパティを定義します。
- name
ヘッダーの名前(「:」の前のフィールドの部分)。 これは、[X43X] name の header_factory 呼び出しで渡された値とまったく同じです。 つまり、大文字と小文字は区別されます。
- defects
解析中に見つかったRFCコンプライアンスの問題を報告する
HeaderDefect
インスタンスのタプル。 電子メールパッケージは、コンプライアンスの問題の検出について完全にしようとします。 報告される可能性のある欠陥の種類については、エラーモジュールを参照してください。
- max_count
同じ
name
を持つことができるこのタイプのヘッダーの最大数。None
の値は、無制限を意味します。 この属性のBaseHeader
値はNone
です。 特殊なヘッダークラスが必要に応じてこの値をオーバーライドすることが期待されます。
BaseHeader
は、次のメソッドも提供します。これは、電子メールライブラリコードによって呼び出され、通常はアプリケーションプログラムによって呼び出されるべきではありません。- fold(*, policy)
ポリシーに従ってヘッダーを正しく折りたたむために、必要に応じて linesep 文字を含む文字列を返します。
8bit
の cte_type は、ヘッダーに任意のバイナリデータが含まれていない可能性があるため、7bit
であるかのように扱われます。 utf8 がFalse
の場合、非ASCIIデータは RFC 2047 でエンコードされます。
BaseHeader
自体を使用して、ヘッダーオブジェクトを作成することはできません。 これは、ヘッダーオブジェクトを生成するために各特殊ヘッダーが連携するプロトコルを定義します。 具体的には、BaseHeader
では、特殊クラスがparse
という名前の classmethod()を提供する必要があります。 このメソッドは次のように呼び出されます。parse(string, kwds)
kwds
は、事前に初期化された1つのキーdefects
を含む辞書です。defects
は空のリストです。 parseメソッドは、検出された欠陥をこのリストに追加する必要があります。 戻ったとき、kwds
ディクショナリ must には、少なくともキーdecoded
およびdefects
の値が含まれている必要があります。decoded
は、ヘッダーの文字列値(つまり、Unicodeに完全にデコードされたヘッダー値)である必要があります。 parseメソッドは、 string にコンテンツ転送でエンコードされた部分が含まれている可能性があると想定する必要がありますが、エンコードされていないヘッダー値を解析できるように、すべての有効なUnicode文字も正しく処理する必要があります。次に、
BaseHeader
の__new__
はヘッダーインスタンスを作成し、そのinit
メソッドを呼び出します。 特殊クラスは、BaseHeader
自体によって提供される属性以外の追加の属性を設定する場合にのみ、init
メソッドを提供する必要があります。 このようなinit
メソッドは次のようになります。def init(self, /, *args, **kw): self._myattr = kw.pop('myattr') super().init(*args, **kw)
つまり、特殊クラスが
kwds
ディクショナリに追加したものはすべて削除して処理し、kw
(およびargs
)の残りの内容を[ X188X]init
メソッド。
- class email.headerregistry.UnstructuredHeader
「非構造化」ヘッダーは、 RFC 5322 のデフォルトタイプのヘッダーです。 指定された構文を持たないヘッダーは、非構造化として扱われます。 非構造化ヘッダーの典型的な例は、 Subject ヘッダーです。
RFC 5322 では、非構造化ヘッダーはASCII文字セット内の任意のテキストの実行です。 ただし、 RFC 2047 には、ヘッダー値内で非ASCIIテキストをASCII文字としてエンコードするための RFC 5322 互換メカニズムがあります。 エンコードされた単語を含む value がコンストラクターに渡されると、
UnstructuredHeader
パーサーは、 RFC 2047 の規則に従って、そのようなエンコードされた単語をUnicodeに変換します。構造化されていないテキストの場合。 パーサーはヒューリスティックを使用して、特定の非準拠のエンコードされた単語のデコードを試みます。 このような場合に欠陥が登録され、エンコードされた単語内の無効な文字やエンコードされていないテキストなどの問題の欠陥も登録されます。このヘッダータイプは、追加の属性を提供しません。
- class email.headerregistry.DateHeader
RFC 5322 は、電子メールヘッダー内の日付の非常に特殊な形式を指定します。
DateHeader
パーサーは、その日付形式を認識し、「実際に」見られることがあるいくつかのバリアント形式を認識します。このヘッダータイプは、次の追加属性を提供します。
- datetime
ヘッダー値が何らかの形式の有効な日付として認識できる場合、この属性には、その日付を表す datetime インスタンスが含まれます。 入力日付のタイムゾーンが
-0000
として指定されている場合(UTCであるが、ソースタイムゾーンに関する情報が含まれていないことを示します)、 datetime は単純な datetime になります。 ]。 特定のタイムゾーンオフセットが見つかった場合( +0000 を含む)、 datetime には、 datetime.timezone を使用して記録する認識可能なdatetime
が含まれます。タイムゾーンオフセット。
ヘッダーの
decoded
値は、 RFC 5322 ルールに従ってdatetime
をフォーマットすることによって決定されます。 つまり、次のように設定されます。email.utils.format_datetime(self.datetime)
DateHeader
を作成する場合、 value は datetime インスタンスである可能性があります。 これは、たとえば、次のコードが有効であり、期待どおりの動作をすることを意味します。msg['Date'] = datetime(2011, 7, 15, 21)
これはナイーブな
datetime
であるため、UTCタイムスタンプとして解釈され、結果の値のタイムゾーンは-0000
になります。 さらに便利なのは、 utils モジュールの localtime()関数を使用することです。msg['Date'] = utils.localtime()
この例では、現在のタイムゾーンオフセットを使用して、日付ヘッダーを現在の時刻と日付に設定します。
- class email.headerregistry.AddressHeader
アドレスヘッダーは、最も複雑な構造化ヘッダータイプの1つです。
AddressHeader
クラスは、任意のアドレスヘッダーへの汎用インターフェイスを提供します。このヘッダータイプは、次の追加属性を提供します。
- groups
ヘッダー値で見つかったアドレスとグループをエンコードする Group オブジェクトのタプル。 グループの一部ではないアドレスは、このリストでは、 display_name が
None
である単一アドレスGroups
として表されます。
- addresses
ヘッダー値からの個々のアドレスのすべてをエンコードする Address オブジェクトのタプル。 ヘッダー値にグループが含まれている場合、グループの個々のアドレスは、値内でグループが発生するポイントでリストに含まれます(つまり、アドレスのリストは1次元リストに「フラット化」されます)。
ヘッダーの
decoded
値では、エンコードされたすべての単語がUnicodeにデコードされます。 idna でエンコードされたドメイン名もUnicodeにデコードされます。decoded
値は、groups
属性の要素の str 値を', '
と結合することによって設定されます。Address オブジェクトと Group オブジェクトの任意の組み合わせのリストを使用して、アドレスヘッダーの値を設定できます。
display_name
がNone
であるGroup
オブジェクトは、単一のアドレスとして解釈されます。これにより、 [から取得したリストを使用して、アドレスリストをグループのままコピーできます。 X189X]ソースヘッダーの属性。
- class email.headerregistry.SingleAddressHeader
- AddressHeader のサブクラスで、次の1つの属性が追加されます。
- address
- ヘッダー値によってエンコードされた単一のアドレス。 ヘッダー値に実際に複数のアドレスが含まれている場合(デフォルトのポリシーではRFCに違反します)、この属性にアクセスすると ValueError になります。
上記のクラスの多くには、Unique
バリアント(たとえば、UniqueUnstructuredHeader
)もあります。 唯一の違いは、Unique
バリアントでは、 max_count が1に設定されていることです。
- class email.headerregistry.MIMEVersionHeader
MIME-Version ヘッダーの有効な値は、実際には
1.0
の1つだけです。 将来の校正のために、このヘッダークラスは他の有効なバージョン番号をサポートします。 バージョン番号が 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.ContentTransferEncoding
- Content-Transfer-Encoding ヘッダーを処理します。
- cte
- 有効な値は、
7bit
、8bit
、base64
、およびquoted-printable
です。 詳細については、 RFC 2045 を参照してください。
- 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__
リストの最後のクラスです。デフォルトのマッピングは次のとおりです。
- 主題
UniqueUnstructuredHeader
- 日にち
UniqueDateHeader
- 再送日
DateHeader
- 元の日付
UniqueDateHeader
- 送信者
UniqueSingleAddressHeader
- 再送-送信者
SingleAddressHeader
- に
UniqueAddressHeader
- 憤慨-
AddressHeader
- cc
UniqueAddressHeader
- resent-cc
AddressHeader
- bcc
UniqueAddressHeader
- resent-bcc
AddressHeader
- から
UniqueAddressHeader
- 憤慨-から
AddressHeader
- に返信
UniqueAddressHeader
- mimeバージョン
MIMEVersionHeader
- コンテンツタイプ
ContentTypeHeader
- コンテンツ処理
ContentDispositionHeader
- content-transfer-encoding
ContentTransferEncodingHeader
- メッセージ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 で説明されている特定の構文規則に準拠する必要があります。
便宜上、 username および domain の代わりに、 addr_spec を指定できます。この場合、 username および domain は指定されます。 addr_spec から解析されます。 addr_spec は、適切にRFCで引用された文字列である必要があります。
Address
でない場合、エラーが発生します。 Unicode文字は許可されており、シリアル化されるとプロパティでエンコードされます。 ただし、RFCによると、アドレスのユーザー名部分でのUnicodeの使用は許可されていません。- display_name
アドレスの表示名の部分(ある場合)。すべての引用符が削除されています。 アドレスに表示名がない場合、この属性は空の文字列になります。
- username
アドレスの
username
部分、すべての引用符が削除されています。
- domain
アドレスの
domain
部分。
- addr_spec
アドレスの
username@domain
部分。裸のアドレスとして使用するために正しく引用されています(上記の2番目の形式)。 この属性は変更できません。
- __str__()
オブジェクトの
str
値は、 RFC 5322 規則に従って引用されたアドレスですが、非ASCII文字のコンテンツ転送エンコーディングはありません。
SMTP( RFC 5321 )をサポートするために、
Address
は1つの特殊なケースを処理します。username
とdomain
が両方とも空の文字列である場合(またはNone
)の場合、Address
の文字列値は<>
になります。
- class email.headerregistry.Group(display_name=None, addresses=None)
アドレスグループを表すために使用されるクラス。 アドレスグループの一般的な形式は次のとおりです。
display_name: [address-list];
グループと単一アドレスの混合で構成されるアドレスのリストを処理するための便宜のために、
Group
を使用して、 display_name を設定することにより、グループの一部ではない単一アドレスを表すこともできます。None
に移動し、単一アドレスのリストをアドレスとして提供します。- display_name
グループの
display_name
。 それがNone
であり、addresses
にAddress
が1つしかない場合、Group
はグループにない単一のアドレスを表します。
- addresses
グループ内のアドレスを表す Address オブジェクトの空の可能性のあるタプル。
- __str__()
Group
のstr
値は、 RFC 5322 に従ってフォーマットされますが、非ASCII文字のコンテンツ転送エンコーディングはありません。display_name
がなしで、addresses
リストにAddress
が1つある場合、str
の値はstr
と同じになります。そのシングルAddress
の。
脚注