python实现邮件发送功能


Posted in Python onAugust 10, 2019

什么是POP3、SMTP和MAP?

POP3是Post Office Protocol 3的简称,即邮局协议的第三个版本,他是规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的协议。它是因特网电子邮件的第一个离线协议的标准。POP3允许用户从服务器上把邮件存储到本地计算机上,同时删除保存在邮件服务器上的邮件,而POP3服务器则是遵循POP3协议的接受邮件服务器,用来接受电子邮件。

SMTP的全称是Simple Mail Transfer Protocol,即简单的邮件传输协议。它是一组用于从源地址到目的地的地址传输邮件的规范,通过它控制邮件的中转方式。SMTP协议属于TCP/IP协议簇,它帮助每台计算机在发送或者中转信件时找到下个目的地。SMTP服务器就是遵循SMTP协议的发送邮件服务器。

SMTP认证,简单来说就是要求必须在提供了账户名和密码之后才能登陆SMTP服务器。

IMAP全称是Iternet Mail Access Protocol,即交互式邮件存取协议,它是跟POP3类似的邮件访问标准协议之一。不同的是,开启了IMAP后,你在电子邮件客户端收取的邮件仍然保存在服务器上,同时在客户端上的操作都会反馈到服务器上,如:删除邮件、标记邮件等,服务器上的邮件也会做相应的动作。无论从浏览器登陆还是客户端登陆邮箱看到的邮件以及状态都是一致的。

我们使用网易的163邮箱来发送邮件,所以我们需要先将163邮箱的POP3/SMTP/IMAP都给打开。

具体步骤是:设置->POP3/SMTP/IMAP->设置POP3/SMTP/IMAP,点击复选框时邮箱会要求你设置授权码,设置授权码,然后一定要将授权码给记住,后面会用到。邮箱设置好后我们就开始编写代码发送邮件。

首先引入我们需要导入的库及包

import smtplib
import email
# MIME 多邮件扩充协议
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart

然后设置邮箱的域名,端口,发送者邮箱,接收者邮箱

host = 'smtp.163.com' # 使用163邮箱
port = '465' # 163邮箱服务器的端口号
sender = 'xxxxxx@163.com' # 发送者的邮箱
password = 'xxxxxx' # 授权码
receiver = 'xxxxxx' # 接收者的邮箱,可以为其他类型的邮箱,如果是多个接收者请传入列表

接下来构建文本邮箱的主体

​body = 'xxx' # 你要发送的邮件的内容
subject = 'xxx' # 你要发送的邮件的标题
 
# plain表示邮件内容的类型,文本类型默认是plain。utf-8表示内容的编码格式。
message = MIMEText(body, 'plain', 'utf-8')
message['From'] = sender # 发送者
message['To'] = receiver # 接收者
message['Subject'] = subject # 邮件标题

接下来我们获取SMTP协议的证书,登陆我们的邮箱发送邮件

# 获取SMTP协议证书
email_clint = smtplib.SMTP_SSL(host, port)
# 登陆邮箱,这里也是用授权码登陆邮箱的
login_result = email_clint.login(sender, password)
# 发送邮件
email_clent.sendmail(from_addr=sender, to_addrs=receiver, msg=message.as_string())
# 关闭邮件发送客户端
email_client.close()

其实这里我们可以打印login_result,如果返回的状态码是235则证明邮件发送成功。

下面是发送文本邮件的全部代码。

import email
import smtplib
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
 
class SendEmail(object):
 def __init__(self):
 self.host = 'smtp.163.com'
 self.port = '465'
 self.sender = 'xxxxxx@163.com'
 self.password = 'xxxxxx'
 
 def send_email(self, receiver, subject='', body=''):
 message = MIMEText(body, 'plain', 'utf-8')
 message['From'] = self.sender
 message['To'] = receiver
 message['Subject'] = subject
 
 try:
  email_clint = smtplib.SMTP_SSL(self.host, self.port)
  print('获取证书成功')
  login_result = email_clint.login(self.sender, self.password)
  print('开始登陆')
  if login_result[0] == 235:
  print('登陆成功')
  email_clint.sendmail(self.sender, receiver, message.as_string())
  print('邮件发送成功')
  else:
  print('登陆失败')
 except Exception as e:
  print('发生错误', e)

下面介绍发送HTML格式内容的邮件以及向邮件内容中添加图片。

其实发送HTML格式内容的邮件很简单,只需将发送邮件的内容格式改为html就行了,像这样

message = MIMEText('<h2 style="color">学习使我快乐</h2>', 'html', 'utf-8')

还有使用内嵌的方法向邮件内容中加入文本或者图片

# related 表示使用内嵌资源的形式,将邮件发送给对方
message = MIMEMultipart('related')

然后向邮件中添加内容,如果把图片嵌入到邮件正文中只需在HTML中通过引用src="cid:x"即可。x代表图片的编号可以是数字也可是是字符串

# ---------------发送文本-----------------
message_html = MIMEText('<h2 style="color:red;font-size:100px">学习使我快乐</h2><img src="cid:small">','html','utf-8')
# 将邮件内容 装入到邮件信息当中去
message.attach(message_html)
# ---------------发送图片-----------------
# rb 读取二进制文件(图片是二进制文件)
image_data = open('1.gif','rb')
# 设置读取获取的二进制数据
message_image = MIMEImage(image_data.read())
# 关闭刚才打开的文件
image_data.close()
message_image.add_header('Content-ID','small')
# 添加图片文件到邮件信息当中去
message.attach(message_image)

然后构建邮件的主体,发送邮件即可

