17:django Email
我自己在看这一节之前自己先实现了一下,django-admin.py startproject testEmail新建一个新项目,urls.py把urlpatterns的第一行取消注释,改成url(r'^$', 'testEmail.views.home', name='home'),在urls.py所在文件夹里面新建一个view.py文件,把以下内容拷贝进去
#*_*coding:utf-8*_*
from django.shortcuts import HttpResponse
from django.core.mail import send_mail
def home(request):
send_mail('subject', 'message', '2bitt@sina.com', ['568445851@qq.com','2092296286@qq.com'],fail_silently=False)
return HttpResponse("ok")
在配置文件里面添加一下内容,如果报编码语言有错,可以在首行加上这句#*_*coding:utf-8*_*
#邮件配置
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.sina.com' #SMTP地址
EMAIL_PORT = 587 #SMTP端口
EMAIL_HOST_USER = '***' #自己的邮箱名
EMAIL_HOST_PASSWORD = '****' #自己的邮箱密码
EMAIL_SUBJECT_PREFIX = '2BiTT' #为邮件Subject-line前缀,默认是'[django]'
EMAIL_USE_TLS = True #与SMTP服务器通信时,是否启动TLS链接(安全链接)。默认是false
然后运行python manage.py runserver,打开链接http://127.0.0.1:8000,看到ok即表明邮件发送成功了

