email - 电子邮件 IDNA 编码。我们是否需要对整个电子邮件或每个部分分别进行编码?
问题描述
我有一封带有重音符号的电子邮件,需要使用 IDNA(来自 Python)进行编码
像这样的东西:
CäciliaAbitz@somedomain.net
如果我encode('idna')
为整个电子邮件做 a,我会得到以下信息:
xn--cciliaabitz@somedomain-04b.net
域变成了somedomain-04b.net,这是不正常的(对吗?)
对电子邮件的每个部分进行编码会导致:
b''.join([x.encode('idna') for x in email.split('@')])
> b'xn--cciliaabitz-l8a@somedomain.net'
但我不确定这是否正确,是否有效,或者我是否遗漏了什么。
解决方案
RFC 5890适用于标签,这些标签主要是电子邮件地址的点分隔部分。在您的示例中,本地部分(@ 符号之前)只有一个标签“CäciliaAbitz”,域部分(“somedomain.net”)只有两个标签。如果您在不注意标签的情况下进行编码,则对点进行编码,结果是需要多个标签的单个标签。有了这个,您的假设“somedomain-04b.net”不正常(或有效)是正确的。
要正确编码,您不仅需要在 @ 处分割本地和域部分,还需要在本地和域部分内的任何点处分割。
推荐阅读
- php - Slim-3 php 框架显示页面未找到错误,即使 url 正确?
- android - 自定义视图翻译动画在回收站视图中不起作用
- yarnpkg - lerna的run命令和yarn的wsrun有什么区别?
- ruby-on-rails - 在 Rails 中将邮件附件保存为 Active Storage 对象
- java - 重构使用流 API 的方法
- testing - QA 阶段的新提交
- javascript - 如何一次滚动一个服务部分,同时将 .service-inner 元素保持在同一个位置?
- php - 如何从地址字符串中提取城市州邮政编码?
- angular - 将我的 Angular 项目更新为 Angular 7 时出错
- sql - 使用相同 WHERE 子句的 SELECT 和 UPDATE 之间的不同结果