首页 > 解决方案 > 电子邮件 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'

但我不确定这是否正确,是否有效,或者我是否遗漏了什么。

标签: email

解决方案


RFC 5890适用于标签,这些标签主要是电子邮件地址的点分隔部分。在您的示例中,本地部分(@ 符号之前)只有一个标签“CäciliaAbitz”,域部分(“somedomain.net”)只有两个标签。如果您在不注意标签的情况下进行编码,则对点进行编码,结果是需要多个标签的单个标签。有了这个,您的假设“somedomain-04b.net”不正常(或有效)是正确的。

要正确编码,您不仅需要在 @ 处分割本地和域部分,还需要在本地和域部分内的任何点处分割。


推荐阅读