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 <Android应用开发实战> 学习总结杂项
1.系统相册默认保存地址:android.os.Environment.getExternalStorageDirectory().getAbsolutePath() + "/DCIM/Ca ...
- POJ1474:Video Surveillance——题解
http://poj.org/problem?id=1474 题目大意:给按照顺时针序的多边形顶点,问其是否有内核. —————————————————————————————— (和上道题目一模一样 ...
- LeetCode中二叉树题目总结
本文仅为博主个人总结,水平有限,欢迎大神指出不妥处. 关于二叉树的相关概念可以参见二叉树的百度百科,或binary tree Wiki. 二叉树结点类的常见定义为: /* Definition for ...
- 专题训练之2-sat
推荐几篇博客:https://blog.csdn.net/JarjingX/article/details/8521690 研究总结2-sat问题 https://blog.csdn.net/wher ...
- 背景建模技术(六):帧处理(FrameProcessor)模块
前面几篇文章简单介绍了BgsLibrary的入口函数.视频分析和视频捕获模块,本文将简单介绍帧处理模块,即对每一帧进行处理的函数,也就是真正调用背景建模算法的接口处. 下面贴出源码供大家分析: #in ...
- ACE日志系统
引用于:http://blog.csdn.net/focusonace/article/details/3108873 http://peirenlei.iteye.com/blog/305036 介 ...
- AIM Tech Round (Div. 2) B
B. Making a String time limit per test 1 second memory limit per test 256 megabytes input standard i ...
- ListBox, ListView, GridView
ListView是ListBox的派生类,而GridView是ViewBase的派生类 ListView的View属性是ViewBase,所以GridView可以作为ListView的属性 如 < ...
- window10系统下使用python版本实现mysql查询
参考文档: 兔大侠整理的MySQL-Python(MySQLdb)封装类 Python安装模块出错(ImportError: No module named setuptools)解决方法 环境 (w ...
- Java设计模式の装饰者模式
目录 一.问题引入 二.设计原则 三.用装饰者模式解决问题 四.装饰者模式的特点 五.装饰者模式的定义 六.装饰者模式的实现 七.java.io包内的装饰者模式 一.问题引入 咖啡店的类设计: 一个饮 ...