django结合ajax实现文件上传
并实现文件作为邮件附件发送
先提供代码 后续有时间进行讲解
html
<form>
<div class="fields">
<div class="field half">
<label for="name">**姓名</label>
<input type="text" id="name" />
</div>
<div class="field half">
<label for="email">Email/Tel/QQ</label>
<input type="text" id="email" />
</div>
<div class="field">
<label for="message">**内容</label>
<textarea id="message" rows="4"></textarea>
</div>
<div class="field half">
<label for="file">email附件上传</label>
<input type="file" id="email_file" />
</div>
</div>
<ul class="actions">
<li><button onclick="send_email()" value="发送邮件" class="primary">发送邮件</li>
<li><input type="reset" value="重置" /></li>
</ul>
</form>
javascript
var isSendEmail = false
//发送邮件
function send_email() {
if (!isSendEmail) {
isSendEmail = true;
if ($("#name").val() != "") {
if ($("#message").val() != "") {
var myFormData = new FormData();
// 2.朝对象中添加普通的键值
myFormData.append('name', $("#name").val());
myFormData.append('email', $("#email").val());
myFormData.append('message', $("#message").val());
myFormData.append('email_file', $('#email_file')[0].files[0]);
$.ajax({
url: "https://xxx.xxx.xxx/xxx/xxx/",
type: "post",
contentType: false, // 不用任何编码 因为formdata对象自带编码 django能够识别该对象
processData: false, // 告诉浏览器不要处理我的数据 直接发就行
data: myFormData,
success: function (data) {
console.log(data);
if (data.res_code == 200) {
alert(data.msg);
isSendEmail = false;
window.location.href = 'xxx://xxx.xxx';
} else {
alert(data.msg);
isSendEmail = false;
window.location.href = window.location.href;
}
},
error: function () {
alert("未知状态 如有需要请重新发送 Unknown status. Please resend if necessary");
}
})
} else {
alert("请输入留言内容Please input content!");
}
} else {
alert("请输入联系名Please input name!");
}
} else {
alert("正在发送 请稍后再试 Sending. Please try again later!");
}
}
django后端
引入包
import os
import smtplib
import time
from email.mime.multipart import MIMEMultipart
from api import settings
# email 用于构建邮件内容
from email.encoders import encode_base64
from email.header import Header
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from django.http.response import JsonResponse
发送邮件函数
def send(to_addr, Mail, subject, file_name=None):
# 发信方的信息:发信邮箱,QQ 邮箱授权码
from_addr = 'xxx@xxx.com' #发信邮箱
password = 'xxxxxxxxxxxxxxxxxxx'#通过邮箱服务器获取
# 收信方邮箱
# 发信服务器
smtp_server = 'smtp.qq.com'
msg = MIMEMultipart()
# 邮箱正文内容,第一个参数为内容,第二个参数为格式(plain 为纯文本),第三个参数为编码
Mail = MIMEText(Mail, 'plain', 'utf-8')
# 邮件头信息
msg['From'] = Header(from_addr)
msg['To'] = Header(to_addr)
msg['Subject'] = Header(subject)
msg['date'] = time.strftime("%a,%d %b %Y %H:%M:%S %z")
msg.attach(Mail)
if file_name is not None:
# 构造MIMEBase对象做为文件附件内容并附加到根容器
contype = 'application/octet-stream'
maintype, subtype = contype.split('/', 1)
# 读入文件内容并格式化
data = open(file_name, 'rb')
file_msg = MIMEBase(maintype, subtype)
file_msg.set_payload(data.read())
data.close()
encode_base64(file_msg)
# 设置附件头
basename = os.path.basename(file_name)
file_msg.add_header('Content-Disposition',
'attachment', filename=basename)
msg.attach(file_msg)
# 开启发信服务,这里使用的是加密传输
try:
server = smtplib.SMTP_SSL(smtp_server)
server.connect(smtp_server, 465)
# 登录发信邮箱
server.login(from_addr, password)
# 发送邮件
server.sendmail(from_addr, to_addr, msg.as_string())
# 关闭服务器
server.quit()
return True
except:
return False
保存缓存文件函数
# 保存缓存文件
def save_file(file):
if file is not None:
file_name = os.path.join(settings.BASE_DIR, 'upload_files', file.name)
with open(file_name, 'wb')as f:
# chunks()每次读取数据默认 我64k
for chunk in file.chunks():
f.write(chunk)
f.close()
return file_name
else:
return None
删除缓存文件函数
# 删除缓存文件
def remove_file(file_name):
if file_name is not None:
if os.path.exists(file_name): # 如果文件存在
os.remove(file_name)
else:
print('no such file:%s' % file_name) # 则返回文件不存在
接口函数
# 接口函数
def blog_contact(request):
params = request.POST
name = params.get('name')
email = params.get('email')
message = params.get('message')
Mail = '姓名:' + name + '\n联系方式:' + email + '\n内容:' + message + '\n\n\nsend by ' + name
to_addr = 'xxxxxx@xxxx.com'
subject = 'xxxxx'
email_file = request.FILES.get('email_file')
file_name = save_file(email_file)
result = send(to_addr, Mail, subject, file_name=file_name)
if result:
remove_file(file_name=file_name)
if email_file is not None:
info = {"res_code": 200, 'msg': '包含附件发送成功'}
else:
info = {"res_code": 200, 'msg': '无附件发送成功'}
else:
if email_file is not None:
info = {"res_code": 500, 'msg': '包含附件发送失败'}
else:
info = {"res_code": 500, 'msg': '无附件发送失败'}
return JsonResponse(info)