从邮件附件中提取 To: 头信息
我正在用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 个回答
没有一个代表性的邮件在我的收件箱里,我很难搞清楚这个问题(我从来没有用过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模块,所以不确定这些是否能帮到你,但我觉得这可能会指引你找到正确的方向。