В почтовом приложении 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
,