2016-03-01 2 views
1

Я пытаюсь создать почтовый клиент в питонаЗагрузка вложений электронной почты с помощью питона Джанго

Я могу разобрать тело электронной почты с приложением и дисплеем в моем шаблоне Django.

Теперь мне нужно загрузить вложение, когда я нажимаю на имя вложения.

Все, что я мог найти, - это способ загрузки файла в определенную папку с использованием python. Но как я мог загрузить его в папку по умолчанию загрузки системы при нажатии на имени файла в моем браузере

Ниже приведен пример кода я попытался

def download_attachment(request): 
    if request.method == 'POST': 
     filename=request.POST.get('filename','') 
     mid=request.POST.get('mid','') 
     mailserver = IMAP_connect("mail.example.com",username, password) 
     if mailserver: 
      mailserver.select('INBOX') 
     result, data = mailserver.uid('fetch', mid, "(RFC822)") 
     if result == 'OK': 
      mail = email.message_from_string(data[0][1]) 
      for part in mail.walk(): 
       if part.get_content_maintype() == 'multipart': 
        continue 
       if part.get('Content-Disposition') is None: 
        continue 
       fileName = part.get_filename() 
       if filename != fileName: 
        continue 
       detach_dir = '.' 
       if 'attachments' not in os.listdir(detach_dir): 
        os.mkdir('attachments') 
       if bool(fileName): 
        filePath = os.path.join(detach_dir, 'attachments', fileName) 
        if not os.path.isfile(filePath) : 
         print fileName 
         fp = open(filePath, 'wb') 
         fp.write(part.get_payload(decode=True)) 
         fp.close() 
    return HttpResponse() 

ответ

1

Вы не можете получить доступ от имени папка загрузки по умолчанию для системы из django. Это зависит от пользователя, который может решить в настройках браузера. То, что вы может do, - это сообщить браузеру об обработке файла в качестве вложения, установив Content-Disposition, а затем он откроет нормальный «Сохранить как ...», который по умолчанию будет загружен в папку.

Некоторые Джанго код, который делает это произошло бы выглядеть следующим образом:

response = HttpResponse() 
response['Content-Disposition'] = 'attachment; filename="%s"' % fileName 
return response 

Смотрите также this question.

+0

Вы имеете в виду, чтобы изменить свое последнее, если содержание цикла с этим ?? Тогда как же мы будем иметь содержимое файла только контент-диспозиции ?? Я не хочу создавать копию файла на моем сервере и читать его и отправлять как ответ – JithPS

+0

Да, вам просто нужно включить данные, которые вы хотите отправить в свой объект ответа. Вы можете использовать 'response.write (data)' или просто передавать данные при создании ответа, так как 'response = HttpResponse (data)'. –

0

Код ниже работал очень хорошо

def download_attachment(request): 
    if request.method == 'GET': 
     filename=request.GET.get('filename','') 
     mid=request.GET.get('mid','') 
     mailserver = IMAP_connect("mail.example.com",username, password) 
     if mailserver: 
      mailserver.select('INBOX') 
     result, data = mailserver.uid('fetch', mid, "(RFC822)") 
     if result == 'OK': 
      mail = email.message_from_string(data[0][1]) 
      for part in mail.walk(): 
       if part.get_content_maintype() == 'multipart': 
        continue 
       if part.get('Content-Disposition') is None: 
        continue 
       fileName = part.get_filename() 
       if filename != fileName: 
        continue 
       if bool(fileName): 
        response = HttpResponse(part.get_payload(decode=True)) 
        response['Content-Disposition'] = 'attachment; filename="%s"' % fileName 
        return response 
Смежные вопросы