使用imap-tools处理含非ASCII字符域名邮箱地址报错求助
解决imap-tools筛选含特殊字符邮箱的编码错误问题
问题核心在于IMAP协议要求邮箱地址使用**Punycode(IDNA编码)**的ASCII格式:直接传入带ø的Unicode字符串会触发编码错误;而encode('ascii', 'ignore')得到的是字节串,imap-tools的from_参数只接受字符串,因此会报TypeError。
用Python内置的idna模块处理域名部分即可解决:
import imap_tools import idna # 将含特殊字符的域名转换为Punycode格式的ASCII字符串 encoded_domain = idna.encode('mød.dk').decode('ascii') # 拼接成完整的编码后邮箱地址 target_email = f'beskeder@{encoded_domain}' with imap_tools.MailBox('imap.gmx.net').login(email, password, 'INBOX') as mailbox: for msg in mailbox.fetch(imap_tools.AND(from_=target_email)): print('Found')
补充说明
idna.encode()会把Unicode域名(比如mød.dk)转换成IMAP服务器可识别的Punycode格式(此处结果为xn--md-0ka.dk),再转成字符串传入参数,既符合编码要求,又不会触发类型错误。- 不要用
encode('ascii', 'ignore')这种粗暴处理:它会直接丢弃ø字符,导致查询的邮箱地址无效,且返回的字节串不被imap-tools接受。
内容的提问来源于stack exchange,提问作者Mouse7000
相关产品推荐
相关产品推荐

