Django电子邮件应用换行问题 - 最大行长度(如何修改)?

9 投票
4 回答
2217 浏览
提问于 2025-04-16 16:47
# settings.py
EMAIL_BACKEND = 'django.core.mail.backends.filebased.EmailBackend'

# view.py
from django.core.mail import send_mail

def send_letter(request):
    the_text = 'this is a test of a really long line that has more words that could possibly fit in a single column of text.'
    send_mail('some_subject', the_text, 'me@test.com', ['me@test.com'])

上面的Django视图代码生成了一个文本文件,但里面有换行符:

this is a test of a really long line that has more words that could possibl=
y fit in a single column of text.
-------------------------------------------------------------------------------

有没有人知道怎么改才能让输出文件没有换行?Django里有没有什么设置可以控制这个?我用的是Django 1.2版本。

更新 - 先回顾一下我最开始的问题 :) 我在用 django-registration 应用,它会发送一封带有 账户激活链接 的邮件。这个链接是一个很长的URL,最后有一个随机的令牌(30多个字符),所以这条链接在令牌中间就断开了。

为了排除是Django的 filebased EmailBackend的问题,我换成了 smtp 后端,并在调试模式下运行了内置的Python smtpd服务器。结果邮件在控制台上显示时,还是断开的。

我相信 django-registration 是正常工作的,毕竟有很多人都在用它 :) 所以这肯定是我哪里做错了或者配置不对。我就是不知道问题出在哪里。

更新2 - 根据Django列表中的一篇帖子,问题其实是出在底层的 Python email.MIMEText对象,如果说得对,那问题就更复杂了。它并没有告诉我怎么解决这个问题。看文档时,我没有看到任何提到换行的内容。

更新3(叹气) - 我排除了是MIMEText对象的问题。我用一个纯Python程序和smtplib/MIMEText创建并发送了一封测试邮件,结果一切正常。它 使用了charset = "us-ascii",有人说这是唯一不会在MIMEText对象中换行的字符集。我不知道这是否正确,但我仔细查看了我的Django邮件输出,发现它的字符集是"utf-8"。

错误的字符集会是问题吗?如果是的话,我该怎么在Django中 更改 它呢?

这是Django邮件的完整输出流:

---------- MESSAGE FOLLOWS ----------
Content-Type: text/plain; charset="utf-8"
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable
Subject: some_subject
From: me@test.com
To: me@test.com
Date: Tue, 17 May 2011 19:58:16 -0000

this is a test of a really long line that has more words that could possibl=
y fit in a single column of text.
------------ END MESSAGE ------------

4 个回答

0

邮件的内容并不是“断开”的,实际上它是用一种叫做quoted-printable的编码方式表示的。简单来说,当内容超过76个字符时,就会插入=\n来换行。任何合格的邮件客户端都应该能够正确解码这个信息,并去掉这些换行。

如果你想要显示解码后的邮件内容,可以在调用get_payload方法时加上decode=True

body = email.get_payload(decode=True)

这样就会告诉邮件内容去解码这个quoted-printable编码。

如果你主要是想让Python控制台的调试服务器打印出解码后的信息,你可以用一些简单粗暴的方法,比如这个代码片段,而不是使用内置的DebuggingServer。更好的做法是把“data”字符串解析成一个Email对象,打印出你关心的头部信息,然后用decode=True打印出邮件的正文。

0

试着在你的 settings.py 文件里定义一下 EMAIL_BACKEND。虽然这可能不能解决你的问题,但这是定义它的正确地方,否则它可能不会被使用。

(因为我不确定这样做是否能解决你的问题,我本来想在你的帖子上评论一下,但显然我做不到。)

6

你可以尝试通过创建一个EmailMessage对象,并传入headers={'format': 'flowed'},来让你的邮件客户端不受78个字符的限制。像这样:

from django.core.mail import EmailMessage

def send_letter(request):
    the_text = 'this is a test of a really long line that has more words that could possibly fit in a single column of text.'
    email = EmailMessage(
        subject='some_subject', 
        body=the_text, 
        from_email='me@test.com', 
        to=['me@test.com'],
        headers={'format': 'flowed'})

    email.send()

如果这样还不行,可以试试用一个非调试模式的smtp设置,把文件发送到一个真正的邮件客户端,这样它会根据邮件头中定义的规则来显示邮件。

撰写回答