python测试开发django-28.发送邮件send_mail
前言
django发邮件的功能很简单,只需简单的配置即可,发邮件的代码里面已经封装好了,调用send_mail()函数就可以了
实现多个邮件发送可以用send_mass_mail()函数
send_mail()函数
先导入send_mail函数from django.core.mail import send_mail,进入源码里面看看具体函数对应的参数
subject,message,from_email 和recipient_list 这四个参数是必须的。
- subject: 字符串,邮件标题。
- message: 字符串,邮件内容。
- from_email: 字符串,发件邮箱。
- recipient_list: list列表,列表中每个成员都是一个邮箱地址,而且每个收件人都会在 “收件人/To:” 栏看到出现在recipient_list 中的其他收件人。
- fail_silently: (可选)布尔值。为False 时,send_mail 会抛出smtplib.SMTPException 异常。smtplib 文档列出了所有可能的异常。这些异常都是 SMTPException 的子类。
- auth_user:(可选)SMTP服务器的认证用户名。没提供该参数的情况下,Django会使用EMAIL_HOST_USER 配置项的设置。
- auth_password:(可选)SMTP服务器的认证密码,没提供该参数的情况下,Django会使用EMAIL_HOST_PASSWORD 配置项的设置。
- connection: (可选)发送邮件的后端。没提供该参数的情况下,Django会使用默认后端的实例。
- html_message: (可选) send_mail方法独有,可以比较简单地实现一个html文本的传输
def send_mail(subject, message, from_email, recipient_list,
fail_silently=False, auth_user=None, auth_password=None,
connection=None, html_message=None):
"""
Easy wrapper for sending a single message to a recipient list. All members
of the recipient list will see the other recipients in the 'To' field.
If auth_user is None, use the EMAIL_HOST_USER setting.
If auth_password is None, use the EMAIL_HOST_PASSWORD setting.
Note: The API for this method is frozen. New code wanting to extend the
functionality should use the EmailMessage class directly.
"""
connection = connection or get_connection(
username=auth_user,
password=auth_password,
fail_silently=fail_silently,
)
mail = EmailMultiAlternatives(subject, message, from_email, recipient_list, connection=connection)
if html_message:
mail.attach_alternative(html_message, 'text/html')
return mail.send()
settings.py配置
发送邮件之前先在setting.py配置文件里面配置相关的邮箱信息,比如我这里是用的QQ邮箱,使用SSL加密方式,需要授权码登录
(至于如何获取授权码,可以在QQ邮箱设置里面开启,发送短信“配置邮件客户端”到1069070069)
# settings.py
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_USE_SSL = True # SSL加密方式
EMAIL_HOST = 'smtp.qq.com' # 发送邮件的邮箱 的 SMTP服务器,这里用了163邮箱
EMAIL_PORT = 465 # SMTP服务器端口
EMAIL_HOST_USER = '283340479@qq.com' # 发件人
EMAIL_HOST_PASSWORD = '授权码' # 密码(这里使用的是授权码)
EMAIL_FROM = 'yoyo<283340479@qq.com>' # 邮件显示的发件人
如果是其它的企业邮箱,直接密码登录的话,使用TLS方式
EMAIL_USE_SSL = True
EMAIL_HOST = 'smtp.xx.com' # 如果是其它企业邮箱
EMAIL_PORT = 25
EMAIL_HOST_USER = 'xxx@xx.com' # 帐号
EMAIL_HOST_PASSWORD = '**********' # 密码
EMAIL_FROM = 'yoyo<xx@xx.com>' # 邮件显示的发件人
EMAIL_USE_SSL 和 EMAIL_USE_TLS 是互斥的,只能有一个为 True。
views和urls.py
在views.py里面写个视图函数,调用发送邮件的功能
from django.http import HttpResponse
from django.core.mail import send_mail
def mail(request):
send_mail('Subject here', # 主题
'Here is the message.', # 正文
'283340479@qq.com', # 发件人
['xxxxx@qq.com'], # 收件人
fail_silently=False)
return HttpResponse('邮件发送成功,收不到就去垃圾箱找找吧!')
urls.py写个访问地址触发发邮件
from django.conf.urls import url
from hello import views
urlpatterns = [
# 新增用户
url(r'^register/', views.register),
url(r'^login/', views.login),
url(r'^reset/', views.reset_psw),
url(r'^mail/', views.mail),
]
浏览器上访问http://localhost:8000/mail/后,就能收到邮件了

