Aplicación de correo electrónico de Django Líneas rotas - Longitud de línea máxima (¿y cómo cambiarlo)?

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

Pregunta

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

El código de vista Django anterior da como resultado un archivo de texto que contiene una línea rota:

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 para que el archivo de salida no tenga borde de línea? ¿Hay alguna configuración en Django que controle esto? Versión 1.2 de Django.

Actualización: para hacer una copia de seguridad de un nivel y explicar mi problema original :) Estoy usando el registro de django aplicación, que envía un correo electrónico con unenlace de activación de la cuenta. 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 estuviera usando el django basado en archivos Correo electrónico Backend, cambié al smtp Backend y ejecutó el servidor Python SMTPD incorporado, en modo de depuración. Esto arrojó mi correo electrónico a la consola, donde todavía estaba roto.

Estoy seguro registro de django está funcionando, con millones de personas que lo usan :) Así que debe ser algo que he hecho mal o mal configiado. Simplemente no tengo idea de qué.

ACTUALIZACIÓN 2 - Según una publicación en una lista de Django, es realmente el subyacente Python correo electrónico. Objeto Mimetexto, que, si es correcto, solo empuja el problema un poco más. Todavía no me dice cómo solucionarlo. Mirando los documentos, no veo nada que incluso mencione la envoltura de línea.

ACTUALIZACIÓN 3 (suspiro): descarté que es un problema de objetos de mimetexto. Utilicé un programa Pure Python y el SMTPLIB/MIMETEXT para crear y enviar un correo electrónico de prueba, y funcionó bien. Eso además usó un charset = "us-ascii", que alguien sugirió que era el único charset para no Envuelva el texto en objetos de mimeteexto. No sé si eso es correcto o no, pero miré más de cerca la salida de mi correo electrónico de Django, y tiene un charol de "UTF-8".

¿Podría ser el charset incorrecto ser el problema? Y si es así, como yo cambio ¿En Django?

Aquí está todo el flujo de salida del 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: 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 ------------
¿Fue útil?

Solución

Es posible que pueda hacer que su cliente de correo electrónico no se rompa en el límite suave de 78 caracteres creando un objeto de correo electrónico y pase en encabezados = {'formato': 'fluido'} así:

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

Si esto no funciona, intente usar una configuración SMTP sin DEBUG para enviar el archivo a un cliente de correo electrónico real que rinde el correo electrónico de acuerdo con las reglas definidas en el encabezado de correo electrónico.

Otros consejos

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

El código relevante en correo electrónico/generador.py ahora tiene un comentario que 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.

Puedes 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/generador.py

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

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

(Dado que no estoy seguro de resolver tu problema aquí, estaba tratando de hacer un comentario sobre tu, pero aparentemente no puedo).

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

Si desea representar el cuerpo de un correo electrónico decodificado, puede usarlo pasando decode=True al get_payload método:

body = email.get_payload(decode=True)

Esto le dice al mensaje que decodifique la codificación impresa citada.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top