django 邮件发送模块smtp使用详解


Posted in Python onJuly 22, 2019

前言

在Python中已经内置了一个smtp邮件发送模块,Django在此基础上进行了简单地封装,让我们在Django环境中可以更方便更灵活的发送邮件。

所有的功能都在django.core.mail中。

一、快速上手

两行就可以搞定一封邮件:

from django.core.mail import send_mail

send_mail(
  'Subject here',
  'Here is the message.',
  'from@example.com',
  ['to@example.com'],
  fail_silently=False,
)

导入功能模块,然后发送邮件,so easy!

默认情况下,使用配置文件中的EMAIL_HOST和EMAIL_PORT设置SMTP服务器主机和端口,EMAIL_HOST_USER和EMAIL_HOST_PASSWORD是用户名和密码。如果设置了EMAIL_USE_TLS和EMAIL_USE_SSL,它们将控制是否使用相应的加密链接。

二、单发 send_mail()

方法原型:send_mail(subject, message, from_email, recipient_list, fail_silently=False, auth_user=None, auth_password=None, connection=None, html_message=None)[source]

让我们来了解一下send_mail()方法,它接收一系列参数,其中的subject、message、from_email和recipient_list参数是必须的,其它的可选。

  • subject:邮件主题。字符串。
  • message:邮件具体内容。字符串。
  • from_email:邮件发送者。字符串。
  • recipient_list:收件人。一个由邮箱地址组成的字符串列表。recipient_list中的每一个成员都会在邮件信息的“To:”区域看到其它成员。
  • fail_silently: 一个布尔值。如果它是False,send_mail发送失败时,将会引发一个smtplib.SMTPException异常。
  • auth_user: 可选的用户名用来验证SMTP服务器,如果你要特别指定使用哪个邮箱帐号,就指定这个参数。如果没有提供这个值,Django将会使用settings中EMAIL_HOST_USER的值。如果两者都不提供,那你还发什么???
  • auth_password: 可选的密码用来验证SMTP服务器。如果没有提供这个值,Django 将会使用settings中EMAIL_HOST_PASSWORD的值。和上面那个参数是一家的。
  • connection: 可选的用来发送邮件的电子邮件后端。
  • html_message: 如果提供了html_message,可以发送带HTML代码的邮件。

send_mail()方法返回值将是成功发送出去的邮件数量(只会是0或1,因为它只能发送一封邮件)。

三、群发 send_mass_mail()

方法原型:send_mass_mail(datatuple,fail_silently = False,auth_user = None,auth_password = None ,connection = None)[source]

send_mass_mail()用来处理大批量邮件任务,也就是所谓的群发。

它的参数中,datatuple是必需参数,接收一个元组,元组的每个元素的格式如下:

(subject, message, from_email, recipient_list)
上面四个字段的意义与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)

send_mass_mail()方法的返回值是成功发送的邮件数量。

使用send_mail()方法时,每调用一次,它会和SMTP服务器建立一次连接,也就是发一次连一次,效率很低。而send_mass_mail(),则只建立一次链接,就将所有的邮件都发送出去,效率比较高。

四、防止头部注入攻击

有时候,我们要根据用户表单的输入来构造电子邮件,这就存在头部注入攻击的风险,Django给我们提供了一定的防范能力,但是更多时候,还需要你自己编写安全防范代码。

下面是一个例子,接收用户输入的主题、邮件内容和发送方,将邮件发送到系统管理员:

from django.core.mail import send_mail, BadHeaderError
from django.http import HttpResponse, HttpResponseRedirect

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.')

如果检查到用户的输入带有头部注入攻击的可能性,会弹出BadHeaderError异常。

五、发送多媒体邮件

默认情况下,发送的邮件都是纯文本格式的。但有时候我们希望能在邮件里带一些超级链接、图片,甚至视频和JS动作。

Django为我们提供了一个EmailMultiAlternatives类,可以同时发送文本和HTML内容,下面是个范例,我们照着写就行:

from django.core.mail import EmailMultiAlternatives

subject, from_email, to = 'hello', 'from@example.com', 'to@example.com'
text_content = 'This is an important message.'
html_content = '<p>This is an <strong>important</strong> message.</p>'
msg = EmailMultiAlternatives(subject, text_content, from_email, [to])
msg.attach_alternative(html_content, "text/html")
msg.send()

