我使用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')

我缩短了我的代码.当在我的邮箱中找到beskeder@mød.dk发送的邮箱时,我预计我的程序将打印Found.发现其他没有特殊字符的邮箱.

错误消息:

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)
UnicodeEncode错误: 'ascii' codec can't encode character '\xf8' in position 17: ordinal not in range(128)

我试图添加'beskeder@hottemøder.dk'.encode('ascii', 'ignore'),但也不起作用.

错误:

Type错误: "from_" expected str value, "<class 'int'>" received and when I convert it to str() nothing happens.

推荐答案

查看库的获取方法current version的相关源代码,如果提供了正确的编码(例如UTF-8),则可以避免内部方法numbers中的相应故障. 因此,也许做以下这样的事情可以解决这个问题:

mailbox.fetch(imap_tools.AND(from_='beskeder@mød.dk', charset='UTF-8')

本节是在假设库没有正确支持正确的PCC(具体来说,RFC 6855 -TIP支持对UTF-8)的情况下编写的. 为了增加相关性,本节也进行了修改,并保留以供参考,因为它可能作为手头相关topipc的背景信息有用.

根据定义,协议级别的邮箱地址仅包含ASCII character set的一部分字符(即使是internationalized email addresses is now a standard),因此该库使用ascii编解码器将提供的字符串编码到底层字节中是正确的.鉴于ø没有映射到有效的ASC字符之一,因此产生的错误消息对应于支持国际化邮箱地址可能未启用的事实(特别是RFC 6855,但如前所述,它可能只是配置设置和/或库的旧版本).

现在,该邮箱地址中的有问题的字符出现在域部分中,这表明该域实际上是IDN,并且将IDT编码为字节的方案实际上不是通过任何unicode编码,而是使用Punycode表示(related SO thread). 由于该库显然缺乏对RFC 6855的支持,因此不支持IDT,因此需要将域部分(mød.dk)手动编码为Punycode,即xn--md-lka.dk,因此该库将理解的邮箱地址变成类似于example@xn--md-lka.dk. 然而,考虑到这是一个LMA库,因此实际上只有RFC 6855适用(即whole邮箱地址实际上编码为UTF-8),并且dn/Punycode的问题可能与LMA不绝对相关,但最好记住,IDT的这个特定细节也可能起作用.

现在这只涵盖邮箱的域部分,而不涵盖local part.如果本地部分还包含代码点在asspel字符集之外的字符,则需要按照RFC 6530使用UTF-8将它们编码为字节.

现代邮箱相关库应该能够满足现代要求,但有时它们接受新标准可能会很慢,因此可能需要将邮箱地址的部分手动编码到底层编码中等变通方法.

Python相关问答推荐

Python:模块未找到:venv为什么要解决它?

如何在句子之间添加空白但忽略链接?

Asyncio与队列的多处理通信-仅运行一个协程

Pandas基于另一列的价值的新列

判断两极中N(N 2)列水平是否相等

Python:记录而不是在文件中写入询问在多文件项目中记录的最佳实践

使用图片生成PDF Django rest框架

使用from_pandas将GeDataFrame转换为polars失败,ArrowType错误:未传递numpy. dype对象

@Property方法上的inspect.getmembers出现意外行为,引发异常

Deliveryter Notebook -无法在for循环中更新matplotlib情节(保留之前的情节),也无法使用动画子功能对情节进行动画

'discord.ext. commanders.cog没有属性监听器'

对整个 pyramid 进行分组与对 pyramid 列子集进行分组

在Pandas DataFrame操作中用链接替换'方法的更有效方法

从numpy数组和参数创建收件箱

pandas滚动和窗口中有效观察的最大数量

如何在polars(pythonapi)中解构嵌套 struct ?

大小为M的第N位_计数(或人口计数)的公式

Python虚拟环境的轻量级使用

Python脚本使用蓝牙运行在Windows 11与raspberry pi4

Python—转换日期:价目表到新行