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

Я пытаюсь разработать почтовый клиент на python.

Я могу разобрать тело электронной почты с вложением и отобразить в своем шаблоне 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() 

person JithPS    schedule 01.03.2016    source источник


Ответы (2)


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

Некоторый код django, который делает это, будет выглядеть так:

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

См. также этот вопрос.

person Dan Russell    schedule 01.03.2016
comment
Вы имеете в виду изменить мое последнее содержимое цикла if с помощью этого?? Тогда почему у нас будет содержимое файла только с расположением содержимого?? Я не хочу создавать копию файла на своем сервере, читать ее и отправлять в качестве ответа - person JithPS; 02.03.2016
comment
Да, вам просто нужно включить данные, которые вы хотите отправить, в свой объект ответа. Вы можете использовать response.write(data) или просто передавать данные при создании ответа, например response = HttpResponse(data). - person Dan Russell; 02.03.2016

Приведенный ниже код работал очень хорошо

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 
person JithPS    schedule 02.03.2016