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判断一个集合是否包含了另外一个集合中所有项的方法
Jun 30 Python
Python 爬虫学习笔记之多线程爬虫
Sep 21 Python
python获取当前用户的主目录路径方法(推荐)
Jan 12 Python
Python有序字典简单实现方法示例
Sep 28 Python
Python实现扩展内置类型的方法分析
Oct 16 Python
python进程和线程用法知识点总结
May 28 Python
elasticsearch python 查询的两种方法
Aug 04 Python
Python简易版图书管理系统
Aug 12 Python
使用python实现离散时间傅里叶变换的方法
Sep 02 Python
手机使用python操作图片文件(pydroid3)过程详解
Sep 25 Python
Python数据相关系数矩阵和热力图轻松实现教程
Jun 16 Python
python 逆向爬虫正确调用 JAR 加密逻辑
Jan 12 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数组
2006/10/09 PHP
thinkphp3.2.2实现生成多张缩略图的方法
2014/12/19 PHP
Laravel中使用自己编写类库的3种方法
2015/02/10 PHP
php ActiveMQ的安装与使用方法图文教程
2020/02/23 PHP
syntaxhighlighter 使用方法
2007/07/02 Javascript
jQuery中的.bind()、.live()和.delegate()之间区别分析
2011/06/08 Javascript
javaScript中Math()函数注意事项
2015/06/18 Javascript
浅谈Javascript数组的使用
2015/07/29 Javascript
js实现Select列表各项上移和下移的方法
2015/08/14 Javascript
js ajaxfileupload.js上传报错的解决方法
2016/05/05 Javascript
使用vue.js实现联动效果的示例代码
2017/01/10 Javascript
javascript 正则表达式分组、断言详解
2017/04/20 Javascript
node使用Koa2搭建web项目的方法
2017/10/17 Javascript
十分钟带你快速了解React16新特性
2017/11/10 Javascript
vue vuex vue-rouert后台项目——权限路由(适合初学)
2017/12/29 Javascript
Vue.js实现图片的随意拖动方法
2018/03/08 Javascript
React Native悬浮按钮组件的示例代码
2018/04/05 Javascript
如何在 JavaScript 中更好地利用数组
2018/09/27 Javascript
微信小程序合法域名配置方法
2019/05/06 Javascript
vue ssr服务端渲染(小白解惑)
2019/11/10 Javascript
微信小程序跨页面传递data数据方法解析
2019/12/13 Javascript
使用Taro实现小程序商城的购物车功能模块的实例代码
2020/06/05 Javascript
Python中http请求方法库汇总
2016/01/06 Python
python matplotlib画图实例代码分享
2017/12/27 Python
Python复制Word内容并使用格式设字体与大小实例代码
2018/01/22 Python
TensorFlow如何实现反向传播
2018/02/06 Python
python爬取m3u8连接的视频
2018/02/28 Python
详解python3中tkinter知识点
2018/06/21 Python
Python 通过调用接口获取公交信息的实例
2018/12/17 Python
PYcharm 激活方法(推荐)
2020/03/23 Python
Pycharm同步远程服务器调试的方法步骤
2020/11/04 Python
利用CSS3的flexbox实现水平垂直居中与三列等高布局
2016/09/12 HTML / CSS
教育基金募捐倡议书
2014/05/14 职场文书
安全教育观后感
2015/06/17 职场文书
Python中zipfile压缩包模块的使用
2021/05/14 Python
Win10服务全部禁用了怎么启动?Win10服务全部禁用解决方法
2022/09/23 数码科技