需要提醒的是,接收方的邮件服务商不一定支持多媒体邮件,也许是为了安全,也许是别的原因。为了保证你的邮件内容能被阅读,请务必同时发送纯文本邮件。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
教你安装python Django(图文)
Nov 04 Python
Python中用max()方法求最大值的介绍
May 15 Python
在Python程序和Flask框架中使用SQLAlchemy的教程
Jun 06 Python
Python 中开发pattern的string模板(template) 实例详解
Apr 01 Python
python的scikit-learn将特征转成one-hot特征的方法
Jul 10 Python
Django使用paginator插件实现翻页功能的实例
Oct 24 Python
matplotlib命令与格式之tick坐标轴日期格式(设置日期主副刻度)
Aug 06 Python
Python列表原理与用法详解【创建、元素增加、删除、访问、计数、切片、遍历等】
Oct 30 Python
pytorch 求网络模型参数实例
Dec 30 Python
Python基础之列表常见操作经典实例详解
Feb 26 Python
Python反爬虫伪装浏览器进行爬虫
Feb 28 Python
Django显示可视化图表的实践
May 10 Python
Pandas 重塑(stack)和轴向旋转(pivot)的实现
Jul 22 #Python
Pandas透视表(pivot_table)详解
Jul 22 #Python
django认证系统 Authentication使用详解
Jul 22 #Python
django Admin文档生成器使用详解
Jul 22 #Python
django表单的Widgets使用详解
Jul 22 #Python
Python代码使用 Pyftpdlib实现FTP服务器功能
Jul 22 #Python
超简单的Python HTTP服务
Jul 22 #Python
You might like
地摊中国 - 珍藏老照片
2020/08/18 杂记
跟我学Laravel之配置Laravel
2014/10/15 PHP
PHP数据库操作三:redis用法分析
2017/08/16 PHP
PHP内置函数生成随机数实例
2019/01/18 PHP
Laravel 微信小程序后端搭建步骤详解
2019/11/26 PHP
Javascript中Eval函数的使用说明
2008/10/11 Javascript
javascript 动态调整图片尺寸实现代码
2009/12/28 Javascript
让mayfish支持mysqli数据库驱动的实现方法
2010/05/22 Javascript
JavaScript中的全局对象介绍
2015/01/01 Javascript
探讨JavaScript标签位置的存放与功能有无关系
2016/01/15 Javascript
怎样判断jQuery当前元素是隐藏还是显示
2016/11/23 Javascript
JS实现的简易拖放效果示例
2016/12/29 Javascript
Map.vue基于百度地图组件重构笔记分享
2017/04/17 Javascript
Node.JS利用PhantomJs抓取网页入门教程
2017/05/19 Javascript
three.js实现3D影院的原理的代码分析
2017/12/18 Javascript
详解Vue组件之间通信的七种方式
2019/04/14 Javascript
layer弹出框确定前验证:弹出消息框的方法(弹出两个layer)
2019/09/21 Javascript
[01:05:30]VP vs TNC 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
Python中的引用和拷贝浅析
2014/11/22 Python
python pexpect ssh 远程登录服务器的方法
2019/02/14 Python
Python+AutoIt实现界面工具开发过程详解
2019/08/07 Python
Python 类的魔法属性用法实例分析
2019/11/21 Python
在Tensorflow中查看权重的实现
2020/01/24 Python
python3实现raspberry pi(树莓派)4驱小车控制程序
2020/02/12 Python
python入门之井字棋小游戏
2020/03/05 Python
CSS3实现菜单悬停效果
2020/11/17 HTML / CSS
毕业生的自我鉴定
2013/10/29 职场文书
公务员培训心得体会
2013/12/28 职场文书
2014政务公开实施方案
2014/02/19 职场文书
报关员个人职业生涯规划书
2014/03/12 职场文书
小学标准化建设汇报材料
2014/08/16 职场文书
寝室长工作失责检讨书
2014/10/06 职场文书
教师学期述职自我鉴定
2019/08/16 职场文书
JavaScript中关于预编译、作用域链和闭包的理解
2021/03/31 Javascript
PL350与SW11的比较
2021/04/22 无线电
斗罗大陆八大特殊魂兽,龙族始祖排榜首,第五最残忍(翠魔鸟)
2022/03/18 国漫