Python IMAP读取Hotmail邮件时链接字符异常问题排查
问题原因
你看到的3D字符是Quoted-Printable(QP)编码的转义结果:
- QP编码中,特殊字符
=会被转义为=3D - 链接里的
=Br是QP的软换行标记:行尾的=表示换行,后续字符是下一行内容,需要拼接起来。
Hotmail的IMAP服务器返回的邮件内容默认使用QP编码,你只转成UTF-8但没处理QP解码,所以残留了这些转义字符。
解决方法
用Python标准库quopri直接解码QP编码内容,就能自动处理这些转义:
直接解码链接
import quopri encoded_link = "https://accounts.tester.org/pass?userid=3D390191762&key=3D234295618-uqK=BrOjVkYE8O0DRTPfUfAWeBadbBy" decoded_link = quopri.decodestring(encoded_link).decode('utf-8') print(decoded_link) # 输出正确链接:https://accounts.tester.org/pass?userid=390191762&key=234295618-uqKBrOjVkYE8O0DRTPfUfAWeBadbBy
更规范的邮件处理流程
建议先对整个邮件正文做QP解码,再提取链接,避免遗漏其他转义:
import imaplib import quopri from email import policy from email.parser import BytesParser # 连接Hotmail IMAP服务器 mail = imaplib.IMAP4_SSL('imap-mail.outlook.com') mail.login('your_hotmail@outlook.com', 'your_password') mail.select('inbox') # 获取最新邮件 _, data = mail.search(None, 'ALL') latest_id = data[0].split()[-1] _, raw_email = mail.fetch(latest_id, '(RFC822)') # 解析邮件内容 msg = BytesParser(policy=policy.default).parsebytes(raw_email[0][1]) body = msg.get_content() # 处理QP编码 if 'quoted-printable' in msg.get('Content-Transfer-Encoding', '').lower(): decoded_body = quopri.decodestring(body).decode(msg.get_content_charset() or 'utf-8') else: decoded_body = body # 从decoded_body中提取验证链接(这里可根据实际用正则或其他方式提取)
内容的提问来源于stack exchange,提问作者Macrowave
相关产品推荐
相关产品推荐

