在django中按请求发送邮件

时间:2013-11-24 07:13:46

标签: python django

这真的让我伤心。我已经处理了好几天了。

当用户从我的django网络应用程序下载文件时,我想通过发送邮件通知上传者他的文件已被下载。问题是,如果我要下载low file size (489kb),它会发送mail once to the uploader。但是,如果我要下载file size of 3mb or above,它会发送more than one mail to the uploader

我只是希望它在每次下载时向上传者发送一封邮件通知。

的观点:

@login_required
def document_view(request,emov_id):
    fileload = Emov.objects.get(id=emov_id)
    filename = fileload.mov_file.name.split('/')[-1]
    filesize=fileload.mov_file.size
    response = HttpResponse(fileload.mov_file, content_type='') 
    response['Content-Disposition'] = 'attachment; filename=%s' % filename
    response['Content-Length'] = filesize    
    send_mail('Your file has just been downloaded',loader.get_template('download.txt').render(Context({'fileload':fileload})),'test@example.com',[fileload.email,])
    return response

download.txt

'Your file {{ fileload.name}} have been downloaded!'

如何根据下载请求发送邮件?

2 个答案:

答案 0 :(得分:1)

我建议采用不同的方法......

当有人下载​​文件时,将事件记录到数据库中的表格 写会话ID,文件名,用户名 确保session_id + file_name + user_name为唯一键
这样,您可以获得更多可以在以后帮助您的信息。

稍后(作为crontab批处理或保存监听器)发送电子邮件 您甚至可以发送每日/每周报告等等......

答案 1 :(得分:1)

我认为您只需遵循以下最佳做法即可解决此问题:“不要使用Django提供文件”。

而是在响应中使用X-Sendfile HTTP标头,并配置您的Web服务器以捕获它并提供文件。如果您使用的是Apache,请参阅this

然后,按如下方式创建响应:

response = HttpResponse()
response['X-Sendfile'] = unicode(filename).encode('utf-8')
response['Content-Type'] = 'application/octet-stream'
response['Content-Disposition'] = 'attachment; filename="%s"' % filename
response['Content-length'] = filesize  # Optional
return response