python - Python imaplib 库 mail.fetch,为什么我们要硬编码 response[0][1]?
问题描述
我正在使用以下代码阅读未读电子邮件。
在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 服务器的响应是一个嵌套元组,其中包含状态消息、信封信息和您请求的电子邮件的实际内容。没有简单的方法可以避免说出您需要响应元组的哪些部分,但imaplib
如果您不想查看协议级别的事情是如何工作的(或者更确切地说,Python 库如何表示通过网络传输的内容)。
顺便说一句,将字节解码为 UTF-8 绝对是错误的做法。如果你比较幸运,你不会造成任何直接的伤害(也就是说,消息通常都是 ASCII,并且任何 8 位数据都隐藏在内容传输编码后面),但它仍然是错误的。您应该改为致电email_message = email.message_from_bytes(raw_email)
明确地说,如果您稍微不那么幸运,该消息包含不是 UTF-8 的 8 位文本,您将获得带有UnicodeDecodeError
. 您尚未检查该消息,因此绝对无法正确猜测它是否包含字符数据,如果包含,它使用哪种编码。也许也可以看看什么是字符编码以及我为什么要打扰它
推荐阅读
- java - 基于自定义属性的 JSoup Scraping
- bash - 在 chroot 中运行 google-chrome
- android - Android Bitmap.Compress 保存低质量和缩小图像的图像
- entity-framework-6 - 实体框架从多个表中选择列(对于 ThenInclude)?
- microsoft-graph-api - 通过 Microsoft Graph API 在 OneDrive 中搜索具有非西方文本的文档
- python - 高山 docker 容器内存泄漏中的 Flask REST-API
- python - Python正则表达式在两个字符串之间提取一个字符串
- r - 使用for循环R计算数据框列中的数字序列
- typescript - 你如何返回一个输入的 Promise
- java - 从 Scanner 获取输入时 Maven 挂起