2014-10-24 1 views
7

Ich versuche, unsere Anwendung von Python Mail zu Mailgun zu wechseln, habe aber Probleme mit E-Mails, die Anhänge haben. Speziell PDFs, die von der Anwendung generiert werden (nicht im Dateisystem gespeichert).Anfügen generierte PDF in Mailgun Nachricht Django/Python

Haben Sie keine Probleme beim Senden von E-Mails ohne Anhänge.

Derzeit erzeugen wir die PDF als solche:

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

Und dann bringen und sie als solche Mail:

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

Funktioniert prima ... wie können wir konvertieren zu einem Mailgun Anruf?

Ich habe darunter verschiedene Dinge ausprobiert, es einfach als Datei vorbei wie (erfolglos):

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

Die oben funktioniert ohne Anhang. Daten enthalten zu, von, o: Tags ... etc.

Jede Hilfe wäre willkommen. Vielen Dank!

EDIT

ich war in der Lage, es zu bekommen richtig durch die Änderung meiner PDF-Code und bekommen die requests.post strukturiert zu arbeiten:

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

Antwort

2

Ich war in der Lage, es zu erhalten, indem die Änderung meines PDF-Code und bekam die requests.post richtig strukturiert zu arbeiten:

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

der docs Nach ihr das Argument Dateien entweder sollte ein Wörterbuch oder eine Liste von Tupeln. Es muss nach einem Namen von einigen Arten suchen.

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

ja, war die Frage, wie es zu erhalten an, wenn es nicht ist Datei aus dem Dateisystem zu öffnen. Ich habe es herausgefunden und meine Frage aktualisiert. – Trik