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 项目目录外创建一个名为 ...
随机推荐
- BZOJ3195:[JXOI2012]奇怪的道路——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=3195 Description 小宇从历史书上了解到一个古老的文明.这个文明在各个方面高度发达,交通方 ...
- bzoj1257: [CQOI2007]余数之和sum(数论)
非常经典的题目... 要求 则有 实际上 最多只有2*sqrt(k)种取值,非常好证明 因为>=sqrt(k)的数除k下取整得到的数一定<=sqrt(k),而k除以<=sqrt(k) ...
- 自动清理N天前的二进制日志
这里以自动清理5天前的二进制日志为例(做了同步或依赖于二进制日志备份的请慎用): 以root身份登录数据库,执行以下命令: ; 首次设置expire_logs_days参数后需要执行flush log ...
- selenium测试-open chrome
通过selenium来打开浏览器测试之前,需要确认本地已安装相应的webdriver,本例以chrome为例. 1. 查看本地chrome版本,以此确认需要安装的webdriver版本 查看chrom ...
- [转载]系统管理:update-alternatives
http://blog.csdn.net/dbigbear/article/details/4398961 好吧,其实博主也是转载的. update-alternatives --display | ...
- 手脱ACProtect V2.0(无Stolen Code)
1.载入PEID ACProtect V2.0 -> risco 2.载入OD > 00A04000 push ACP_Feed.0040A000 ; //入口点 0B104000 pus ...
- java RSA加密解密实现(含分段加密)
该工具类中用到了BASE64,需要借助第三方类库:javabase64-1.3.1.jar 下载地址:http://download.csdn.net/detail/centralperk/50255 ...
- WPF:为什么使用ContentPresenter.ContentSource而不是Content属性?
因为ContentPresenter.ContentSource比Content属性加一个TemplateBinding看起来更方便?不仅仅是这些,实际上如果用ContentSource的话,Cont ...
- php防止用户输入进行跨站攻击的方式
1.对用户输入的内容进行转义 //1.过滤内容中html标记 $userinput=strip_tags($userinput); //2.转换成HTML实体 $userinput=htmlentit ...
- SNS应用好友动态Feed模块设计
转载自:http://libo93122.blog.163.com/blog/static/122189382012112145728902/ 备注:找不到原作者了. 现在大部分SNS网站都有一个功能 ...