前面讲的send_mail()函数只能发送一个邮件,如果想实现发送多个邮件,可以用send_mass_mail()函数
send_mass_mail函数
先倒入from django.core.mail import send_mass_mail查看对应的源码
def send_mass_mail(datatuple, fail_silently=False, auth_user=None,
auth_password=None, connection=None):
"""
给定tuple数据类型(subject,message,from_email,recipient_list),发送每封邮件到每个收件人列表。 返回发送的电子邮件数量。
如果from_email为None,请使用DEFAULT_FROM_EMAIL设置。
如果设置了auth_user和auth_password,请使用它们登录。
如果auth_user为None,请使用EMAIL_HOST_USER设置。
如果auth_password为None,请使用EMAIL_HOST_PASSWORD设置。
注意:此方法的API已冻结。 想要扩展的新代码功能应该直接使用EmailMessage类。
"""
connection = connection or get_connection(
username=auth_user,
password=auth_password,
fail_silently=fail_silently,
)
messages = [
EmailMessage(subject, message, sender, recipient, connection=connection)
for subject, message, sender, recipient in datatuple
]
return connection.send_messages(messages)
从上面介绍可以看出,需传元祖类型的数据,如果想实现更多的给你可以用EmailMessage类
发送多个邮件
多个邮件的配置信息放到一个元祖里面,传给datatuple参数,代码实现如下
from django.http import HttpResponse
from django.core.mail import send_mail, send_mass_mail
# Create your views here.
def mass_mail(request):
'''发送多个邮件'''
message1 = ('Subject 1',
'Here is the message',
'2833404xx@qq.com', # 发件人
['xxx@xx.com']) # 收件人,多个收件人逗号隔开
message2 = ('Another Subject2',
'Here is another message',
'2833404xx@qq.com',
['xxx@xx.com'])
send_mass_mail((message1, message2),
fail_silently=False)
return HttpResponse('邮件发送成功,收不到就去垃圾箱找找吧!')
python测试开发django-28.发送邮件send_mail的更多相关文章
- python测试开发django-36.一对一(OneToOneField)关系查询
前言 前面一篇在xadmin后台一个页面显示2个关联表(OneToOneField)的字段,使用inlines内联显示.本篇继续学习一对一(OneToOneField)关系的查询. 上一篇list_d ...
- python测试开发django-16.JsonResponse返回中文编码问题
前言 django查询到的结果,用JsonResponse返回在页面上显示类似于\u4e2d\u6587 ,注意这个不叫乱码,这个是unicode编码,python3默认返回的编码 遇到问题 接着前面 ...
- python测试开发django-15.查询结果转json(serializers)
前言 django查询数据库返回的是可迭代的queryset序列,如果不太习惯这种数据的话,可以用serializers方法转成json数据,更直观 返回json数据,需要用到JsonResponse ...
- 2019第一期《python测试开发》课程,10月13号开学
2019第一期<python测试开发>课程,10月13号开学! 主讲老师:上海-悠悠 上课方式:QQ群视频在线教学,方便交流 本期上课时间:10月13号-12月8号,每周六.周日晚上20: ...
- python测试开发django-rest-framework-63.基于函数的视图(@api_view())
前言 上一篇讲了基于类的视图,在REST framework中,你也可以使用常规的基于函数的视图.它提供了一组简单的装饰器,用来包装你的视图函数, 以确保视图函数会收到Request(而不是Djang ...
- 《Python测试开发技术栈—巴哥职场进化记》—前言
写在前面 今年从4月份开始写一本讲Python测试开发技术栈的书,主要有两个目的,第一是将自己掌握的一些内容分享给大家,第二是希望自己能系统的梳理和学习Python相关的技术栈.当时我本来打算以故事体 ...
- python测试开发django-197.django-celery-beat 定时任务
前言 django-celery-beat 可以支持定时任务,把定时任务写到数据库. 接着前面这篇写python测试开发django-196.python3.8+django2+celery5.2.7 ...
- python测试开发django-41.crispy-forms设计标签式导航菜单(TabHolder)
前言 xadmin的详情页面主要是用form_layout布局,学会了完全可以不用写html代码,也能做出很好看的页面. xadmin的html页面是用的Bootstrap3框架设计的,layout布 ...
- 【python测试开发栈】python基础语法大盘点
周边很多同学在用python,但是偶尔会发现有人对python的基础语法还不是特别了解,所以帮大家梳理了python的基础语法(文中的介绍以python3为例).如果你已然是python大牛,可以跳过 ...
- python web开发——django学习(一)第一个连接mysql数据库django网站运行成功
1.新建一个项目 2.新建一些文件夹方便管理 3.新建一个项目叫message 4.连接数据库 python web开发Django连接mysql 5.在数据库里自动生成django的表 6.运行 ...
随机推荐
- Linux下jdk、Tomcat、MySQL的安装
1. 安装JDK 1.上传jdk-7u45-linux-x64.tar.gz到Linux上(使用WinSCP工具) 2.解压jdk到/usr/local目录 tar -zxvf jdk-7u45- ...
- oracle 中 dblink 的简单使用
oracle 中 dblink 的简单使用 dblink的作用 当用户要跨本地数据库,访问另外一个数据库表中的数据时,本地数据库中必须创建了远程数据库的dblink,通过dblink本地数据库可以像访 ...
- # Java反射2——获取实体所有属性和方法,并对属性赋值
1.一个普通的实体Person: private int id; private String name; private Date createdTime; ... //其它字段 // get se ...
- 数据库相关--mysql中的单表查询
一.完整的单表查询语句 select [distinct] *|字段1,字段2, .... from 表名 [where 条件1] [group by 字段名 [having 条件2] ] [orde ...
- querySelector/querySelectorAll选择器两个容易忽略的点
jquery写得多了,原生js大API就容易忘.如果你也是这样,一起来回顾一下HTML5的类jquery选择器querySelector和querySelectorAll吧,querySelector ...
- Java NIO -2
NIO http://www.cnblogs.com/puyangsky/p/5840873.html -- 操作系统与 Java 基于流的 I/O模型有些不匹配.操作系统要移动的是大块数据(缓冲区) ...
- 【转载】GetDeviceCaps()函数相关说明
CDC::GetDeviceCaps()物理长度与屏幕像素间的转换 作用:读取DC的一些打印区域信息,主要是像素和英寸方面的数据. 声明:GetDeviceCaps(int ) 使用例子://所有像素 ...
- JAVA线程和进程区别
1,JAVA线程和进程区别? (1)简单来讲一个运行的程序就是一个进程,一个进程中可以有多个线程(线程是程序执行的最小单元). (2)线程有四种状态:运行,就绪,挂起,结束 (3)使用多线程的好处 使 ...
- hdu 5735 Born Slippy 暴力
Born Slippy 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5735 Description Professor Zhang has a r ...
- 【原】用IDEA远程Debug Tomcat服务
[环境参数] Web容器:Tomcat 8.0 IDE:IDEA 2018.1.5 [具体步骤] 1.配置Tomcat容器参数 编辑$CATALINA_HOME/bin/catalina.sh脚本,加 ...