我使用
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() 时,什么也没有发生。
电子邮件地址根据定义仅包含属于 ASCII 字符集的字符,因此该库使用
ascii
编解码器将提供的字符串编码为底层字节是正确的。鉴于 ø
未映射到有效 ASCII 字符之一,这会导致该错误消息。
现在,该电子邮件地址中的有问题的字符出现在域名部分,这表明该域名实际上是一个 IDN,并且其编码方案实际上不是 unicode 而是 Punycode 表示形式(相关 SO 线程)。由于该库似乎不支持 IDN,因此需要将域部分手动编码为 Puncode,这将是
xn--md-lka.dk
,因此该库可以理解的电子邮件地址将是 [email protected]
。