在python中提取电子邮件正文

时间:2012-10-29 06:48:00

标签: python email smtp

当电子邮件发送到计算机时,邮件的DATA部分始终以字符序列<CRLF>.<CRLF>结束(请参阅RFC 2821related post)。在python中解码电子邮件消息时,有一个方便的功能来通过Message.get_payload()(包email)获取消息的有效负载。但是这个“有效载荷”仍然包含<CRLF>.<CRLF>序列,当用例如电子邮件查看电子邮件时,该序列被抑制。 Gmail中。

我的问题:python中是否有一个方便的函数来获取REAL消息,其中附加字符被删除?或者我是否需要自己做一些黑客攻击?

2 个答案:

答案 0 :(得分:1)

如何做到这一点(假设它不是多部分消息):

Message.get_payload().rsplit('\r\n', 2)[0]

在一个例子中:

>>> s = 'Hi,\r\n\r\nThis is my email.\r\n.\r\n'
>>> print s.rsplit('\r\n', 2)[0]
Hi,

This is my email.
>>>

如果只是你担心的<CRLF>,那么它就不会比这更清洁了。您可以将它包装在一个函数中以使其自我记录,但对我来说,这肯定比包括自定义库更好。

答案 1 :(得分:1)

邮件末尾的<CRLF>.<CRLF>序列是用于发送邮件的SMTP进程的工件。如果您收到另一种方法(POP,IMAP,阅读本地邮箱等),则此序列将不会出现。

由于只有当您的代码作为SMTP服务器运行时才会出现这种情况,email包不知道您是如何获取消息并将字符视为消息的一部分,而不是作为消息终止符。

您的SMTP服务器代码应该从邮件中删除最后三个字符(.<CRLF>),然后再将其传递给email.Mesasage类。

这将为SMTP服务器代码提供如下内容:

message = ""
while True:
    line = get_line()
    if line == ".\r\n":
        break
    message += line

email = Message.email(message)

在将邮件转换为Message.email之前,会删除终止字符。