2011-06-28 23 views
6

Necesito enviar un models.FileField como un archivo adjunto de correo electrónico usando Django. He visto fragmentos que muestran cómo hacer esto con los datos brutos request.FILES (que aún contienen el tipo de contenido), pero no han podido encontrar nada que muestre cómo hacerlo una vez que ya ha guardado el archivo en un models.FileField. El tipo de contenido parece ser inaccesible desde el models.FileField.¿Cómo enviar por correo electrónico un archivo Django FileField como un archivo adjunto?

¿Puede alguien darme un ejemplo de cómo esto funcionaría? Estoy empezando a pensar que podría tener que almacenar el tipo de contenido en el modelo cuando guardo el archivo.

Gracias!

+0

¿Podría proporcionarnos la solución que encontró como respuesta? Me gustaría ver el fragmento también. – Doppelganger

Respuesta

0

Simplemente no proporcionaría un tipo de contenido y dejaría que el cliente de correo electrónico del destinatario lo resolviera. A menos que sea algo inusual, no debería ser un problema.

RFC2616 estados:

Si y sólo si el tipo de medio no es dada por un campo Content-Type, el destinatario pueden tratar de adivinar el tipo los medios de comunicación a través de la inspección de su contenido y/o la (s) extensión (es) de nombre del URI utilizado para identificar el recurso .

pero ... Si desea especificar que luego almacenar el tipo de contenido en la carga es una muy buena idea. Cabe señalar que los propios documentos de Django dicen a verify the data from users

Si usted está en un OS * UNIX se podía tratar de adivinar/inspeccionarlo:

import subprocess 
subprocess.check_output(['file', '-b', '--mime', filename]) 

(desde How to find the mime type of a file in python?)

+0

Gracias! Voy a dar una oportunidad e informar de nuevo! –

13

Colocación a modelos.FileField a un mensaje de correo electrónico es bueno y simple en Django:

from django.core.mail import EmailMultiAlternatives 
kwargs = dict(
    to=to, 
    from_email=from_addr, 
    subject=subject, 
    body=text_content, 
    alternatives=((html_content, 'text/html'),) 
) 
message = EmailMultiAlternatives(**kwargs) 
message.attach_file(model_instance.filefield.path) 
message.send() 
3

Otro enfoque :

from django.core.mail.message import EmailMessage 

msg = EmailMessage(subject=my_subject, body=my_email_body, 
     from_email=settings.DEFAULT_FROM_EMAIL, to=[to_addressed]) 
msg.attach_file(self.my_filefield.file) # self.my_filefield.path for Django 1.7+ 
msg.send(fail_silently=not(settings.DEBUG)) 
+0

Esto funcionó para mí, gracias. – Prateek

+2

Tuve que usar 'msg.attach_file (self.my_filefield.path)' con Django 1.7.1 – sspross

Cuestiones relacionadas