如何区分发件人生成的回车与电子邮件正文中的自动换行自动生成的回车?

时间:2011-03-29 16:12:24

标签: 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()
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自动换行以~78个字符创建的那些,“假”返回。我想只删除第二类回车。我确信我可以想出一个程序化的近似,在每个第78个字符周围的窗口搜索'\ r \ n',但这不是防弹的,也不是我想要的。有趣的是,我注意到当消息在Web浏览器中显示在Gmail中时,第二类回车没有返回。 Gmail以某种方式知道删除/不显示这些具体。怎么样?我缺少一些特殊的编码吗?

2 个答案:

答案 0 :(得分:1)

Gmail会以MIME多部分格式发送邮件,包括文本/纯文本版本(您正在抓取的内容)和text / html版本。后一版本包含花哨的格式,如粗体,斜体,链接等,是Gmail显示的内容。虽然text / html版本也以78个字符(电子邮件标准的一部分 - 基础文本的行不得超过78个字符)进行换行,但您正在寻找的“真实”换行符是作为HTML <br>标记嵌入其中。如果您向自己发送消息,则可以自己查看,然后使用“回复”按钮旁边的小向下箭头,单击“显示原始文件”。

您无法区分邮件的text / plain版本中的“假”和“真实”换行符,至少不可靠(如您所知)。然而,你可以拉取text / html版本,然后知道“真正的”换行符是<br>标签,然而你必须处理额外的HTML(以及首先正确处理其中使用的“Content-Transfer-Encoding”。

答案 1 :(得分:0)

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

  

创建流动文本时,生成代理程序包装,即      根据需要插入“软”换行符。添加了软换行符      自然包裹点,例如词之间。一个软线休息是      SP CRLF序列。

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