2010-08-10 30 views
2

这里是我迄今为止代码:如何以常规文本接收html电子邮件?

import email, imaplib 

user = 'some username' 
pwd = 'some password' 

m = imaplib.IMAP4_SSL("imap.gmail.com") 
m.login(user, pwd) 

m.select("[Gmail]/All Mail") 

resp, data = m.fetch(1, "(RFC822)") 

email_body = data[0][1] 

mail = email.message_from_string(email_body) 

print mail 

我目前收到的电子邮件与一群奇怪的格式。我想以纯文本字符串的形式收到电子邮件正文。

+1

只需用正则表达式解析HTML ......哦,等等,不要这样做。 – 2010-08-10 13:18:12

回答

5

(我刚刚用我的Gmail帐户试了一下。)问题不在于HTML邮件,而在于您的邮件是MIME多部分,而您正在打印完整字符串。这是因为电子邮件基本上是纯文本格式(如上所述);当人们想发送丰富的电子邮件内容时,他们想出了MIME,这是一种在不修改电子邮件标准的情况下做到这一点的方法。当您print mail时,您将打印完整的MIME消息,并进行编码,以便将其作为电子邮件发送。你想提取有效载荷。

但是 - 您已经完成了所有艰苦的工作!刚刚得到解析email.message.Message实例的有效载荷:

mail.get_payload()[ 0 ].get_payload() 

(注:我必须在我的Gmail收件箱中的第一条消息做两次,因为它被编码为MimeMultipart的,但只有一个叶因人而异。 )

+0

正是我所期待的。谢谢一堆 – Richard 2010-08-10 13:29:29

2

EMail是纯文本格式,它不知道格式。因此,如果您收到一封HTML邮件,则该格式已被“走私”到纯文本主体中,您有一个多部分邮件,其中第一部分是纯文本,第二部分是HTML格式版本。

因此,检查您是否有多部分邮件(see the docs)并相应地进行过滤。如果它不是多部分邮件,请使用类似Beautiful Soup的HTML库来获取文本。

0

我想收到电子邮件正文 ascii字符串。

这是极不可能的,你将不能够做到这一点:如果它是什么并不 ASCII?即使所有内容都是英文,它可能包含ascii范围之外的字符。 imaplib的文档没有涉及任何编码问题,所以我想数据以字节串的形式出现,我期望它们是utf-8编码。其他库可能会为您提供Unicode字符串,您可以使用您喜欢的任何编码进行编码(但utf-8是一个不错的选择)。

但是,我想你并不是真正的意思是“ascii”,而是你认为的“纯文本” - 电子邮件的文本,而不是html版本。它可能是一个多部分邮件,在这种情况下,您可以从您收到的字符串中提取“text/plain”部分。如果不是,并且邮件正文仅为html,则可以使用第三方库。有许多选项,在this SO thread中讨论。

+0

谢谢,你对纯文本是正确的。编辑原始问题 – Richard 2010-08-10 13:26:17

3

在Python 3.x中,您可以通过导入'imaplib'和'email'软件包以非常简单的方式完成它。虽然这是一个较旧的帖子,但也许我的回答可以帮助新来者在这篇文章。

status, data = self.imap.fetch(num, '(RFC822)') 
     email_msg = email.message_from_bytes(data[0][1]) #email.message_from_string(data[0][1]) 

     #If message is multi part we only want the text version of the body, this walks the message and gets the body. 

     if email_msg.is_multipart(): 
      for part in email_msg.walk():  
       if part.get_content_type() == "text/plain": 
        body = part.get_payload(decode=True) #to control automatic email-style MIME decoding (e.g., Base64, uuencode, quoted-printable) 
        body = body.decode() 

       elif part.get_content_type() == "text/html": 
        continue 

现在你可以打印体变量,它会以明文格式:)如果它不够好,你那么它会是不错的选择它作为公认的答案。

0

获取正确的html /文本并不那么容易和直接。由于电子邮件可以具有HTML作为附件甚至多个HTML。Python 3为您提供了一个简单的method来做到这一点

mail = email.message_from_string(email_body, policy=policy.default) 
mail.get_body().get_payload(decode=True)