Python 如何在邮件正文中区分发件人生成的回车和自动换行生成的回车?

Python 如何在邮件正文中区分发件人生成的回车和自动换行生成的回车?,python,email,gmail,Python,Email,Gmail,如何在电子邮件正文中区分发件人生成的回车和自动换行生成的回车?我正在使用Python imaplib访问Gmail并下载邮件正文,如下所示: user='whoever@gmail.com' pwd='password' m = imaplib.IMAP4_SSL("imap.gmail.com") m.login(user,pwd) m.select("INBOX") resp, items = m.search(None, "ALL") items = items[0].split() me

如何在电子邮件正文中区分发件人生成的回车和自动换行生成的回车?我正在使用Python imaplib访问Gmail并下载邮件正文,如下所示:

user='whoever@gmail.com'
pwd='password'
m = imaplib.IMAP4_SSL("imap.gmail.com")
m.login(user,pwd)
m.select("INBOX")
resp, items = m.search(None, "ALL")
items = items[0].split()
messages = []
for emailid in items:
    resp, data = m.fetch(emailid, "(RFC822)")
    email_body = data[0][1]
    mail = email.message_from_string(email_body)
    for part in mail.walk():
        if part.get_content_type() == 'text/plain':
            body = part.get_payload(decode=1)
            messages.append(body)

我关注的是从另一个Gmail用户那里收到的消息。消息正文文本中有许多回车符('\r\n')。这些信息分为两类:1)由电子邮件发件人插入的信息,返回“真”信息;2)由Gmail word包装创建的信息,返回约78个字符,“假”信息。我只想删除第二类回车。我相信我可以找到一个编程近似值,在每78个字符周围的窗口中搜索“\r\n”,但这不是防弹的,也不是我想要的。有趣的是,我注意到当消息显示在web浏览器的Gmail中时,第二类回车没有返回。Gmail不知何故知道如何删除/不显示这些内容。怎么用?有什么特殊的编码我不知道吗?

Gmail以MIME多部分格式发送消息,包括文本/纯文本版本(您正在获取的)和文本/html版本。后一个版本包含了诸如粗体、斜体、链接等奇特的格式,也是Gmail显示的格式。虽然文本/html版本也有78个字符的换行符(电子邮件标准的一部分——基础文本的换行符不得超过78个字符),但您要查找的“真实”换行符作为html

标记嵌入其中。如果您向自己发送一条消息,然后使用回复按钮旁边的小向下箭头,单击“显示原件”,您可以自己看到这一点


在消息的文本/纯文本版本中,您无法区分“假”和“真”换行符,至少不可靠(您显然知道)。但是,您可以改为拉取文本/html版本,知道“真正”的换行符是

标记,但是您必须处理额外的html(以及首先正确处理其中使用的“内容传输编码”)。

我不知道有多少电子邮件客户端正确地解释或生成它,但包括以下内容:

创建流式文本时,生成代理将换行,即, 根据需要插入“软”换行符。软换行符添加在 自然包装点,如单词之间。一个软线中断是必要的 SP-CRLF序列


因此,如果前一行末尾有空格,则当前行应解释为前一行的延续。我建议查看整个RFC。

谢谢。问题是,行末尾的空格被替换为“\r\n”,例如:“它比我们要找的要小一点,所以我们将在搬进来后不久处理主站点添加。”。我一直忽略了text/html,这显然是我想要的。当您提到正确处理内容传输编码时,您是指除了在get_payload()中使用decode=True之外的任何东西吗?我不知道,我从来没有在Python中使用电子邮件做过任何事情,所以我不能这么说。不过,试试看,然后把它给你的任何东西都扔掉——如果你看到一长行带有HTML中断标记的文本,那么你就得到了它(或者偶尔在HTML中断标记以前的位置将长行中断——我不知道该方法会做多少“解码”)。好的,是的,解码起到了作用,它打印出HTML流。现在开始解析HTML的乐趣。;)