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 项目目录外创建一个名为 ...
随机推荐
- [Leetcode] single number 找单个数
Given an array of integers, every element appears twice except for one. Find that single one. Note: ...
- 【单调队列】【P1776】宝物筛选
传送门 Description 终于,破解了千年的难题.小FF找到了王室的宝物室,里面堆满了无数价值连城的宝物--这下小FF可发财了,嘎嘎.但是这里的宝物实在是太多了,小FF的采集车似乎装不下那么多宝 ...
- 【博弈论】【P1288】取数游戏II
传送门 Description 有一个取数的游戏.初始时,给出一个环,环上的每条边上都有一个非负整数.这些整数中至少有一个0.然后,将一枚硬币放在环上的一个节点上.两个玩家就是以这个放硬币的节点为起点 ...
- mysql 读写分离,主从同步 理论
mysql主从复制中:第一步:master记录二进制日志.在每个事务更新数据完成之前,master在二进制日志记录这些改变.MySQL将事务写入二进制日志,即使事务中的语句都是交叉执行的.在事件写入二 ...
- 使用Faster-Rcnn进行目标检测(实践篇)转载
原 文链接:http://blog.csdn.net/gavin__zhou/article/details/52052915 原理 上一篇文章,已经说过了,大家可以参考一下,Faster-Rcnn进 ...
- D-query SPOJ - DQUERY(莫队)统计不同数的数量
Given a sequence of n numbers a1, a2, ..., an and a number of d-queries. A d-query is a pair (i, j) ...
- 有向图的强联通分量 Tarjan算法模板
//白书 321页 #include<iostream> #include<cstdio> #include<cstring> #include<vector ...
- arm-linux-gcc等交叉编译工具的安装
1.软件安装 步骤1:打开虚拟机,在/usr/local/下创建/usr/local/arm文件夹(一般用户自定义程序放到这里) 步骤2:先将安装包从Windows中弄到linux中去.可以用共享文件 ...
- javascript实现购物车思路
/* 思路: 第一步:获取所要操作的节点对象 第二步:当页面加载完后,需要计算本地cookie存了多少[个]商品,把个数赋值给count 第三步:为每一个商品对应的添加购物车按钮绑定一个点击事件onc ...
- 第01篇 说一下Setting,我一直没有讲过
settings 调整 settings 中的设置是非常关键的,它们会改变 MyBatis 的运行时行为.下表描述了设置中各项的意图.默认值等. 设置参数 描述 有效值 默认值 cacheEn ...