问题描述
我正在使用以下代码阅读未读电子邮件。
在 mail.fetch
方法中,获取 typ,data 作为返回参数,我们使用 raw_email = data[0][1]
访问原始电子邮件。谁能解释为什么我们将索引硬编码为 [0][1]
以获取消息?这是在不进行任何硬编码的情况下获取消息的正确方法吗?
Python 代码如下:
import imaplib
mail = imaplib.IMAP4_SSL('imap.gmail.com')
try:
mail.login(email_user,email_pass)
status,messages = mail.select("INBOX")
(retcode,emailnums) = mail.search(None,'(UNSEEN)')
if retcode == 'OK':
for emailnum in emailnums[0].split():
typ,data = mail.fetch(emailnum,'(RFC822)')
raw_email = data[0][1]
#converts byte literal to string removing b''
raw_email_string = raw_email.decode('utf-8')
email_message = email.message_from_string(raw_email_string)
解决方法
来自 IMAP 服务器的响应是一个嵌套元组,包含状态消息、信封信息和您请求的电子邮件的实际内容。没有简单的方法可以避免说出您需要响应元组的哪些部分,但如果您不想查看这些部分,也许您会想要围绕 Python 的低级 ifeq ($(origin CC),default)
CC = $(SOMETHING)
else
CC ?= $(SOMETHING)
endif
寻找更高级别的包装器关于协议级别的工作原理(或者更确切地说,Python 库如何表示通过网络移动的内容)的具体细节。
顺便说一句,将字节解码为 UTF-8 绝对是错误的做法。如果您比较幸运,您不会造成任何直接伤害(也就是说,消息基本上都是 ASCII,并且任何 8 位数据都隐藏在内容传输编码之后),但它仍然是错误的。您应该改为调用 imaplib
明确地说,如果您的运气稍微差一点,该消息包含 8 位文本(不是 UTF-8),您将获得带有 email_message = email.message_from_bytes(raw_email)
的回溯。您尚未检查该消息,因此绝对无法正确猜测它是否包含字符数据,如果包含,则使用哪种编码。也许另见What is character encoding and why should I bother with it