使用Python imaplib下载Gmail文本而不下载完整附件

1 投票
1 回答
2297 浏览
提问于 2025-04-17 20:07

我正在用Python的'imaplib'库从Gmail账户获取邮件。但是我只想知道邮件的内容和附件的标题,不需要下载整个附件。

默认情况下,

myGmail = imaplib.IMAP4_SSL(...)
....
(respCode, data) = myGmail.fetch(mailUid, 'RFC822')

这个命令会返回邮件的全部内容,包括作为文本编码的整个附件,这样有时候会非常大,而且不必要。

我在网上和StackOverflow上搜索过答案,很多人提到要先使用

myGmail.fetch(mailUid, 'BODYSTRUCTURE')

来确定邮件的结构,然后再找出你想下载的部分。我也读过关于imap4协议的RFC 3501文档,在其中提到我可以使用

BODY[]<> 来在Fetch命令中下载特定的邮件正文部分。

但是我在Python的imaplib中尝试了很多命令,比如:

(rCode, data) = myGmail.fetch(mailUid, 'BODY[0]')
(rCode, data) = myGmail.fetch(mailUid, 'BODY0')
(rCode, data) = myGmail.fetch(mailUid, 'BODY[TEXT]')

但所有的尝试都失败了,错误信息是:

错误:FETCH命令错误:BAD ['无法解析命令']

所以有没有人能告诉我如何在Python的imaplib中为Gmail使用这个命令?

另外,供你参考,上面例子邮件的BODYSTRUCTURE是:

(BODY 
 (
  (
    (
      ("TEXT" "PLAIN" ("CHARSET" "us-ascii") NIL NIL "QUOTED-PRINTABLE" 1742 33)
      ("TEXT" "HTML" ("CHARSET" "us-ascii") NIL NIL "QUOTED-PRINTABLE" 17976 485) "ALTERNATIVE"
    )
    (
      "IMAGE" "JPEG" 
      ("NAME" "image001.jpg") "<image001.jpg@01CD029F.6831C440>" "image001.jpg" "BASE64" 4070
    ) 
    "RELATED"
  )
  ("APPLICATION" "PDF" ("NAME" "SAC 2012.pdf") NIL "SAC 2012.pdf" "BASE64" 20638)
  "MIXED"
 )
 )

谢谢!!!

1 个回答

2

只需要把 BODY[0] 替换成 (BODY[1]) 就可以了。

撰写回答