email.header: å›½é™…åŒ–æ ‡å¤´Â¶
æº�代ç �: Lib/email/header.py
æ¤æ¨¡å�—是旧å¼� (Compat32) email API 的一部分。 在当å‰�çš„ API 䏿 ‡å¤´çš„ç¼–ç �和解ç �是由 EmailMessage 类的å—典型 API æ�¥é€�明地处ç�†çš„。 除了在旧有代ç �ä¸ä½¿ç”¨ï¼Œæ¤æ¨¡å�—在需è¦�完全控制当编ç �æ ‡å¤´æ—¶æ‰€ä½¿ç”¨çš„å—符集时也很有用处。
本节ä¸çš„å…¶ä½™æ–‡æœ¬æ˜¯æ¤æ¨¡å�—的原始文档。
RFC 2822 是æ��述电å�邮件消æ�¯æ ¼å¼�çš„åŸºç¡€æ ‡å‡†ã€‚ 它派生自更早的 RFC 822 æ ‡å‡†ï¼Œè¯¥æ ‡å‡†åœ¨å¤§å¤šæ•°ç”µå�邮件仅由 ASCII å—符组æˆ�时已被广泛使用。 RFC 2822 所æ��述的规范å�‡å®šç”µå�邮件都å�ªåŒ…å�« 7 ä½� ASCII å—符。
当然,éš�ç�€ç”µå�邮件在全ç�ƒéƒ¨ç½²ï¼Œå®ƒå·²ç»�å�˜å¾—国际化了,例如电å�邮件消æ�¯ä¸çŽ°åœ¨å�¯ä»¥ä½¿ç”¨ç‰¹å®šè¯è¨€çš„专属å—符集。 è¿™ä¸ªåŸºç¡€æ ‡å‡†ä»�ç„¶è¦�求电å�邮件消æ�¯å�ªä½¿ç”¨ 7 ä½� ASCII å—符æ�¥è¿›è¡Œä¼ 输,为æ¤ç¼–写了大é‡� RFC æ�¥æ��述如何将包å�«é�ž ASCII å—符的电å�邮件编ç �为符å�ˆ RFC 2822 çš„æ ¼å¼�。 这些 RFC 包括 RFC 2045, RFC 2046, RFC 2047 å’Œ RFC 2231。 email 包在其 email.header å’Œ email.charset 模å�—䏿”¯æŒ�äº†è¿™äº›æ ‡å‡†ã€‚
å¦‚æžœä½ æƒ³åœ¨ä½ çš„ç”µå�é‚®ä»¶æ ‡å¤´ä¸åŒ…括é�ž ASCII å—符,比如说是在 Subject 或 To å—æ®µä¸ï¼Œä½ 应当使用 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
>>> msg.as_string()
'Subject: =?iso-8859-1?q?p=F6stal?=\n\n'
是å�¦æ³¨æ„�到这里我们是如何希望 Subject å—æ®µåŒ…å�«é�ž ASCII å—符的? 我们通过创建一个 Header å®žä¾‹å¹¶ä¼ å…¥å—节串编ç �所用的å—符集æ�¥å�šåˆ°è¿™ä¸€ç‚¹ã€‚ 当å�Žç»çš„ Message 实例被展平时,Subject å—æ®µä¼šæ£ç¡®åœ°æŒ‰ RFC 2047 æ�¥ç¼–ç �。 å�¯æ„ŸçŸ¥ MIME 的电å�邮件阅读器将会使用嵌入的 ISO-8859-1 å—符æ�¥æ˜¾ç¤ºæ¤æ ‡å¤´ã€‚
以下是 Header 类�述:
- class email.header.Header(s=None, charset=None, maxlinelen=None, header_name=None, continuation_ws=' ', errors='strict')¶
创建符å�ˆ MIME è¦�æ±‚çš„æ ‡å¤´ï¼Œå…¶ä¸å�¯åŒ…å�«ä¸�å�Œå—符集的å—符串。
å�¯é€‰çš„ s 是åˆ�å§‹æ ‡å¤´å€¼ã€‚ 如果为
None(默认值),则表示åˆ�å§‹æ ‡å¤´å€¼æœªè®¾ç½®ã€‚ ä½ å�¯ä»¥åœ¨ç¨�å�Žä½¿ç”¨append()方法调用å�‘æ ‡å¤´æ·»åŠ æ–°å€¼ã€‚ s å�¯ä»¥æ˜¯bytes或str的实例,注æ„�å�‚阅append()文档了解相关è¯ä¹‰ã€‚å�¯é€‰çš„ charset 用于两ç§�目的:它的å�«ä¹‰ä¸Ž
append()方法的 charset å�‚数相å�Œã€‚ 它还会为所有çœ�略了 charset å�‚æ•°çš„å�Žç»append()调用设置默认å—符集。 如果 charset åœ¨æž„é€ å™¨ä¸æœªæ��供(默认设置),则会将us-asciiå—符集用作 s çš„åˆ�å§‹å—符集以å�Šå�Žç»append()调用的默认å—符集。通过 maxlinelen å�¯ä»¥æ˜¾å¼�指定最大行长度。 è¦�将第一行拆分为更çŸçš„值 (以适应未被包括在to account for the field header which isn't included in s ä¸çš„å—æ®µæ ‡å¤´ï¼Œä¾‹å¦‚ Subject)ï¼Œåˆ™å°†å—æ®µå��称作为 header_name ä¼ å…¥ã€‚ maxlinelen 默认值为 76,而 header_name 默认值为
None,表示ä¸�è€ƒè™‘æ‹†åˆ†è¶…é•¿æ ‡å¤´çš„ç¬¬ä¸€è¡Œã€‚å�¯é€‰çš„ continuation_ws 必须为符å�ˆ RFC 2822 的折å� ç”¨ç©ºç™½ç¬¦ï¼Œé€šå¸¸æ˜¯ç©ºæ ¼ç¬¦æˆ–ç¡¬åˆ¶è¡¨ç¬¦ã€‚ 这个å—ç¬¦å°†è¢«åŠ ç¼€è‡³è¿žç»è¡Œçš„开头。 continuation_ws é»˜è®¤ä¸ºä¸€ä¸ªç©ºæ ¼ç¬¦ã€‚
å�¯é€‰çš„ errors ä¼šè¢«ç›´æŽ¥ä¼ é€’ç»™
append()方法。- append(s, charset=None, errors='strict')¶
å°†å—符串 s æ·»åŠ åˆ° MIME æ ‡å¤´ã€‚
如果给出�选的 charset,它应当是一个
Charset实例 (å�‚è§�email.charset) 或å—符集å��称,该å�‚数将被转æ�¢ä¸ºä¸€ä¸ªCharset实例。 如果为None(默认值) åˆ™è¡¨ç¤ºä¼šä½¿ç”¨æž„é€ å™¨ä¸ç»™å‡ºçš„ charset。s å�¯ä»¥æ˜¯
bytes或str的实例。 如果它是bytes的实例,则 charset 为该å—节串的编ç �æ ¼å¼�,如果å—èŠ‚ä¸²æ— æ³•ç”¨è¯¥å—符集æ�¥è§£ç �则将引å�‘UnicodeError。如果 s 是
str的实例,则 charset 是用æ�¥æŒ‡å®šå—符串ä¸å—符å—符集的æ��示。在这两ç§�情况下,当使用 RFC 2047 规则产生符å�ˆ RFC 2822 çš„æ ‡å¤´æ—¶ï¼Œå°†ä½¿ç”¨æŒ‡å®šå—符集的输出编解ç �器æ�¥ç¼–ç �å—符串。 如果å—ç¬¦ä¸²æ— æ³•ä½¿ç”¨è¯¥è¾“å‡ºç¼–è§£ç �器æ�¥ç¼–ç �,则将引å�‘ UnicodeError。
å�¯é€‰çš„ errors 会在 s 为å—节串时被作为 errors å�‚æ•°ä¼ é€’ç»™ decode 调用。
- encode(splitchars=';, \t', maxlinelen=None, linesep='\n')¶
将消æ�¯æ ‡å¤´ç¼–ç �为符å�ˆ RFC çš„æ ¼å¼�,å�¯èƒ½ä¼šå¯¹è¿‡é•¿çš„行采å�–折行并将é�ž ASCII 部分以 base64 或 quoted-printable ç¼–ç �æ ¼å¼�进行å°�装。
å�¯é€‰çš„ splitchars 是一个å—符串,其ä¸åŒ…å�«åº”在æ£å¸¸çš„æ ‡å¤´æŠ˜è¡Œå¤„ç�†æœŸé—´ç”±æ‹†åˆ†ç®—法赋予é¢�外æ�ƒé‡�çš„å—符。 这是对于 RFC 2822 ä¸ 'æ›´é«˜å±‚çº§è¯æ³•拆分' 的很粗略的支æŒ�:在拆分期间会首选在 splitchar 之å‰�的拆分点,å—符的优先级是基于它们在å—符串ä¸çš„出现顺åº�。 å—符串ä¸å�¯åŒ…å�«ç©ºæ ¼å’Œåˆ¶è¡¨ç¬¦ä»¥æŒ‡æ˜Žå½“其他拆分å—符未在被拆分行ä¸å‡ºçŽ°æ—¶æ˜¯å�¦è¦�å°†æŸ�个å—符作为优先于å�¦ä¸€ä¸ªå—符的首选拆分点。 拆分å—符ä¸�会影å“�以 RFC 2047 ç¼–ç �的行。
如果给出 maxlinelen,它将覆盖实例的最大行长度值。
linesep 指定用æ�¥åˆ†éš”已折å� æ ‡å¤´è¡Œçš„å—符。 它默认为 Python 应用程åº�代ç �䏿œ€å¸¸ç”¨çš„值 (
\n),但也å�¯ä»¥æŒ‡å®šä¸º\r\n以便产生带有符å�ˆ RFC çš„è¡Œåˆ†éš”ç¬¦çš„æ ‡å¤´ã€‚åœ¨ 3.2 版本å�‘生å�˜æ›´: å¢žåŠ äº† linesep å�‚数。
Header类还æ��供了一些方法以支æŒ�æ ‡å‡†è¿�算符和内置函数。- __str__()¶
以å—符串形å¼�返回
Header的近似表示,使用ä¸�å�—é™�制的行长度。 所有部分都会使用指定编ç �æ ¼å¼�转æ�¢ä¸º unicode 并适当地连接起æ�¥ã€‚ 任何带有'unknown-8bit'å—符集的部分都会使用'replace'错误处ç�†ç¨‹åº�è§£ç �为 ASCII。在 3.2 版本å�‘生å�˜æ›´: å¢žåŠ å¯¹
'unknown-8bit'å—符集的处ç�†ã€‚
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?=') [(b'p\xf6stal', 'iso-8859-1')]
- email.header.make_header(decoded_seq, maxlinelen=None, header_name=None, continuation_ws=' ')¶
基于
decode_header()所返回的数æ�®å¯¹åº�列创建一个Header实例。decode_header()接å�—ä¸€ä¸ªæ ‡å¤´å€¼å—ç¬¦ä¸²å¹¶è¿”å›žæ ¼å¼�为(decoded_string, charset)的数æ�®å¯¹åº�åˆ—ï¼Œå…¶ä¸ charset 是å—符集å��称。这个函数接å�—è¿™æ ·çš„æ•°æ�®å¯¹åº�列并返回一个
Header实例。 å�¯é€‰çš„ maxlinelen, header_name å’Œ continuation_ws 与Headeræž„é€ å™¨ä¸çš„å�«ä¹‰ç›¸å�Œã€‚