发送 text/plain 封电子邮件并防止 Outlook 折叠行

Send a text/plain email and prevent Outlook from collapsing lines

我从我的 Web 应用程序发送纯文本邮件(例如密码重置);我很确定我在 header 和文本中都使用了正确的 CRLF 行结尾。有些行可以超过 78 个字符,但 none 超过 998+2.

对于某些邮件,Outlook 邮件客户端会折叠页脚部分中的白色space(在 --  行之后):尽管存在 CRLF 换行符,但它们看起来像是变成了普通的 space 个字符,让我排了很长的一行。 (编辑,澄清:出现换行符,但不是在预期位置,而是,由window宽度给出。)

是否有方法告诉 Outlook 保留换行符,例如一些 header?当然,我更喜欢 RFC-conforming 解决方案,但如果它不损害其他客户,它可能没问题。

终于找到了this question and answer,我的解决办法是: 在每个换行符前加上一个制表符,Outlook 可能是 "optimized away",例如因为它后面没有另一个换行符。

如果不费吹灰之力就可以完成,当然生成一个同时包含text/plaintext/html的邮件会有所帮助;但如果仅仅因为这个原因而做,就显得有些矫枉过正了。

HTML-only 邮件也可以,但它们不如纯文本邮件可信(因为人们可能会被诱骗激活其他 URL 而不是 link 文本中的 URL) ,所以例如SpamAssassin 不喜欢它们。

这是一个 Python 函数,它在每个换行符之前插入一个制表符(但不在两个或更多的序列之前):

def harden_linebreaks(s):
    tmp = []
    prev = None
    for line in s.splitlines():
        tmp.append((prev, line))
        prev = line
    tmp.append((prev, None))
    res = []
    for tup in tmp:
        line, next = tup
        if (line and next
            and not line.endswith('\t')):
            line += '\t'
        res.append(line)
    return '\n'.join(res[1:])