使用python django下载电子邮件附件

使用python django下载电子邮件附件,python,django,email-attachments,Python,Django,Email Attachments,我正在尝试用python开发一个邮件客户端 我能够解析带有附件的电子邮件正文,并显示在django模板中 现在我需要在单击附件名称时下载附件 我所能找到的就是使用python将文件下载到特定文件夹的方法。 但是,当我在浏览器上单击文件名时,如何将其下载到系统的默认下载文件夹 下面是我尝试的代码示例 def download_attachment(request): if request.method == 'POST': filename=request.POST.get

我正在尝试用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() 

您无法从django访问系统默认下载文件夹的名称。这由用户在其浏览器设置中决定。您可以做的是,通过设置
内容处置
,告诉浏览器将文件视为附件,然后浏览器将打开正常的“另存为…”框,默认为下载文件夹

某些django代码使这种情况发生,如下所示:

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

另请参见。

下面的代码运行得非常好

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 

你的意思是用这个来改变我的最后一个if循环内容??那么我们怎么会只有内容处置的文件内容??我不想在我的服务器上创建一个文件副本,然后读取它并作为响应发送。啊,你只需要在响应对象中包含你想要发送的数据。您可以使用
response.write(data)
或在创建响应时传递数据,如
response=HttpResponse(data)