2014-10-24 9 views
7

Sto provando a passare la nostra applicazione da posta Python a Mailgun ma ho problemi con le email che hanno allegati. In particolare PDF che vengono generati dall'applicazione (non memorizzati nel file system).Allegare PDF generato nel messaggio Mailgun Django/Python

Non avere problemi nell'invio di e-mail senza allegati.

Attualmente generiamo il PDF come ad esempio:

pdf = StringIO() 
draw_pdf(pdf, params) 
pdf.seek(0) 
attachment = MIMEApplication(pdf.read()) 
attachment.add_header("Content-Disposition", "attachment", filename=filename) 
pdf.close() 

e quindi collegare e posta come tale:

from django.core.mail import EmailMultiAlternatives 
msg = EmailMultiAlternatives(subject, text_content, from_email, to_email) 

if html_content: 
    msg.attach_alternative(html_content, "text/html") 

if attachment: 
    msg.attach(attachment) 

msg.send() 

Opere grande ... come possiamo convertire in una chiamata Mailgun?

Ho provato varie cose, tra cui solo di passaggio come file come è (senza successo):

requests.post(mailgun_url, auth=("api", mailgun_api), data=data, files=attachment) 

È possibile che questo funziona benissimo senza l'allegato. i dati contengono, da, o: tags ... ecc.

Qualsiasi aiuto sarebbe apprezzato. Grazie!

EDIT

ero in grado di farlo funzionare, cambiando il mio codice PDF e ottenere il requests.post strutturato correttamente:

filename = "pdf_attachment.pdf" 
pdf = StringIO() 
draw_pdf(pdf, params) 
pdf.seek(0) 

attachment = ("attachment", (filename, pdf.read())) 

r = requests.post(mailgun_url, auth=("api", mailgun_api), data=data, files=[attachment]) 

risposta

2

sono stato in grado di farlo funzionare, cambiando il mio codice PDF e ottenere il requests.post strutturata correttamente:

filename = "pdf_attachment.pdf" 
pdf = StringIO() 
draw_pdf(pdf, params) 
pdf.seek(0) 

attachment = ("attachment", (filename, pdf.read())) 

r = requests.post(mailgun_url, auth=("api", mailgun_api), data=data, files=[attachment] 
1

Secondo il docs che l'argomento file dovrebbe essere un dizionario o una lista di tuple. Deve cercare un nome di qualche tipo.

requests.post(
    ..., 
    files=[("attachment", open("files/test.jpg"))], 
) 
+0

sì, la questione era come farlo di allegare quando non è un file dal filesystem da aprire. L'ho capito e ho aggiornato la mia domanda. – Trik

Problemi correlati