基于python SMTP实现自动发送邮件教程解析
作者:郑静174 发布时间:2023-03-08 20:15:02
最近工作中的一个项目需要自动发送一些信息邮件到指定邮箱的需求,那么如何实现Python自动发送邮件的功能呢?接下来我们就来简单的介绍下如何利用Python来实现自动发送邮件的功能。
Python SMTP发送邮件
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议 ,说白了就是发送邮件的协议,python的smplib库对SMTP协议进行了简单的封装,提供了对SMTP的支持,可以发送纯文本邮件、HTML文件以及带附件的邮件。
首先我们构建一个SendEmailManager类,也是遵循着面向对象编程的思想来做,大体结构如下:
class SendEmailManager(object):
def __init__(self, **kwargs):
# 初始化参数
...
def _get_conf(self, key):
# 获取配置参数
...
def _init_conf(self):
# 初始化配置参数
...
def _login_email(self):
# 登录邮箱服务器
...
def _make_mail_msg(self):
# 构建文本邮件对象
...
def do_send_mail(self):
# 邮件发送
...
def __init__(self, **kwargs)
类的初始化函数,可以用来设置对象属性,并给予初始值,可以是参数或者固定值 ,其中参数**kwargs是将一个可变的关键字参数的字典传给函数实参,这里里我们主要是对SMTP服务器(这里使用qq邮箱)、发送邮件的代理邮箱、在邮箱中设置的客户端授权密码、可变参数进行一些初始化。具体代码如下:
# SMTP服务器,这里使用qq邮箱,其他邮箱自行百度
EMAIL_HOST = 'smtp.qq.com'
# 发送邮件的代理邮箱
EMAIL_HOST_USER = 'xxxx@xxxx.com'
# 在邮箱中设置的客户端授权密码, 注意这里不是邮箱密码,如何获取邮箱授权码,请看本文最后教程
EMAIL_HOST_PASSWORD = 'xxxxxxxxxxxxx'
def __init__(self, **kwargs):
# 初始化参数
self.email_host = EMAIL_HOST
self.email_host_user = EMAIL_HOST_USER
self.email_host_pass = EMAIL_HOST_PASSWORD
self.kwargs = kwargs
def _get_conf(self, key)
主要负责通过key读取 可变参数self.kwargs 字典里的值,供其他函数使用。
def _get_conf(self, key):
# 获取配置参数
value = self.kwargs.get(key)
if key != "attach_file_list" and (value is None or value == ''):
raise Exception("configuration parameter '%s' cannot be empty" % key)
return value
def _init_conf(self)
该函数主要负责初始化 函数_get_conf 返回的配置参数, 以便接下来的函数可以调用相关配置参数。
def _init_conf(self):
# 初始化配置参数
print(self._get_conf('receives'))
self.receives = self._get_conf('receives')
self.msg_subject = self._get_conf('msg_subject')
self.msg_content = self._get_conf('msg_content')
self.msg_from = self._get_conf('msg_from')
# attachment
self.attach_file_list = self._get_conf('attach_file_list')
def _login_email(self)
登录邮件服务器, 我这里登陆的是qq邮箱的服务器,端口号为465,其他邮箱端口号请自行百度,代码如下:
def _login_email(self):
# 登录邮箱服务器
try:
server = smtplib.SMTP_SSL(self.email_host, port=465)
# set_debuglevel(1)可以打印出和SMTP服务器交互的所有信息
server.set_debuglevel(1)
# 登录邮箱
server.login(self.email_host_user, self.email_host_pass)
return server
except Exception as e:
print("mail login exception:", e)
raise e
def _make_mail_msg(self)
该函数的功能为构建一个邮件实例对象,来处理邮件的内容。一封正常的邮件一般有收发件者信息,邮件主题,邮件正文,有些邮件还附带有附件,具体的设置参见如下代码:
def _make_mail_msg(self):
# 构建邮件对象
msg = MIMEMultipart()
msg.attach(MIMEText(self.msg_content, 'plain', 'utf-8'))
# 邮件主题
msg['Subject'] = Header(self.msg_subject, "utf-8")
# 发件人邮箱信息
msg['From'] = "<%s>" % self.msg_from
# msg['From'] = Header(self.msg_from + "<%s>" % self.email_host_user, "utf-8")
msg['To'] = ",".join(self.receives)
print("---", self.attach_file_list)
if self.attach_file_list:
for i, att in enumerate(self.attach_file_list):
# 构造附件,传送当前目录下的文件
if not att:
break
att_i = MIMEText(open(att, 'rb').read(), 'base64', 'utf-8')
att_i["Content-Type"] = 'application/octet-stream'
# 这里的filename可以任意写,写什么名字,邮件中显示什么名字
att_i["Content-Disposition"] = 'attachment; filename="%s"' % att
msg.attach(att_i)
return msg
def do_send_mail(self)
发送邮件,就是把上几个函数串起来,直接上代码:
def do_send_mail(self):
# 邮件发送
try:
self._init_conf()
server = self._login_email()
msg = self._make_mail_msg()
server.sendmail(self.email_host_user, self.receives, msg.as_string())
server.close()
print("发送成功!")
except Exception as e:
print("邮件发送异常", e)
配置参数,测试能否正常发送邮件:
if __name__ == "__main__":
mail_conf = {
'msg_from': 'xxxx@qq.com', # 邮件发送者的地址
'receives': ['xxxx@qq.com', 'xxxxxxxx@xxxx.com', ], # 邮件接收者的地址,这是个list,因为邮件的接收者可能不止一个
'msg_subject': 'Python 自动发送邮件测试!!', # 邮件的主题
'msg_content': '人生苦短,我用python!!!', # 邮件的内容
'attach_file_list': {"test_file1.py": "test.py", "test_file2.pem": "./public.pem"}, # 为附件文件路径列表,也是个list,也可没有这项
}
manager = SendEmailManager(**mail_conf)
manager.do_send_mail()
ok,发送成功,添加附件也是没问题的。
开始我们讲的获取客户端邮箱的授权码,教程如下(以qq邮箱为例):
来源:https://www.cnblogs.com/mysqlanzhuang/p/12994783.html


