Python smtp邮件发送模块用法教程


Posted in Python onJune 15, 2020

在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的Tornado框架异步编程入门实例
Apr 24 Python
python读写二进制文件的方法
May 09 Python
python anaconda 安装 环境变量 升级 以及特殊库安装的方法
Jun 21 Python
python中利用await关键字如何等待Future对象完成详解
Sep 07 Python
Python实现PS滤镜碎片特效功能示例
Jan 24 Python
在python win系统下 打开TXT文件的实例
Apr 29 Python
Python基于最小二乘法实现曲线拟合示例
Jun 14 Python
python 生成器和迭代器的原理解析
Oct 12 Python
python GUI库图形界面开发之PyQt5控件QTableWidget详细使用方法与属性
Feb 25 Python
python中sort sorted reverse reversed函数的区别说明
May 11 Python
在Mac中配置Python虚拟环境过程解析
Jun 22 Python
Python 实现简单的客户端认证
Jul 29 Python
pandas数据处理之绘图的实现
Jun 15 #Python
keras中的loss、optimizer、metrics用法
Jun 15 #Python
使用keras实现Precise, Recall, F1-socre方式
Jun 15 #Python
基于python和flask实现http接口过程解析
Jun 15 #Python
基于nexus3配置Python仓库过程详解
Jun 15 #Python
Keras官方中文文档:性能评估Metrices详解
Jun 15 #Python
在keras里面实现计算f1-score的代码
Jun 15 #Python
You might like
关于拼配咖啡,你要知道
2021/03/03 咖啡文化
PHP中余数、取余的妙用
2015/06/29 PHP
php实现Session存储到Redis
2015/11/11 PHP
详解php伪造Referer请求反盗链资源
2019/01/24 PHP
读jQuery之六 缓存数据功能介绍
2011/06/21 Javascript
深入理解JavaScript系列(12) 变量对象(Variable Object)
2012/01/16 Javascript
JavaScript将当前时间转换成UTC标准时间的方法
2015/04/06 Javascript
javascript+HTML5自定义元素播放焦点图动画
2016/02/21 Javascript
深入理解$.each和$(selector).each
2016/05/15 Javascript
ashx文件获取$.ajax()方法发送的数据
2016/05/26 Javascript
javascript实现圣旨卷轴展开效果(代码分享)
2017/03/23 Javascript
echarts同一页面中四个图表切换的js数据交互方法示例
2018/07/03 Javascript
深入理解es6块级作用域的使用
2019/03/28 Javascript
微信小程序的线程架构【推荐】
2019/05/14 Javascript
Vue + element 实现多选框组并保存已选id集合的示例代码
2020/06/03 Javascript
[54:17]DOTA2-DPC中国联赛定级赛 RNG vs iG BO3第二场 1月10日
2021/03/11 DOTA
python网络编程学习笔记(10):webpy框架
2014/06/09 Python
python根据时间生成mongodb的ObjectId的方法
2015/03/13 Python
python flask实现分页效果
2017/06/27 Python
pandas or sql计算前后两行数据间的增值方法
2018/04/20 Python
flask框架实现连接sqlite3数据库的方法分析
2018/07/16 Python
简单谈谈python基本数据类型
2018/09/26 Python
python3.8.1+selenium实现登录滑块验证功能
2020/05/22 Python
python写文件时覆盖原来的实例方法
2020/07/22 Python
html5 学习简单的拾色器
2010/09/03 HTML / CSS
美国家居装饰网上商店:Lulu & Georgia
2019/09/14 全球购物
美国第一大药店连锁机构:Walgreens(沃尔格林)
2019/10/10 全球购物
Timberland法国官网:购买靴子、鞋子、衣服、夹克和配饰
2019/11/30 全球购物
30岁生日感言
2014/01/25 职场文书
酒店采购员岗位职责
2014/03/14 职场文书
投资合作协议书范本
2014/04/17 职场文书
2015年乡镇扶贫工作总结
2015/04/08 职场文书
故意伤害辩护词
2015/05/21 职场文书
恋恋笔记本观后感
2015/06/16 职场文书
2015年学校管理工作总结
2015/07/20 职场文书
互联网的下一个风口:新的独角兽将诞生
2019/08/02 职场文书