从解析的电子邮件对象中获取邮件正文(Jython)

4 投票
2 回答
3654 浏览
提问于 2025-04-11 20:09

我有一个对象。

    fp = open(self.currentEmailPath, "rb")
    p = email.Parser.Parser()
    self._currentEmailParsedInstance= p.parse(fp)
    fp.close()

self.currentEmailParsedInstance,我想从这个对象中获取一封邮件的正文,只要文本,不要HTML格式的内容……

我该怎么做呢?


像这样吗?

        newmsg=self._currentEmailParsedInstance.get_payload()
        body=newmsg[0].get_content....?

然后从正文中去掉HTML标签。

那具体是什么方法可以返回实际的文本呢……也许我误解了你的意思。

        msg=self._currentEmailParsedInstance.get_payload()
        print type(msg)

输出是一个 'list' 类型。


这封邮件

返回路径:
收到:来自 xx.xx.net (示例) 通过 mxx3.xx.net (xxx)
id 485EF65F08EDX5E12 发往 xxx@xx.com;2008年10月23日 06:07:51 +0200
收到:来自 xxxxx2 (ccc) 通过 example.net (ccc) (已认证为 xxxx.xxx@example.com)
id 48798D4001146189 发往 example.example@example-example.com;2008年10月23日 06:07:51 +0200
发件人:“示例”
收件人:
主题:FW: 示例
日期:2008年10月23日 12:07:45 +0800
组织:示例
消息ID:<001601c934c4$xxxx30$a9ff460a@xxx>
MIME版本:1.0
内容类型:multipart/mixed;
边界="----=_NextPart_000_0017_01C93507.F6F64E30"
邮件客户端:Microsoft Office Outlook 11
X-MimeOLE:由 Microsoft MimeOLE V6.00.2900.3138 生成
线程索引:Ack0wLaumqgZo1oXSBuIpUCEg/wfOAABAFEA

这是一封多部分的MIME格式邮件。

------=_NextPart_000_0017_01C93507.F6F64E30
内容类型:multipart/alternative;
边界="----=_NextPart_001_0018_01C93507.F6F64E30"

------=_NextPart_001_0018_01C93507.F6F64E30
内容类型:text/plain;
字符集="us-ascii"
内容传输编码:7bit

发件人:example.example[mailto:example@example.com]
发送时间:2008年10月23日 星期四 11:37 AM
收件人:xxxx@example.com
主题:S/I for example(B/L
编号:4357-0120-810.044)

请查收附件 example.doc),

谢谢。

祝好,

xxx xxx

------=_NextPart_001_0018_01C93507.F6F64E30
内容类型:text/html;
字符集="us-ascii"
内容传输编码:quoted-printable

xmlns:o=3D"urn:schemas-microsoft-com:office:office"=
xmlns:w=3D"urn:schemas-microsoft-com:office:word"=
xmlns:st1=3D"urn:schemas-microsoft-com:office:smarttags"=
xmlns=3D"http://www.w3.org/TR/REC-html40">

HTML内容直到

------=_NextPart_001_0018_01C93507.F6F64E30--

------=_NextPart_000_0017_01C93507.F6F64E30
内容类型:application/msword;
名称="xxxx.doc"
内容传输编码:base64
内容处置:附件;
文件名="xxxx.doc"

0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAPgADAP7/CQAGAAAAAAAAAAAAAAABAAAAYAAAAAAAAAAA
EAAAYgAAAAEAAAD+////AAAAAF8AAAD/////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////s
pcEAI2AJBAAA+FK/AAAAAAAAEAAAAAAABgAAnEIAAA4AYmpiaqEVoRUAAAAAAAAAAAAAAAAAAAAA
AAAECBYAMlAAAMN/AADDfwAAQQ4AAAAAAAAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//w8AAAAA
AAAAAAD//w8AAAAAAAAAAAD//w8AAAAAAAAAAAAAAAAAAAAAAKQAAAAAAEYEAAAAAAAARgQAAEYE
AAAAAAAARgQAAAAAAABGBAAAAAAAAEYEAAAAAAAARgQAABQAAAAAAAAAAAAAAFoEAAAAAAAA4hsA
AAAAAADiGwAAAAAAAOIbAAA4AAAAGhwAAHwAAACWHAAARAAAAFoEAAAAAAAABzcAAEgBAADmHAAA
FgAAAPwcAAAAAAAA/BwAAAAAAAD8HAAAAAAAAPwcAAAAAAAA/BwAAAAAAAD8HAAAAAAAAPwcAAAA
AAAAMjYAAAIAAAA0NgAAAAAAADQ2AAAAAAAANDYAAAAAAAA0NgAAAAAAADQ2AAAAAAAANDYAACQA
AABPOAAAaAIAALc6AACOAAAAWDYAAGkAAAAAAAAAAAAAAAAAAAAAAAAARgQAAAAAAABHLAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAD8HAAAAAAAAPwcAAAAAAAARywAAAAAAABHLAAAAAAAAFg2AAAAAAAA

------=_NextPart_000_0017_01C93507.F6F64E30--


我只想得到:

发件人:xxxx.xxxx [mailto:xxxx@example.com]
发送时间:2008年10月23日 星期四 11:37 AM
收件人:xxxx@example.com
主题:S/I for xxxxx (B/L
编号:4357-0120-810.044)

请查收附件 xxxx.doc),

谢谢。

祝好,

xxx xxx


不确定邮件是否格式错误!
似乎如果你得到的是一个HTML页面,你必须这样做:

        parts=self._currentEmailParsedInstance.get_payload()
        print parts[0].get_content_type()
        ..._multipart/alternative_
        textParts=parts[0].get_payload()
        print textParts[0].get_content_type()
        ..._text/plain_
        body=textParts[0].get_payload()
        print body
        ...get the text without a problem!!

非常感谢你,Vinko。

所以这有点像处理XML,具有递归的特性。

2 个回答

0

最后得到了这个

        parser = email.parser.Parser()
        self._email = parser.parse(open('/home/vinko/jlm.txt','r'))
        parts=self._email.get_payload()
        check=parts[0].get_content_type()
        if check == "text/plain":
            return parts[0].get_payload()
        elif check == "multipart/alternative":
            part=parts[0].get_payload()
            if part[0].get_content_type() == "text/plain":
                return part[0].get_payload()
            else:
                return "cannot obtain the body of the email"
        else:
            return "cannot obtain the body of the email"
4

这段代码可以让你获取消息的内容。

self.currentEmailParsedInstance.get_payload()

至于只获取文本部分,你需要自己去掉HTML标签,比如可以使用BeautifulSoup这个工具。

想了解更多关于Parser返回的Message类的信息,可以查看这个链接。如果你想获取同时包含HTML和纯文本版本的消息的文本部分,可以在get_payload()中指定一个索引,这样就能获取你想要的部分。

我尝试用不同的MIME格式的邮件,因为你粘贴的内容看起来格式不太对,希望是在你编辑的时候出现了问题。

>>> parser = email.parser.Parser()
>>> message = parser.parse(open('/home/vinko/jlm.txt','r'))
>>> message.is_multipart()
True
>>> parts = message.get_payload()
>>> len(parts)
2
>>> parts[0].get_content_type()
'text/plain'
>>> parts[1].get_content_type()
'message/rfc822'
>>> parts[0].get_payload()
'Message Text'

parts会包含多部分消息的所有部分,你可以查看它们的内容类型,像这样只获取text/plain类型的部分。

祝你好运。

撰写回答