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

0 投票
2 回答
848 浏览
提问于 2025-04-16 14:40

我想知道如何区分邮件正文中发送者自己插入的换行符和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',但这样并不可靠,也不是我想要的。有趣的是,我注意到在Gmail的网页上显示邮件时,第二类换行符并没有出现。Gmail似乎知道要去掉或不显示这些换行符。这是怎么做到的呢?我是不是遗漏了什么特殊的编码?

2 个回答

0

我不知道有多少邮件客户端能正确理解或生成这个内容,但RFC 3676中提到了一些内容:

在创建流式文本时,生成的程序会自动换行,也就是在需要的地方插入“软”换行符。软换行符是在自然换行的地方添加的,比如在单词之间。软换行符的表示方式是一个空格加上回车换行。

所以,如果上一行的结尾有一个空格,那么当前行应该被理解为是上一行的继续。我建议你查看一下整个RFC文档。

1

Gmail发送的邮件有两种格式,一种是MIME多部分格式,包括一种文本格式(text/plain)和一种HTML格式(text/html)。你抓取到的就是文本格式,而HTML格式则包含了像粗体、斜体、链接等花哨的格式,这也是Gmail展示给用户的内容。虽然HTML版本的每行也会在78个字符处换行(这是邮件标准的一部分——邮件中的文本行不能超过78个字符),但你想要的“真实”换行其实是通过HTML的<br>标签来实现的。如果你自己给自己发一封邮件,然后点击回复按钮旁边的小箭头,选择“显示原始邮件”,你就可以看到这些内容。

在文本格式(text/plain)中,你无法可靠地区分“假”的换行和“真”的换行(这点你肯定知道)。不过,你可以选择获取HTML格式,这样你就知道“真实”的换行是<br>标签,但这样你还得处理额外的HTML内容(并且首先要正确处理里面使用的“内容传输编码”)。

撰写回答