【问题标题】:Extracting email body in python在python中提取电子邮件正文
【发布时间】:2012-10-29 21:07:29
【问题描述】:

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

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

【问题讨论】:

  • 让我引用您在邮件中链接到的帖子的答案:“正如您在查找 SMTP 协议定义时所看到的那样,邮件传输的 DATA 部分以.."
  • @Joseph:我知道这个定义。但这不是我的问题。

标签: python email smtp


【解决方案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>,那么没有比这更干净的了。您可以将其包装在一个函数中以使其具有自文档化功能,但对我而言,这肯定比包含自定义库要好。

【讨论】:

  • 这让我想知道为什么它首先不包含在 python 库中 - 与 python 库中通常如何完成事情相矛盾(清晰、精确、有用且简短)。但是邮件包对我来说似乎有点尴尬。
  • 好吧,有效负载不一定是纯文本。例如,如果Message.get_content_type() 返回'text/plain',那么是的,您可以只获取数据。但是,当它是多部分消息时,它可能是您正在处理的附件(例如,电子表格文档)。在这种情况下,您需要解码该消息部分,并将确切的有效负载存储到磁盘。 get_payload 函数只返回消息的一部分的数据,在它定义的编码中。根据标准,您的纯文本只定义了 <CRLF>.</CRLF>
【解决方案2】:

邮件末尾的<CRLF>.<CRLF> 序列是用于发送邮件的SMTP 进程的工件。如果您通过其他方法(POP、IMAP、读取本地邮箱等)接收消息,则不会出现此序列。

因为这只会在您的代码作为 SMTP 服务器运行时出现,所以email 包不知道您是如何获得消息的,并将字符视为消息的一部分,而不是消息终止符。

您的 SMTP 服务器代码应该在将邮件传递给 email.Mesasage 类之前从邮件中去除最后三个字符 (.<CRLF>)。

这将使 SMTP 服务器代码如下所示:

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

email = Message.email(message)

这会在将消息转换为 Message.email 之前去除终止字符。

【讨论】:

    猜你喜欢
    • 2016-04-12
    • 2019-04-12
    • 1970-01-01
    • 2016-01-11
    • 1970-01-01
    • 2019-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多