В почтовом приложении Django ломаные линии - максимальная длина строки (и как ее изменить)? - PullRequest
6 голосов
/ 02 мая 2011
# 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.

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

В случае, если проблема заключалась в использовании Django на основе файла 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 ]

4 голосов
/ 09 июня 2011

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

1 голос
/ 01 мая 2012

Я видел, что это 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' на '' в этой строке письма / generator.py

print >> self._fp, Header(
v, maxlinelen=self._maxheaderlen,
header_name=h, continuation_ws='\t').encode()
0 голосов
/ 25 января 2012

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

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

body = email.get_payload(decode=True)

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

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

0 голосов
/ 09 мая 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...