В почтовом приложении Django ломаные линии - максимальная длина строки (и как ее изменить)?

# 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, которые контролируют это? Версия 1.2 Джанго.

Обновление - для резервного копирования уровня и объяснения моей первоначальной проблемы:) Я использую приложение django-registration, которое отправляет электронное письмо со ссылкой для активации учетной записи. Эта ссылка представляет собой длинный URL со случайным токеном в конце (более 30 символов), и в результате строка разрывается в середине токена.

В случае, если проблема заключалась в использовании EmailBackend на основе файлов Django, я переключился на сервер smtp и запустил встроенный сервер Python smtpd в режиме отладки. Это сбрасывало мою электронную почту в консоль, где она все еще была сломана.

Я уверен, что django-регистрация работает, ее используют миллионы людей:) Так что, должно быть, я что-то сделал неправильно или неправильно настроил. Я просто понятия не имею, что.

Обновление 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 ответа

Решение

Возможно, вы сможете заставить свой почтовый клиент не нарушать мягкое ограничение в 78 символов, создав объект EmailMessage и передав заголовки ={'format': 'flowed'} Примерно так:

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 без отладки, чтобы отправить файл реальному почтовому клиенту, который обрабатывает электронную почту в соответствии с правилами, определенными в заголовке электронной почты.

Я видел, что это python2.5, и это исправлено в python2.7.

В соответствующем коде в email / generator.py теперь есть комментарий

# Header's got lots of smarts, so use it.  Note that this is
# fundamentally broken though because we lose idempotency when
# the header string is continued with tabs.  It will now be
# continued with spaces.  This was reversedly broken before we
# fixed bug 1974.  Either way, we lose.

Вы можете прочитать об ошибке здесь http://bugs.python.org/issue1974

Или вы можете просто изменить '\t' на '' в этой строке email / generator.py

print >> self._fp, Header(
v, maxlinelen=self._maxheaderlen,
header_name=h, continuation_ws='\t').encode()

Попробуй определить EMAIL_BACKEND в вашем settings.py, Возможно, это не решит вашу проблему, но это правильное место, где ее можно определить, иначе она, скорее всего, не будет использоваться.

(Поскольку я не уверен, что решаю вашу проблему здесь, я пытался прокомментировать вашу, но, очевидно, я не могу.)

Строки электронной почты не являются "разорванными" сами по себе - они просто представлены в кодировке для печати в кавычках. Таким образом, на 76 символов,=\nвставлен. Любой компетентный почтовый клиент должен правильно декодировать сообщение и удалить разрыв.

Если вы хотите представить тело письма в декодированном виде, вы можете использовать его, передавdecode=Trueкget_payload метод:

body = email.get_payload(decode=True)

Это говорит сообщению декодировать кодировку для печати в кавычках.

Более того, если ваша основная задача - заставить сервер отладки консоли Python печатать декодированное сообщение, вы можете сделать что-то быстрое и грязное, например, этот фрагмент, а не использовать встроенный DebuggingServer, Точнее, вы можете проанализировать строку "data" как объект электронной почты, распечатать заголовки, которые вам нужны, а затем распечатать тело decode=True,

Другие вопросы по тегам