2017-12-06 4 views
0

Ich versuche, Anhänge von eingehenden E-Mails in einem FileField in Django zu speichern.Wie kann ich den Anhang von einer eingehenden E-Mail in Djangos FileField speichern?

Das Modell sieht wie folgt aus:

class Email(models.Model): 
    ... 
    attachment = models.FileField(upload_to='files/%Y/%m/%d', null=True, blank=True) 
    ... 

    def __unicode__(self): 
    return self.contents[:20] 

ich diese Funktion schrieb die Anlagen zurück.

def get_attachments(email_object): 
    attachments = [] 
    for part in email_object.walk(): 
     # content_type = part.get_content_type() 
     content_disposition = part.get("Content-Disposition") 
     if content_disposition and content_disposition.lower().startswith("attachment"): 
      attachments.append(part) 
    return attachments 

Jetzt habe ich eine Liste von Instanzen des E-Mail-Objekts, und ich bin nicht sicher, wie sie als Datei im Filefield zu speichern. attachment.get_content_type() gibt image/jpeg zurück. Aber wie gehe ich von hier zum Jäten, das im Dateibereich gespeichert werden kann?

Danke für alle Hilfe.

Antwort

0

Um eine E-Mail Anhang zu dem Verzeichnis zu speichern und den Datensatz im Modell speichern, können Sie folgendes tun müssen,

#firstly change your model design 
#an email can have 0 - n attachments 

class EmailAttachment(models.Model): 
    email = models.ForeignKey(Email) 
    document = models.FileField(upload_to='files/%Y/%m/%d') 

#if you want to save an attachment 
# assume message is multipart 
# 'msg' is email.message instance 
for part in msg.get_payload(): 
    if 'attachment' in part.get('Content-Disposition',''): 
     attachment = EmailAttachment() 
     #saving it in a <uuid>.msg file name 
     #use django ContentFile to manage files and BytesIO for stream 
     attachment.document.save(uuid.uuid4().hex + ".msg", 
      ContentFile(
       BytesIO(
        msg.get_payload(decode=True) 
       ).getvalue() 
      ) 
     ) 
Verwandte Themen