在域名中包含非 ASCII 字符的电子邮件地址中使用 imap-tools 时出错

问题描述 投票:0回答:1

我使用

imap-tools
访问我的电子邮件。

我的问题是,我正在尝试访问某人发送的电子邮件,该人的电子邮件包含特殊字符,例如

ø
,我无法正确编码,因为
from_
接受字符串作为输入,所以我没有得到任何结果。

import imap_tools

with imap_tools.MailBox('imap.gmx.net').login(email, password, 'INBOX') as mailbox:
    for msg in mailbox.fetch(imap_tools.AND(from_ = 'beskeder@mød.dk')):
        print('Found')

我缩短了代码。当在我的邮箱中找到

Found
发送的电子邮件时,我希望我的程序能够打印
beskeder@mød.dk
。发现其他没有特殊字符的电子邮件。

错误信息:

Traceback (most recent call last):
  File "/Users/user/Desktop/test.py", line 4, in <module>
    for msg in mailbox.fetch(imap_tools.AND(from_ = 'beskeder@mød.dk')):
  File "/Users/user/Library/Python/3.9/lib/python/site-packages/imap_tools/mailbox.py", line 130, in fetch
    nums = tuple((reversed if reverse else iter)(self.numbers(criteria, charset)))[limit_range]
  File "/Users/user/Library/Python/3.9/lib/python/site-packages/imap_tools/mailbox.py", line 67, in numbers
    encoded_criteria = criteria if type(criteria) is bytes else str(criteria).encode(charset)
UnicodeEncodeError: 'ascii' codec can't encode character '\xf8' in position 17: ordinal not in range(128)

我尝试添加

'beskeder@hottemøder.dk'.encode('ascii', 'ignore')
,但它也不起作用。

错误:

TypeError: "from_" expected str value, "<class 'int'>" received
,当我将其转换为 str() 时,什么也没有发生。

python ascii imap imap-tools
1个回答
0
投票

电子邮件地址根据定义仅包含属于 ASCII 字符集的字符,因此该库使用

ascii
编解码器将提供的字符串编码为底层字节是正确的。鉴于
ø
未映射到有效 ASCII 字符之一,这会导致该错误消息。

现在,该电子邮件地址中的问题字符出现在域名部分,这表明该域名实际上是一个 IDN,而 IDN 到字节的编码方案实际上不是通过任何 unicode 编码,而是使用Punycode 表示(相关 SO 线程)。由于该库似乎不支持 IDN,因此需要将域部分手动编码为 Puncode,这将是

xn--md-lka.dk
,因此该库可以理解的电子邮件地址将是
[email protected]

© www.soinside.com 2019 - 2024. All rights reserved.