从邮件附件中提取 To: 头信息

3 投票
1 回答
1036 浏览
提问于 2025-04-15 13:45

我正在用Python在服务器上打开电子邮件(使用POP3协议)。每封邮件都有一个附件,这个附件其实是另一封转发的邮件。

我需要从这个附件中提取出“收件人(To:)”的地址。

我正在用Python来学习这门语言,但我还不是很熟练!

我现在有的代码是这个:

import poplib, email, mimetypes

    oPop = poplib.POP3( 'xx.xxx.xx.xx' )
    oPop.user( 'abc@xxxxx.xxx' )
    oPop.pass_( 'xxxxxx' )

    (iNumMessages, iTotalSize ) = oPop.stat()

    for thisNum in range(1, iNumMessages + 1): 
          (server_msg, body, octets) = oPop.retr(thisNum)
          sMail = "\n".join( body )

          oMsg = email.message_from_string( sMail )

          # now what ?? 

我知道我有一个邮件实例,但我不太确定怎么去获取附件。

我知道使用:

  sData = 'To'
       if sData in oMsg:
       print sData + "", oMsg[sData]

可以从主邮件中获取“收件人(To:)”的头信息,但我该如何从附件中获取呢?

我尝试过:

for part in oMsg.walk():
    oAttach = part.get_payload(1)

但我不太确定该如何处理oAttach对象。我试着把它转换成字符串,然后传给:

oMsgAttach = email.message_from_string( oAttach )

但这样没有任何效果。我对Python的文档有点无从下手,需要一些帮助。谢谢大家!

1 个回答

1

没有一个代表性的邮件在我的收件箱里,我很难搞清楚这个问题(我从来没有用过poplib)。不过,我做了一点小调查,有一些信息可能对你有帮助:

首先,多多使用Python的命令行界面,以及dir()help()这两个函数:它们能告诉你很多关于输出的信息。你可以在代码里插入help(oAttach)dir(oAttach)print oAttach,这样可以帮助你了解在循环中发生了什么。如果你是逐行在命令行里输入,这样做会更简单。

认为你需要做的是逐个检查每个附件,弄清楚它是什么。对于普通的邮件附件,它可能是经过base64编码的,所以像下面这样的代码可能会有帮助:

#!/usr/bin/python
import poplib, email, mimetypes

# Do everything you've done in the first code block of your question
# ...
# ...

import base64
for part in oMsg.walk():
    # I've removed the '1' from the argument as I think you always get the
    # the first entry (in my test, it was the third iteration that did it).
    # However, I could be wrong...
    oAttach = part.get_payload()
    # Decode the base64 encoded attachment
    oContent = b64decode(oAttach)
    # then maybe...?
    oMsgAttach = email.message_from_string(oContent)

注意,你可能需要在每个情况下检查oAttach,确认它看起来像一条消息。当你得到了sMail变量后,把它打印出来。然后你可以在里面查找类似Content-Transfer-Encoding: base64的内容,这会给你一个关于附件编码方式的线索。

正如我所说,我没有使用过poplib、email或mimetypes模块,所以不确定这些是否能帮到你,但我觉得这可能会指引你找到正确的方向。

撰写回答