游戏开发后端【免费下载链接】kbengineA MMOG engine of server.项目地址https://gitcode.com/gh_mirrors/kb/kbengine点击查看免费下载文章导读本文围绕 KBEngine 开源仓库kbe/src/lib/python/Doc/library/email.header.rst这份官方文档展开系统讲解 Pythonemail.header模块如何在 7-bit ASCII 邮件传输协议RFC 2822约束下通过 RFC 2047 编码字encoded-word表示非 ASCII 字符的邮件头部如 Subject、To。读者将掌握Header类的构造与折行folding参数、append/encode的编码语义以及decode_header/make_header的往返解析方法并了解这些能力在 KBEngine 邮件服务激活、重置密码、邮箱绑定中的应用场景。背景为什么邮件头需要国际化编码RFC 2822 是描述邮件消息格式的基础标准它脱胎于更早的 RFC 822——后者普及的时代绝大多数邮件只由 ASCII 字符构成。RFC 2822 的规范撰写前提是邮件只含 7-bit ASCII 字符。随着邮件在全球范围的部署邮件内容必然走向国际化各国语言特有的字符集得以进入邮件消息。但基础标准仍然要求邮件以 7-bit ASCII 字符传输因此围绕如何把含非 ASCII 字符的邮件编码成 RFC 2822 兼容格式涌现了一系列 RFCRFC 2045、RFC 2046、RFC 2047 与 RFC 2231。email包在email.header与email.charset两个模块中支持这些标准参见 header.py 的模块头注释。说明本仓库文档对应 Python 3 的email.header模块文档。该模块属于遗留的Compat32邮件 API 的一部分在当前 API 中头部编解码已由email.message.EmailMessage的类字典接口透明处理。但email.header依然适用于两类场景遗留代码的兼容以及需要完全掌控头部编码所用字符集的应用。KBEngine 内置的这套 Python 3 标准库位于 kbe/src/lib/python/Lib/email/模块源码为 header.py字符集实现见 charset.py。快速上手让 Subject 支持非 ASCII 字符如果你想把非 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?pF6stal?\n\n注意这里我们让Subject字段包含非 ASCII 字符的做法先创建Header实例传入字节串所采用的字符集。当Message实例被展平flatten为字符串时Subject字段被正确执行了 RFC 2047 编码。支持 MIME 的邮件阅读器会以内嵌的 ISO-8859-1 字符显示该头部。这个示例同样出现在仓库的单元测试中test_email.py测试覆盖了各类头部构造与编码分支如test_header_encode_*、test_header_decode_*系列可作为行为验证依据。Header类构造参数全面解析Header(sNone, charsetNone, maxlinelenNone, header_nameNone, continuation_ws , errorsstrict)创建一个符合 MIME 规范、可容纳不同字符集字符串的头部。各参数语义如下参数默认值说明sNone初始头部值。为None时不设置初始值可后续通过append()追加s可以是bytes或str实例语义见append文档。charsetNone即us-ascii双重作用与append的charset参数含义相同同时设定后续所有省略charset的append调用所使用的默认字符集。构造时不提供则us-ascii同时用作s的初始字符集和后续append的默认值。maxlinelen76文档/ 实际实现为78最大行长度。若要针对首行使用更短的值为头部字段名留出空间如Subject:它不计入s需通过header_name传入字段名。header_nameNone传入字段名时构造器按len(header_name) 2计入首行前缀冒号加空格。默认None表示长头部分割时首行不做此考虑。continuation_ws单个空格 必须是符合 RFC 2822 的折行空白folding whitespace通常为空格或硬制表符会前置到续行。errorsstrict直接透传给append方法。细节说明文档正文给出的默认maxlinelen为 76而本仓库实现 header.py 中常量MAXLINELEN 78源码注释注明按 RFC 2822 建议。测试test_explicit_maxlinelentest_email.py展示了默认值、header_nameSubject以及maxlinelen1024三种情况下的折行差异可作为实际行为的对照。append(s, charsetNone, errorsstrict)追加头部内容把字符串s追加到 MIME 头部可选charset若给出应为email.charset.Charset实例见 charset.py或字符集名称会被转换为Charset实例None默认表示使用构造器给定的字符集。s可以是bytes或str若为bytes则charset是该字节串的编码若无法用该字符集解码将抛出UnicodeError。若为str则charset是提示该字符串字符所属的字符集。无论哪种情况生成符合 RFC 2822 的头部时按 RFC 2047 规则字符串将用字符集的输出编解码器output codec编码若无法编码抛出UnicodeError。可选errors在s为字节串时作为decode调用的错误处理参数传入。源码实现要点header.pybytes输入先按input_codec解码未知 8-bit 时以surrogateescape处理随后用output_codec做提前编码校验——若输出编码失败且输出字符集不是us-ascii则抛出异常若是us-ascii则自动降级改用UTF8字符集保证纯 ASCII 目标下也能容纳非 ASCII 输入。encode(splitchars;, \t, maxlinelenNone, linesep\n)生成符合规范的头部把消息头编码成符合 RFC 的格式必要时折行并将非 ASCII 部分封装为 base64 或 quoted-printable可选splitchars为字符串其中的字符在普通头部折行时由分割算法赋予额外权重——粗略支持 RFC 2822 的更高层句法断点以 splitchar 结尾的断点优先作为分割点优先顺序按字符串中出现的先后排列。可在字符串中包含空格与制表符以表示当待折行行内没有其他分割字符时优先以哪一个作为分割点。splitchars不影响 RFC 2047 编码行。maxlinelen若给出则覆盖实例的最大行长度。linesep指定折行头部的行分隔字符。默认是 Python 应用代码最常用的\n指定\r\n可生成带 RFC 规范行分隔符的头部。该参数为 Python 3.2 新增versionchanged:: 3.2。源码实现要点header.pymaxlinelen 0表示不折行实现上替换为 1000000_ValueFormatter按字符集是否有头编码header_encoding分派到_ascii_split或header_encode_lines两条路径最终输出经_embedded_header正则\n[^ \t]:见 header.py检查若发现疑似内嵌头部则抛出HeaderParseError以此防御头部注入攻击——对应测试test_embedded_header_via_Header_rejected与test_embedded_header_via_string_rejected。便捷函数解码与重建email.header模块还提供两个便捷函数。decode_header(header)不解码字符集的头部解码解码消息头部值而不转换字符集。头部值在header中。返回由(decoded_string, charset)对组成的列表包含头部的每个已解码片段未编码片段其charset为None编码片段则为编码串中指定字符集名称的小写字符串。示例 from email.header import decode_header decode_header(?iso-8859-1?q?pF6stal?) [(bp\xf6stal, iso-8859-1)]源码实现要点header.py先按正则ecre形如?charset?q?Hello_World?的编码字模式见 header.py解析为(encoded, encoding, charset)三元组随后删除两个编码字之间纯空白词再按qquoted-printable经email.quoprimime.header_decode或bbase64经email.base64mime.decode分别解码——base64 缺失填充按 Postel 法则补足若binascii.Error则抛出HeaderParseError对应测试test_broken_base64_header。最后把连续相同字符集且相邻的片段折叠合并。因此decode_header也可能因某些解码错误如 base64 解码异常抛出email.errors.HeaderParseError。make_header(decoded_seq, maxlinelenNone, header_nameNone, continuation_ws )从解码序列重建Headerdecode_header接收头部值字符串并返回(decoded_string, charset)对序列make_header则接收这样一组序列并返回Header实例。可选maxlinelen、header_name、continuation_ws与Header构造器含义相同。实现上header.py先按给定参数构造Header再把每个(s, charset)对中非None的字符集名转换为Charset实例后逐一appendNone直接透传即us-ascii。往返round-trip模式二者天然配对make_header(decode_header(encoded))可把已编码头部解析回Header对象其str()/encode()结果与原文等价。仓库测试test_header_roundtrip_*系列见 test_email.py如x str(make_header(decode_header(s)))的断言验证了该往返一致性中文与日文等亚洲字符集场景由 test_asian_codecs.py 覆盖。字符集与编码策略email.charset协同机制Header的编码能力依赖 charset.py 中Charset类注册表CHARSETScharset.py每项描述(header_enc, body_enc, output_charset)头部编码header_enc可为QPquoted-printable值 1、BASE64值 2、SHORTEST值 3仅用于头部取 QP 与 base64 中较短者或None无编码。如iso-8859-1族用 QPbig5、gb2312、euc-jp、koi8-r用 base64utf-8用 SHORTESTus-ascii无编码。输出转换euc-jp、shift_jis会先转换为iso-2022-jp再编码测试test_shift_jis_charset断言Header(文, charsetshift_jis)编码为?iso-2022-jp?b?GyRCSjgbKEI?见 test_email.py。add_charset(charset, header_encNone, body_encNone, output_charsetNone)等函数可向全局注册表扩展自定义字符集属性charset.py。实际编码时Charset.header_encode_linescharset.py以字符为单位逐字符试编码、按行上限扣除 RFC 2047 外壳?charset?x?...?的 7 字符RFC2047_CHROME_LEN拆分保证每个编码字独立成行_get_encoder依据header_encoding选择email.base64mime或email.quoprimimeSHORTEST 时比较两者长度。在 KBEngine 邮件服务中的典型应用KBEngine 服务器框架内置完整 SMTP 邮件发送能力其默认配置位于 email_service_defaults.xml包括 SMTP 服务器/端口/认证模式LOGIN1, PLAIN2、可选用 kbe_private.key 的 RSA 加密密码以及三类事务型邮件模板——账号激活email_activation有效期 259200 秒、重置密码email_resetpassword有效期 3600 秒、邮箱绑定email_bind有效期 3600 秒正文均为 HTML通过${backlink}、${username}占位符注入链接。这类邮件主题subject往往包含中文如账号激活这正是email.header的用武之地邮件投递前把中文主题包装为Header实例utf-8字符集下按 SHORTEST 策略自动选 base64 或 quoted-printablemsg.as_string()展平时自动产生 RFC 2047 编码字收件端如 Web 邮件系统则可借助decode_header与make_header还原或重建主题。C 侧 SMTP 发送链路可参考 sendmail_threadtasks.h 与 sendmail_threadtasks.cpp。小结与最佳实践头部含非 ASCII 内容时把Subject/To等字段赋值为Header实例指定正确字符集让Message.as_string()自动完成 RFC 2047 编码长头部用maxlinelen文档默认 76、本实现 78配合header_name控制折行位置continuation_ws决定续行缩进需要 RFC 行分隔符时encode(linesep\r\n)收到含编码字的头部用decode_header得到(bytes, charset)片段列表再以make_header重建Header实例实现无损往返中文等宽字符集建议交由 SHORTEST 策略utf-8自动权衡 base64/QP避免手写过长编码字勿在头部值中注入换行与字段格式\nname: valueHeader.encode()会抛出HeaderParseError拒绝这类注入。赞分享游戏开发后端【免费下载链接】kbengineA MMOG engine of server.项目地址https://gitcode.com/gh_mirrors/kb/kbengine点击查看免费下载相关推荐Python email.header 国际化邮件头编解码指南RFC 2047 encoded-word 的底层实现与实战CPython 源码解析Python email.header 国际化邮件头编解码指南RFC 2047 encoded word 的底层实现与实战CPython 源码解析 ema编程语言语言运行时解释器标准库KBEngine 内置 Python 的 API 与 ABI 版本机制PY_VERSION_HEX 编码规范深度解析KBEngine 内置 Python 的 API 与 ABI 版本机制PY_VERSION_HEX 编码规范深度解析 导读 本文以 CPython 官方文档游戏开发后端codeforces-go 仓库解读力扣双周赛 150 四题精讲遍历求和 / 浮点与整数二分 / 差分扫描线 / Lazy 线段树 / KMP 三指针codeforces go 仓库解读力扣双周赛 150 四题精讲遍历求和 / 浮点与整数二分 / 差分扫描线 / Lazy 线段树 / KMP 三指针 本游戏开发后端上一篇如何为WordPress Starter Theme添加强大的主题选项和自定义字段下一篇ZendOptimizerPlus高级功能黑名单配置与大型项目优化策略终极指南 创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考