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

您无法从 django 访问系统默认下载文件夹的名称。 这取决于用户在他/她的浏览器设置中决定。 你可以做的是通过设置Content-Disposition告诉浏览器将文件视为附件,然后它会打开正常的"另存为..."框,默认为下载文件夹。

实现这种情况的一些 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 

相关内容

  • 没有找到相关文章

最新更新