2

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

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

4

2 回答 2

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>你担心的,那么它不会比这更干净。您可以将它包装在一个函数中以使其自我记录,但对我来说,这肯定比包含自定义库要好。

于 2012-10-29T08:59:54.767 回答
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.

于 2012-10-29T13:07:29.933 回答