下面开始正式介绍django Email
通过stmplib模块,python使得发送邮件变得很简单,django也提供了几个轻量级的封装,这些封装使得发邮件变得更快,更容易的在开发阶段测试发邮件功能并且为那些不能使用stmp的提供了平台支持。
配置
发送邮件的配置是关键的,主要有一下几项:
- EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend',默认是这个,可以不配
- EMAIL_HOST = 'smtp.sina.com' #SMTP地址
- EMAIL_PORT = 587 #SMTP端口
- EMAIL_HOST_USER = '2bitt@sina.com' #自己的邮箱名
- EMAIL_HOST_PASSWORD = '2bitt1314' #自己的邮箱密码
- EMAIL_SUBJECT_PREFIX = '2BiTT' #为邮件Subject-line前缀,默认是'[django]'
- EMAIL_USE_TLS = True #与SMTP服务器通信时,是否启动TLS链接(安全链接)。默认是false
使用
send_mail()
发送邮件最简单的函数是send_mail,函数位于django.core.mail模块下面,函数原型如下:
send_mail(subject, message, from_email, recipient_list, fail_silently=False, auth_user=None,auth_password=None, connection=None),其实每个参数的意思也是很容易懂得
- subject: 一个字符串,主题
- message: 邮件内容,也是一个字符串
- from_email: 发送邮箱,一个字符串类型的字符串,要求和EMAIL_HOST_USER一致
- recipient_list: 一个列表,元素是接收邮箱字符串,每一个接收邮箱用一个字符串表示
- fail_silently: 是否安静的失败,如果是,发送失败不抛出异常,否则抛出一个smtplib.SMTPException
- auth_user: 认证发送邮箱用户名,如果不提供,将使用EMAIL_HOST_USER 的值
- auth_password: 邮箱密码,如果不提供,使用EMAIL_HOST_PASSWORD 的值
- connection: 发送邮件用的后端,如果不提供,将使用 Email backends的值
send_mass_mail()
send_mass_mail(datatuple, fail_silently=False, auth_user=None, auth_password=None,connection=None)
send_mass_mail()提供了一个把发送内容封装成元组然后再封装在一个元组里面的参数datatuple,这有利于批量发送编辑好的邮件,datatuple每一个元素都是以下的格式
(subject, message, from_email, recipient_list)
send_mass_mail的其他参数和send_mail的一样
message1 = ('Subject here', 'Here is the message', 'from@example.com', ['first@example.com', 'other@example.com'])
message2 = ('Another Subject', 'Here is another message', 'from@example.com', ['second@test.com'])
send_mass_mail((message1, message2), fail_silently=False)
mail_admins()
- mail_admins(subject, message, fail_silently=False, connection=None, html_message=None)提供了一个给管理员发送邮件的快捷方式,启用这个功能的话,先要在你的设置文件里面配置好ADMINS和SERVER_EMAIL,前者是收件人,后者是发件人
- 如果你提供了html_message的话,邮件内容会被替换成html_message的内容
mail_managers()
- mail_managers(subject, message, fail_silently=False, connection=None,html_message=None)和mail_admins类似
防止头部注入
头部注入是一个可以让攻击者插入额外的头部从而控制发件人和收件人的安全漏洞,django通过禁止在头部中出现换行符的方式预防头部注入,只要邮件主题,发送方和接收列表有任何的一项包含换行符,django都会抛出django.core.mail.BadHeaderError的异常,然后拒接发送邮件,下面是一个例子:
from django.core.mail import send_mail, BadHeaderError def send_email(request):
subject = request.POST.get('subject', '')
message = request.POST.get('message', '')
from_email = request.POST.get('from_email', '')
if subject and message and from_email:
try:
send_mail(subject, message, from_email, ['admin@example.com'])
except BadHeaderError:
return HttpResponse('Invalid header found.')
return HttpResponseRedirect('/contact/thanks/')
else:
# In reality we'd use a form class
# to get proper validation errors.
return HttpResponse('Make sure all fields are entered and valid.')
测试邮件发送
当系统在开发的时候,你并不想真的发送邮件到指定的邮箱,那么我们可以使用其他的一些方法来测试我们的邮件发送功能,这将说道邮件后端的选择问题了,请继续看下去
邮件后端
SMTP后端
默认的邮件后端,这是真是将邮件发送到指定邮箱的后端
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
Console后端
console后端把邮件写入到stdoutEMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
测试结果如下图:
文件后端
把邮件写到文件里面,需要提供一个EMAIL_FILE_PATH参数,可以在配置文件里面直接指明,或者用get_connection()函数里面传入file_path关键字参数,结果见下图:
EMAIL_BACKEND = 'django.core.mail.backends.filebased.EmailBackend'
EMAIL_FILE_PATH = '/tmp/app-messages' # change this to a proper location
内存中的后端
发送的邮件存在内存中。。。。。
EMAIL_BACKEND = 'django.core.mail.backends.locmem.EmailBackend'
假后端
如其名,假的
EMAIL_BACKEND = 'django.core.mail.backends.dummy.EmailBackend'
17:django Email的更多相关文章
- Django 2.0 学习(17):Django 用户认证(auth模块)
Django 用户认证(auth模块) 一.认证登陆 在进行用户登陆验证的时候,如果是自己写代码,就必须要先查询数据库,看用户输入的用户名是否存在于数据库中:如果用户存在于数据库中,然后再验证用户输入 ...
- Python之路【第十九章】:Django 数据库对象关系映射
Django ORM基本配置 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去 ...
- Python之路【第十七篇】:Django【进阶篇 】
Python之路[第十七篇]:Django[进阶篇 ] Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接 ...
- Python之路【第十六篇】:Django【基础篇】
Python之路[第十六篇]:Django[基础篇] Python的WEB框架有Django.Tornado.Flask 等多种,Django相较与其他WEB框架其优势为:大而全,框架本身集成了O ...
- Python之路【第十七篇】:Django之【进阶篇】
Python之路[第十七篇]:Django[进阶篇 ] Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接 ...
- Python之路【第十七篇】:Django【进阶篇】
Python之路[第十七篇]:Django[进阶篇 ] Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接 ...
- 转载:Django之form表单
转载: 一.使用form类创建一个表单 先定义好一个RegForm类: forms.py from django import forms # 导入forms类 class NameForm(form ...
- 转载:Django之Form组件
Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 小试牛刀 1.创建Form类 +? 1 2 3 ...
- 笔记15:Django提升篇
django提升 (1)打包应用程序:可重用性 打包 Python 程序需要工具:setuptools .打包时候建议使用django-appname 1 在你的 Django 项目目录外创建一个名为 ...
随机推荐
- Android 使用LocationManger进行定位
在Android应用中,往往有获取当前地理位置的需求,比如微信获取附近的人需要获取用户当前的位置,不多说,直接上例子. public Location getLocation() { Location ...
- Linux实验三
主要参考课本第二章所学习内容 (信息的表示和处理) 所有重点内容: 信息存储 整数表示/运算 浮点数 一 十六进制表示 0~9 A~F 0000~1111 注:(主要参考课本P22) 字 字长: ...
- angularJS 条件查询 品优购条件查询品牌(条件查询和列表展示公用方法解决思路 及 post请求混合参数提交方式)
Brand.html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> &l ...
- Mybatis批量更新详解
转:http://www.cnblogs.com/winkey4986/p/3915151.html Mybatis批量更新 批量操作就不进行赘述了.减少服务器与数据库之间的交互.网上有很多关于批量插 ...
- bzoj2428 [HAOI2006]均分数据 模拟退火
[HAOI2006]均分数据 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 3434 Solved: 1091[Submit][Status][Dis ...
- 02.树的序列化与反序列化(C++)
1.二叉树的序列化 输入的一棵树: //二叉树的先序遍历-序列化 #include <iostream> #include <string> #include <sstr ...
- X210(s5pv210)中断系统
1.SoC对中断的实现机制:异常向量表 (1)异常向量表是CPU中某些特定地址的特定定义.当中断发生的时候,中断要想办法通知CPU去处理中断,怎么做到?这就要靠异常向量表.(2)在CPU设计时,就事先 ...
- 代码Review发现问题
FrmMain.cs中存在问题 1. int i=0 设定为了全局常量且未在类顶部,出现问题时不好查找 i 属于常用临时变量,设定全局变量容易引起混乱 2.定义的全局变量但仅在一处方法中使用,定义全局 ...
- 51Nod 1003 阶乘后面0的数量 | 思维
题意:n的阶乘后面0的个数,如果直接算出阶乘再数0的数量一定会超时的. 因为10=2*5,所以求出5贡献的次数就行. #include "bits/stdc++.h" using ...
- 2015/9/1 Python基础(6):列表
列表和字符串类型很相似,是同样的序列式数据类型.但是字符串只能由字符组成,列表可以保留任意数目的Python对象的灵活的容器.Python的列表比C的数组要灵活,数组里面只能是一种类型,列表可以有多种 ...
