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应用程序在windows下不出现cmd窗口的办法
May 29 Python
Python中函数参数设置及使用的学习笔记
May 03 Python
Python简单格式化时间的方法【strftime函数】
Sep 18 Python
python爬虫入门教程--优雅的HTTP库requests(二)
May 25 Python
Python+Django搭建自己的blog网站
Mar 13 Python
对pandas中两种数据类型Series和DataFrame的区别详解
Nov 12 Python
对python中不同模块(函数、类、变量)的调用详解
Jul 16 Python
django formset实现数据表的批量操作的示例代码
Dec 06 Python
PyCharm永久激活方式(推荐)
Sep 22 Python
Python telnet登陆功能实现代码
Apr 16 Python
python Socket网络编程实现C/S模式和P2P
Jun 22 Python
python基于turtle绘制几何图形
Jun 15 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编程最快明白》第二讲 数字、浮点、布尔型、字符串和数组
2010/11/01 PHP
php下尝试使用GraphicsMagick的缩略图功能
2011/01/01 PHP
Trying to clone an uncloneable object of class Imagic的解决方法
2012/01/11 PHP
php字符串分割函数explode的实例代码
2013/02/07 PHP
php实现通用的从数据库表读取数据到数组的函数实例
2015/03/21 PHP
基于JQuery+PHP编写砸金蛋中奖程序
2015/09/08 PHP
Smarty实现页面静态化(生成HTML)的方法
2016/05/23 PHP
PHP实现模拟http请求的方法分析
2017/12/20 PHP
PHP实现批量修改文件名的方法示例
2019/09/18 PHP
javascript检测对象中是否存在某个属性判断方法小结
2013/05/19 Javascript
js Select下拉列表框进行多选、移除、交换内容的具体实现方法
2013/08/13 Javascript
AnglarJs中的上拉加载实现代码
2018/02/08 Javascript
React组件对子组件children进行加强的方法
2019/06/23 Javascript
JavaScript的变量声明与声明提前用法实例分析
2019/11/26 Javascript
js实现带箭头的进度流程
2020/03/26 Javascript
0基础学习前端开发的一些建议
2020/07/14 Javascript
vue 封装面包屑组件教程
2020/11/16 Javascript
[58:35]OG vs EG 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.22
2019/09/05 DOTA
[06:59]DOTA2-DPC中国联赛3月7日Recap集锦
2021/03/11 DOTA
Python实现的简单模板引擎功能示例
2017/09/02 Python
Python使用OpenCV进行标定
2018/05/08 Python
Python实现E-Mail收集插件实例教程
2019/02/06 Python
python线程的几种创建方式详解
2019/08/29 Python
Python的缺点和劣势分析
2019/11/19 Python
HTML5 图片预加载的示例代码
2020/03/25 HTML / CSS
KIEHL’S科颜氏官方旗舰店:源自美国的顶级护肤品牌
2018/06/07 全球购物
机械电子工程专业推荐信范文
2013/11/20 职场文书
保密工作实施方案
2014/02/24 职场文书
幼儿园秋游感想
2014/03/12 职场文书
煤矿开采专业求职信
2014/07/08 职场文书
普通话演讲稿
2014/09/03 职场文书
九九重阳节标语
2014/10/07 职场文书
公司租车协议书
2015/01/29 职场文书
环保证明
2015/06/23 职场文书
python实现监听键盘
2021/04/26 Python