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 项目目录外创建一个名为 ...
随机推荐
- 【Winform】.cs文件命名空间排序及注释批量处理工具
公司里每个程序员在命名空间的排序和注释上都有很多的不同. 杂乱的命名空间: using System; using System.Collections.Generic; using Autodesk ...
- C++中static用法
本文为个人学习笔记,参考<C++ Primer(中文第五版)>和<王道程序员求职宝典> 本文分为两个部分:不考虑类.类中static的作用 一.不考虑类,static的作用 1 ...
- BZOJ1269 [AHOI2006]文本编辑器editor 【82行splay】
1269: [AHOI2006]文本编辑器editor Time Limit: 10 Sec Memory Limit: 162 MB Submit: 4633 Solved: 1782 [Sub ...
- 洛谷 P1505 [国家集训队]旅游 解题报告
P1505 [国家集训队]旅游 题目描述 \(\tt{Ray}\) 乐忠于旅游,这次他来到了\(T\)城.\(T\)城是一个水上城市,一共有 \(N\) 个景点,有些景点之间会用一座桥连接.为了方便游 ...
- nodejs创建多层目录
1. fs.mkdir不能一次创建多层目录,必须先创建上层目录,再创建下层目录 //同步 fs.mkdirSync("./tmp/"); fs.mkdirSync("./ ...
- async的基本用法
1. async函数的基本形式 //函数声明 async function foo() {} //函数表达式 const foo = async function () {}; //对象的方法 let ...
- getElementsByClassName的原生实现
DOM 提供了一个名为 getElementById() 的方法,这个方法将返回一个对象,这个对象就是参数 id 所对应的元素节点.另外,getElementByTagName() 方法会返回一个对象 ...
- java 在centos6.5+eclipse环境下调用opencv实现sift算法
java 在centos6.5+eclipse环境下调用opencv实现sift算法,代码如下: import org.opencv.core.Core; import org.opencv.core ...
- squid总结
squid可以完成的工作: 代理服务器 反向代理服务器 防火墙 缓存功能 透明代理 squid和varnish的对比,以及squid的优缺点说明: 缓存到硬盘,容易遇到I/O瓶颈 V3.2以下不支持多 ...
- bzoj 1131 [POI2008]Sta 树形dp 转移根模板题
[POI2008]Sta Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1889 Solved: 729[Submit][Status][Discu ...