猜你喜欢
- 本文以实例形式讲述了Python中切片操作的用法,分享给大家供大家参考借鉴,具体如下:取一个list或tuple的部分元素是非常常见的操作。
- dom元素内部内容是动态的,重置数据后直接获取宽高总是不准确:this.$refs.editor[0].offsetHeight;原因:重置
- 前言:为了帮助广大考生和家长了解高考历年的录取情况,很多网站都汇总了各省市的录取控制分数线,为广大考生填报志愿提供参考。因受多种因素影响,每
- redis无法访问本机真实ip地址1.我在进行用jedis来连接redis时出现了问题:我用Jedis jedis = new Jedis(
- 本文实例讲述了Bootstrap实现前端登录页面带验证码功能。分享给大家供大家参考,具体如下:Bootstrap有自定义的验证码样式,在前端
- 本文实例为大家分享了python判断设备是否联网的具体代码,供大家参考,具体内容如下直接上代码,就是用判断socket能不连上的方法来判断。
- 如果你对在Python生成随机数与random模块中最常用的几个函数的关系与不懂之处,下面的文章就是对Python生成随机数与random模
- ASP 本身不支持动态包含文件,现在的动态包含是通过 FSO 把被包含的文件合并到主文件里再运行。以下也有把形如 <!--#
- 常用 Git 命令清单。几个专用名词的译名如下。Workspace:工作区Index / Stage:暂存区Repository:仓库区(或
- 如下所示:$preg= '/xue[\s\S]*?om/i';preg_match_all($preg,"学并思网
- 一直也搞不清楚px与em之间的关系和特点,看过95%的中国网站需要重写CSS以后后确实收获很大。平时都是用px来定义字体,所以无法用浏览器字
- javascript中ele.getBoundingClientRect():获取一个元素相对于浏览器视口的的坐标(无论父元素定位与否),返
- 单元测试长久以来是热门话题,本文不会讨论需不需要写单测,可以看看参考资料1,我个人认为写好单测应该是每个优秀开发者必备的技能,关于写单测
- 对于日志的处理,有时候需要把符合条件的日志计入数据库中一、添加pom依赖 <dependency> &
- sql="select * from admin where users='"&users&&q
- Google Chrome 的发布,使我们更加的注重基于 WebKit 核心的浏览器的表现情况,但我们很多时候“不小心”就会出现
- 啥也不说了,大家还是直接看图吧!补充知识:python http request header主要内容http request 请求头主要包
- 在plugin/tagbar.vim里面的键映射改成: \ ['nexttag', '<
- 快速入门模块提供三个类来处理一对一映射类型的一些操作'bidict', 'inverted', 'n
- =一、链表链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一