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 不同对象比较大小示例探讨
Aug 21 Python
python中while循环语句用法简单实例
May 07 Python
Python中的模块导入和读取键盘输入的方法
Oct 16 Python
简单谈谈Python中的元祖(Tuple)和字典(Dict)
Apr 21 Python
Python如何快速上手? 快速掌握一门新语言的方法
Nov 14 Python
python3 打开外部程序及关闭的示例
Nov 06 Python
Python给图像添加噪声具体操作
Mar 03 Python
Python利用PyPDF2库获取PDF文件总页码实例
Apr 03 Python
从0到1使用python开发一个半自动答题小程序的实现
May 12 Python
python Django 反向访问器的外键冲突解决
May 20 Python
python中re模块知识点总结
Jan 17 Python
python模块内置属性概念及实例
Feb 18 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脚本不报错的原因
2014/06/12 PHP
PHP实现简单爬虫的方法
2015/07/29 PHP
PHP + plupload.js实现多图上传并显示进度条加删除实例代码
2017/03/06 PHP
一个JS翻页效果
2007/07/23 Javascript
javascript 一个自定义长度的文本自动换行的函数
2007/08/19 Javascript
jquery 图片预加载 自动等比例缩放插件
2008/12/25 Javascript
jquery.cvtooltip.js 基于jquery的气泡提示插件
2010/11/19 Javascript
基于jquery的内容循环滚动小模块(仿新浪微博未登录首页滚动微博显示)
2011/03/28 Javascript
JQUERY1.6 使用方法四 检测浏览器
2011/11/23 Javascript
javascript异步编程的4种方法
2014/02/19 Javascript
js实现禁止中文输入的方法
2015/01/14 Javascript
JavaScript如何实现组合列表框中元素移动效果
2016/03/01 Javascript
基于jQuery实现选项卡效果
2017/01/04 Javascript
微信小程序 页面滑动事件的实例详解
2017/10/12 Javascript
详解mpvue中小程序自定义导航组件开发指南
2019/02/11 Javascript
Vue自定义指令上报Google Analytics事件统计的方法
2019/02/25 Javascript
移动端(微信等使用vConsole调试console的方法
2019/03/05 Javascript
js实现移动端tab切换时下划线滑动效果
2019/09/08 Javascript
Python socket.error: [Errno 98] Address already in use的原因和解决方法
2014/08/25 Python
浅谈MySQL中的触发器
2015/05/05 Python
Django框架下在URLconf中指定视图缓存的方法
2015/07/23 Python
python3.6.3安装图文教程 TensorFlow安装配置方法
2020/06/24 Python
pip 20.3 新版本发布!即将抛弃 Python 2.x(推荐)
2020/12/16 Python
python pyg2plot的原理知识点总结
2021/02/28 Python
css3类选择器之结合元素选择器和多类选择器用法
2017/03/09 HTML / CSS
Agoda西班牙:全球特价酒店预订
2017/06/03 全球购物
Waterford英国官方网站:世界上最受欢迎的优质水晶品牌
2019/08/17 全球购物
办公室主任岗位职责
2013/11/08 职场文书
CAD制图人员的自荐信
2014/02/07 职场文书
运动会的口号
2014/06/09 职场文书
学习雷锋标语
2014/06/25 职场文书
员工激励培训演讲稿
2014/09/16 职场文书
个人融资协议书范本两则
2014/10/15 职场文书
Nginx虚拟主机的配置步骤过程全解
2022/03/31 Servers
SQL SERVER中的流程控制语句
2022/05/25 SQL Server
table设置超出部分隐藏,鼠标移上去显示全部内容的方法
2022/12/24 HTML / CSS