message['From'] = sender # 发送者
message['To'] = receiver # 接收者
message['Subject'] = subject # 邮件标题
​
email_clint = smtplib.SMTP_SSL(host, port)
login_result = email_clint.login(sender, password)
email_clent.sendmail(from_addr=sender, to_addrs=receiver, msg=message.as_string())
email_client.close()

我们经常会向邮件中添加附件,下面介绍添加附件的方式

添加附件也是使用内嵌的方式添加的

# 对二进制文件需要设置默认的编码形式
# 对于MIMEText()来说 默认的编码形式就是base64
# 如果对于二进制文件来说 没有设置base64进行编码 则附件的就会呈现乱码
# --------------------添加图片附件----------------------
message_image = MIMEText(open('1.gif','rb').read(),'base64','utf-8')
# 设置附件在邮件中的名字
message_image['Content-disposition'] = 'attachment;filename="happy.gif"'
message.attach(message_image)
 
# --------------------添加xlsx表格附件---------------
message_xlsx = MIMEText(open('table.xlsx','rb').read(),'base64','utf-8')
# 设置附件在邮件当中的名字
message_xlsx['Content-Disposition'] = 'attachment;filename="test.xlsx"'
message.attach(message_xlsx)

然后发送邮件即可。

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

Python 相关文章推荐
python 将数据保存为excel的xls格式(实例讲解)
May 03 Python
mac下给python3安装requests库和scrapy库的实例
Jun 13 Python
对python 生成拼接xml报文的示例详解
Dec 28 Python
六行python代码的爱心曲线详解
May 17 Python
python中的decimal类型转换实例详解
Jun 26 Python
python lambda表达式(匿名函数)写法解析
Sep 16 Python
Python实现报警信息实时发送至邮箱功能(实例代码)
Nov 11 Python
PyCharm 2020.2.2 x64 下载并安装的详细教程
Oct 15 Python
Python中过滤字符串列表的方法
Dec 22 Python
python使用numpy中的size()函数实例用法详解
Jan 29 Python
Python爬虫之爬取某文库文档数据
Apr 21 Python
python实现双向链表原理
May 25 Python
Python字典推导式将cookie字符串转化为字典解析
Aug 10 #Python
python selenium登录豆瓣网过程解析
Aug 10 #Python
python matplotlib库绘制散点图例题解析
Aug 10 #Python
python matplotlib库绘制条形图练习题
Aug 10 #Python
Python OpenCV实现鼠标画框效果
Aug 19 #Python
python opencv鼠标事件实现画框圈定目标获取坐标信息
Apr 18 #Python
python点击鼠标获取坐标(Graphics)
Aug 10 #Python
You might like
php设计模式 Interpreter(解释器模式)
2011/06/26 PHP
PHP结合JQueryJcrop实现图片裁切实例详解
2014/07/24 PHP
ThinkPHP实现ajax仿官网搜索功能实例
2014/12/02 PHP
盘点PHP和ASP.NET的10大对比!
2015/12/24 PHP
PHP会员找回密码功能的简单实现
2016/09/05 PHP
PHP中单例模式的使用场景与使用方法讲解
2019/03/18 PHP
分享8个Laravel模型时间戳使用技巧小结
2020/02/12 PHP
简单的php购物车代码
2020/06/05 PHP
IE不出现Flash激活框的小发现的js实现方法
2007/09/07 Javascript
25个优雅的jQuery Tooltip插件推荐
2011/05/25 Javascript
JavaScript高级程序设计(第3版)学习笔记8 js函数(中)
2012/10/11 Javascript
解决给dom元素绑定click等事件无效问题的方法
2017/02/17 Javascript
jQuery插件jqGrid动态获取列和列字段的方法
2017/03/03 Javascript
微信公众号菜单配置微信小程序实例详解
2017/03/31 Javascript
详解node.js中的npm和webpack配置方法
2018/01/21 Javascript
jQuery阻止事件冒泡实例分析
2018/07/03 jQuery
Vue中的组件及路由使用实例代码详解
2019/05/22 Javascript
webpack4.0+vue2.0利用批处理生成前端单页或多页应用的方法
2019/06/28 Javascript
vant中的toast轻提示实现代码
2020/11/04 Javascript
[52:09]2014 DOTA2华西杯精英邀请赛 5 25 NewBee VS DK第二场
2014/05/26 DOTA
python使用marshal模块序列化实例
2014/09/25 Python
Pipenv一键搭建python虚拟环境的方法
2018/05/22 Python
Python socket实现多对多全双工通信的方法
2019/02/13 Python
python使用matplotlib画柱状图、散点图
2019/03/18 Python
python交互模式下输入换行/输入多行命令的方法
2019/07/02 Python
利用python在大量数据文件下删除某一行的例子
2019/08/21 Python
python正则表达式实例代码
2020/03/03 Python
django模型类中,null=True,blank=True用法说明
2020/07/09 Python
Pandas中DataFrame基本函数整理(小结)
2020/07/20 Python
通过Django Admin+HttpRunner1.5.6实现简易接口测试平台
2020/11/11 Python
GE设备配件:GE Appliance Parts(家电零件、配件和滤水器)
2018/11/28 全球购物
介绍一下Prototype的$()函数,$F()函数,$A()函数都是什么作用?
2014/03/05 面试题
祖国在我心中演讲稿
2014/01/15 职场文书
租车协议书范本2014
2014/11/17 职场文书
小学优秀班主任材料
2014/12/17 职场文书
新教师教学工作总结
2015/08/14 职场文书