Django -E -Mail -App zerstörte Zeilen - Maximale Zeilenlänge (und wie kann ich sie ändern)?

StackOverflow https://stackoverflow.com/questions/5851939

Frage

# 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'])

Der obige Django -Ansichtscode führt zu einer Textdatei, die eine kaputte Zeile enthält:

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

Weiß jemand, wie man es ändert, damit die Ausgabedatei keine Zeilenausbrüche hat? Gibt es eine Einstellung in Django, die dies steuert? Version 1.2 von Django.

Update - um ein Level zu sichern und mein ursprüngliches Problem zu erklären :) Ich benutze die Django-Registrierung App, die eine E -Mail mit einem sendetKontoaktivierungsverbindung. Dieser Link ist eine lange URL mit einem zufälligen Token am Ende (über 30 Zeichen), und infolgedessen bricht die Linie in der Mitte des Tokens.

Falls das Problem darin bestand, die Django zu verwenden fileBased E -Mail -Backend, ich wechselte auf die SMTP Backend und leitete den integrierten Python SMTPD-Server im Debugging-Modus. Dies ließ meine E -Mail an die Konsole ab, wo sie noch kaputt war.

Ich bin sicher Django-Registrierung Funktioniert, mit Zillionen von Menschen, die es benutzen :) Also muss es etwas sein, das ich falsch gemacht habe oder falsch konfiguriert wurde. Ich habe einfach keine Ahnung was.

Update 2 - Laut einem Beitrag in einer Django -Liste ist es wirklich die zugrunde liegende Python -E -Mail.Mimetext -Objekt, was, wenn es korrekt ist, das Problem nur etwas mehr zurückdrückt. Es sagt mir immer noch nicht, wie ich es reparieren soll. Wenn ich mir die Dokumente ansehe, sehe ich nichts, was selbst Zeilenverschiebung erwähnt.

Update 3 (Seufzer) - Ich habe ausgeschlossen, dass es ein Mimetext -Objektproblem ist. Ich habe ein reines Python -Programm und das SMTPLIB/MIMETEXT verwendet, um eine Test -E -Mail zu erstellen und zu senden, und es hat gut funktioniert. Es Auch verwendete eine charset = "US-ascii", die jemand vorgeschlagen hatte nicht Wickeln Sie Text in Mimetext -Objekte ein. Ich weiß nicht, ob das richtig ist oder nicht, aber ich habe meine Django-E-Mail-Ausgabe genauer angesehen, und es hat einen Zeichen von "UTF-8".

Könnte das falsche Zeichen das Problem sein? Und wenn ja, wie mache ich das? Rückgeld es in Django?

Hier ist der gesamte Ausgangsstrom aus Djangos E -Mail:

---------- 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 ------------
War es hilfreich?

Lösung

Möglicherweise können Sie Ihren E -Mail -Client dazu bringen, das Soft -Grenzwert von 78 Charakter nicht durch das Erstellen eines E -Mail -Message -Objekts zu brechen und in Headers = {'Format' zu übergeben: 'Flosped'} Like SO:

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()

Wenn dies nicht funktioniert, verwenden Sie ein nicht-Debug-SMTP-Setup, um die Datei an einen tatsächlichen E-Mail-Client zu senden, der die E-Mail gemäß den im E-Mail-Header definierten Regeln rendert.

Andere Tipps

Ich habe gesehen, dass dies Python2.5 ist und es in Python2.7 fixiert ist.

Der relevante Code in E -Mail/Generator.py hat jetzt einen Kommentar mit der Aussage

# 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.

Hier können Sie über den Fehler lesen http://bugs.python.org/issue1974

Oder Sie können einfach das ' t' in dieser Zeile von E -Mail/Generator.py ändern

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

Versuchen Sie zu definieren EMAIL_BACKEND in deiner settings.py. Vielleicht löst es Ihr Problem nicht, ist aber der richtige Ort, an dem Sie es definieren können, sonst wird es wahrscheinlich nicht verwendet.

(Da ich nicht sicher bin, ob ich Ihr Problem hier löste, habe ich versucht, einen Kommentar zu Ihrem abzugeben, aber anscheinend kann ich nicht.)

Die E -Mail -Zeilen sind per se nicht "kaputt" - sie sind nur in der dargestellt zitiert Codierung. Als solche bei 76 Zeichen,, =\n wird eingefügt. Jeder kompetente Mail -Client sollte die Nachricht ordnungsgemäß dekodieren und die Pause entfernen.

Wenn Sie den Körper einer E -Mail -dekodierten Repräsentation darstellen möchten, können Sie dies durch Bestehen verwenden decode=True zum der get_payload Methode:

body = email.get_payload(decode=True)

Dies sagt die Nachricht, dass sie die zitierte Codierung entschlüsseln soll.

Wenn Ihr Hauptanliegen das Debugging -Server von Python Console zum Drucken der Nachricht dekodiert ist, können Sie etwas schnelles und Dreckiges tun, wenn Ihr Hauptanliegen besteht, wie die Python -Konsolen -Debugging -Server zum Ausdruck gebracht wird. Dieser Snippet anstatt das eingebaute zu verwenden DebuggingServer. Genauer gesagt können Sie die Zeichenfolge "Daten" als E -Mail -Objekt analysieren, die Header, die Ihnen wichtig sind decode=True.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top