2011-05-01 27 views
6
# 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, '[email protected]', ['[email protected]']) 

El código de la vista por encima de Django, los resultados en un archivo de texto que contiene una línea quebrada:Django aplicación de correo electrónico líneas discontinuas - longitud de línea máxima (y cómo cambiarla)?

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

Alguien sabe cómo cambiarlo por lo que el archivo de salida no tiene saltos de línea? ¿Hay alguna configuración en Django que controle esto? Versión 1.2 de Django.

Actualización - una copia de seguridad un nivel y explicar mi problema original :) Soy usando la aplicación django-registro, que envía un correo electrónico con una cuenta de enlace de activación. Este enlace es una URL larga, con un token aleatorio al final (más de 30 caracteres), y como resultado, la línea se está rompiendo en el medio del token.

En caso de que el problema estaba usando Django del filebased EmailBackend, me cambié a la SMTP backend y corriendo el servidor smtpd incorporado en Python, en el modo de depuración. Esto arrojó mi correo electrónico a la consola, donde todavía estaba roto.

Estoy seguro de que django-registration está funcionando, con miles de millones de personas usándolo :) Así que debe ser algo que he hecho mal o mal configurado. No tengo idea de qué.

Actualización 2: de acuerdo con una publicación en una lista de Django, es realmente el Python email.MIMEText object subyacente, que, de ser correcto, solo hace retroceder el problema un poco más. Todavía no me dice cómo arreglarlo. Al mirar los documentos, no veo nada que mencione el ajuste de líneas.

Actualización 3 (suspiro) - He descartado que sea un problema de objeto MIMEText. Usé un programa Python puro y el smtplib/MIMEText para crear y enviar un correo electrónico de prueba, y funcionó bien. Es también usó un juego de caracteres = "us-ascii", que alguien sugirió era el único conjunto de caracteres a no ajustar texto en objetos MIMEText. No sé si eso es correcto o no, pero miré más de cerca mi salida de correo electrónico de Django, y tiene un juego de caracteres "utf-8".

¿Podría ser el juego de caracteres incorrecto el problema? Y si es así, ¿cómo puedo cambiar en Django?

Aquí está todo el flujo de salida desde el correo electrónico de Django:

---------- MESSAGE FOLLOWS ---------- 
Content-Type: text/plain; charset="utf-8" 
MIME-Version: 1.0 
Content-Transfer-Encoding: quoted-printable 
Subject: some_subject 
From: [email protected] 
To: [email protected] 
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 ------------ 
+0

Nota - acaba de actualizar a Django 1.3, el problema sigue ahí. (También usando Python 2.6) –

+0

Cuando pruebo con smtp mi correo electrónico viene con una url intacta. con el archivo basado está roto. –

+0

algo que probar: http://almaer.com/blog/avoiding-broken-links-in-email rodee su url con '<' and '>' (creo que es una cosa del cliente de correo electrónico) –

Respuesta

4

Usted puede ser capaz de obtener su cliente de correo electrónico que no se romper el límite flexible 78 caracteres mediante la creación de un objeto EmailMessage y pasando en las cabeceras = { 'formato': 'fluyó'} al igual que:

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='[email protected]', 
     to=['[email protected]'], 
     headers={'format': 'flowed'}) 

    email.send() 

Si esto no funciona, trate de usar un SMTP no depuración configuración para enviar el archivo a un cliente de correo electrónico real que representa el correo electrónico según las reglas definidas en el encabezado del correo electrónico.

+0

Intenté usar 'headers', sin efecto. No estoy seguro de lo que quiere decir con la configuración smtp sin depuración: apagué la depuración en Django, sin cambios. –

+0

Ah, me acabo de dar cuenta de que quería decir back-end basado en smtp versus en archivo. Bueno, estoy ejecutando Windows XP y no tengo un servidor de correo electrónico * real *, pero sí ejecuté el servidor de depuración que está integrado en smtplib de Python - 'python -m smtpd -n -c DebuggingServer localhost: 1025'. Desde los documentos, solo imprime el resultado en la consola, así que creo que no cambia ningún formato. En cualquier caso, no afectó el problema. –

+0

Finalmente, configuré un objeto Python smtp que podía iniciar sesión en mi ISP, para enviar correos electrónicos, y funcionó correctamente. Todavía estoy tratando de obtener 'django-registration' para enviar correos electrónicos a mi ISP, pero hasta ahora, parece que esa es la respuesta, solo un problema con el uso de un servidor de correo electrónico local y simplista. –

0

tratar de definir EMAIL_BACKEND en su settings.py. Tal vez no resuelva su problema, pero es el lugar correcto para definirlo, de lo contrario, es probable que no se use.

(ya que no estoy seguro de estar la solución de su problema aquí, yo estaba tratando de hacer un comentario sobre tu, pero al parecer no puedo.)

+0

Ah, lo puse en settings.py, simplemente comprimí la publicación. :) Lo arreglaré. Y sí, se necesitan 50 repeticiones para dejar comentarios ... –

0

Las líneas de correo electrónico no están "rotas" per se: solo están representadas en la codificación quoted-printable. Como tal, con 76 caracteres, se inserta =\n. Cualquier cliente de correo competente debe decodificar el mensaje correctamente y eliminar el corte.

Si se desea representar el cuerpo de un correo electrónico decodificado, puede utilizar esto pasando a la decode=True el método get_payload:

body = email.get_payload(decode=True) 

Esto le indica que el mensaje para decodificar la codificación citado imprimible.

Más al punto, si su principal preocupación es conseguir que el servidor de depuración de la consola de python imprima el mensaje decodificado, podría hacer algo rápido y sucio como this snippet en lugar de usar el DebuggingServer incorporado. Más correctamente, podría analizar la cadena de "datos" como un objeto de correo electrónico, imprimir los encabezados que le interesan y luego imprimir el cuerpo con decode=True.

+0

Gracias, pero no me preocupaba realmente el funcionamiento del servidor de correo electrónico de depuración de python, solo hacer que los enlaces de mensajes funcionen correctamente en un servidor de correo * real *. Supuse erróneamente que el problema estaba en lo que * Django * era generando, no cómo lo estaba interpretando el servidor de depuración. –

1

He visto que esto es python2.5 y está arreglado en python2.7.

El código correspondiente en el correo electrónico/generator.py tiene ahora un comentario diciendo

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

Usted puede leer sobre el error aquí http://bugs.python.org/issue1974

o simplemente puede cambiar el '\ t' a '' en esta línea de correo electrónico/generator.py

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