当电子邮件发送到计算机时,邮件的DATA部分始终以字符序列<CRLF>.<CRLF>
结束(请参阅RFC 2821和related post)。在python中解码电子邮件消息时,有一个方便的功能来通过Message.get_payload()
(包email
)获取消息的有效负载。但是这个“有效载荷”仍然包含<CRLF>.<CRLF>
序列,当用例如电子邮件查看电子邮件时,该序列被抑制。 Gmail中。
我的问题:python中是否有一个方便的函数来获取REAL消息,其中附加字符被删除?或者我是否需要自己做一些黑客攻击?
答案 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
之前,会删除终止字符。