Domanda

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

Il codice di vista Django sopra, si traduce in un file di testo che contiene una riga rotta:

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

Qualcuno sa come cambiarlo in modo che il file di output non abbia linee di linee di linee? C'è qualche impostazione in Django che controlla questo? Versione 1.2 di Django.

Aggiornamento - Per eseguire il backup di un livello e spiegare il mio problema originale :) Sto usando il Django-Registration app, che invia un'e -mail con unLink di attivazione dell'account. Questo collegamento è un URL lungo, con un token casuale alla fine (30+ caratteri) e, di conseguenza, la linea si sta rompendo nel mezzo del token.

Nel caso in cui il problema stesse usando i Django basato su file Emailbackend, sono passato al Smtp Backend e gestisce il server Python SMTPD incorporato in modalità debug. Questo ha scaricato la mia email alla console, dove era ancora rotta.

sono sicuro Django-Registration funziona, con miliardi di persone che lo usano :) Quindi deve essere qualcosa che ho fatto di sbagliato o configurato errata. Non ho solo idea di cosa.

Aggiornamento 2 - Secondo un post in un elenco di Django, è davvero il sottostante Python Email.mimeText oggetto, che, se corretto, spinge il problema solo un po 'di più. Non mi dice ancora come risolverlo. Guardando i documenti, non vedo nulla che menziona anche la linea di linea.

AGGIORNAMENTO 3 (Sigh) - Ho escluso che è un problema di oggetti MimeText. Ho usato un programma Python puro e SMTPLIB/MimeText per creare e inviare un'e -mail di test e ha funzionato bene. Esso anche ha usato un chatset = "US-ASCII", che qualcuno ha suggerito era l'unico chatset non Avvolgi il testo in oggetti MimeText. Non so se sia corretto o no, ma ho guardato più da vicino al mio output di Django e-mail e ha un chatset di "UTF-8".

Il Charset sbagliato potrebbe essere il problema? E se è così, come faccio modificare It in Django?

Ecco l'intero flusso di output dall'e -mail di 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 ------------
È stato utile?

Soluzione

Potresti essere in grado di far sì che il tuo client di posta elettronica non rompa il limite soft da 78 caratteri creando un oggetto di email e passando in intestazioni = {'formato': 'flusso'} così: così:

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

Se questo non funziona, prova a utilizzare una configurazione SMTP non DEBUG per inviare il file a un client di posta elettronica effettivo che rende l'e-mail secondo le regole definite nell'intestazione e-mail.

Altri suggerimenti

Ho visto questo è Python2.5 ed è fisso in Python2.7.

Il codice pertinente in email/generator.py ora ha un commento che dice

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

Puoi leggere il bug qui http://bugs.python.org/issue1974

Oppure puoi semplicemente cambiare il ' t' in '' in questa riga di email/generator.py

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

Prova a definire EMAIL_BACKEND nel tuo settings.py. Forse non risolve il tuo problema, ma è il posto giusto dove definirlo, altrimenti probabilmente non verrà utilizzato.

(Dal momento che non sono sicuro di risolvere il tuo problema qui, stavo cercando di fare un commento sul tuo, ma a quanto pare non posso.)

Le linee di posta elettronica non sono "rotte" di per sé: sono solo rappresentate nel citato-stabile codifica. Come tale, a 76 caratteri, =\n è inserito. Qualsiasi client di posta competente dovrebbe decodificare correttamente il messaggio e rimuovere l'interruzione.

Se vuoi rappresentare il corpo di un'e -mail decodificata, puoi usarlo passando decode=True al get_payload metodo:

body = email.get_payload(decode=True)

Questo dice al messaggio di decodificare la codifica stampabile citata.

Più precisamente, se la tua preoccupazione principale è ottenere il server di debug della console Python per stampare il messaggio decodificato, potresti fare qualcosa di veloce e sporco come Questo frammento piuttosto che usare il integrato DebuggingServer. Più correttamente, è possibile analizzare la stringa "dati" come oggetto e -mail, stampare le intestazioni a cui tieni, quindi stampare il corpo con decode=True.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top