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 相关文章推荐
Django中实现一个高性能计数器(Counter)实例
Jul 09 Python
Python中urllib2模块的8个使用细节分享
Jan 01 Python
Python中getattr函数和hasattr函数作用详解
Jun 14 Python
Python读写Json涉及到中文的处理方法
Sep 12 Python
Python实现k-means算法
Feb 23 Python
python 限制函数调用次数的实例讲解
Apr 21 Python
用python简单实现mysql数据同步到ElasticSearch的教程
May 30 Python
Python+PyQT5的子线程更新UI界面的实例
Jun 14 Python
Appium+python自动化之连接模拟器并启动淘宝APP(超详解)
Jun 17 Python
python使用递归的方式建立二叉树
Jul 03 Python
python如何利用paramiko执行服务器命令
Nov 07 Python
python工具——Mimesis的简单使用教程
Jan 16 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
全国FM电台频率大全 - 8 黑龙江省
2020/03/11 无线电
微信公众平台天气预报功能开发
2014/07/06 PHP
php基于双向循环队列实现历史记录的前进后退等功能
2015/08/08 PHP
PHP可变变量学习小结
2015/11/29 PHP
实例讲解PHP表单处理
2019/02/15 PHP
php实现简单的守护进程创建、开启与关闭操作
2019/08/13 PHP
在laravel中实现事务回滚的方法
2019/10/10 PHP
YII2框架中使用RBAC对模块,控制器,方法的权限控制及规则的使用示例
2020/03/18 PHP
javascript时间函数基础介绍
2013/03/28 Javascript
jQuery实现自动调整字体大小的方法
2015/06/15 Javascript
jquery操作select元素和option的实例代码
2016/02/03 Javascript
Nodejs中session的简单使用及通过session实现身份验证的方法
2016/02/04 NodeJs
noty ? jQuery通知插件全面解析
2016/05/18 Javascript
jquery-mobile表单的创建方法详解
2016/11/23 Javascript
详解node-ccap模块生成captcha验证码
2017/07/01 Javascript
js求数组中全部数字可拼接出的最大整数示例代码
2017/08/25 Javascript
基于jQuery的$.getScript方法去加载javaScript文档解析
2017/11/08 jQuery
原生js+cookie实现购物车功能的方法分析
2017/12/21 Javascript
浅谈Vue.js 关于页面加载完成后执行一个方法的问题
2019/04/01 Javascript
vue项目从node8.x升级到12.x后的问题解决
2019/10/25 Javascript
Python 爬虫图片简单实现
2017/06/01 Python
pip命令无法使用的解决方法
2018/06/12 Python
python打包成so文件过程解析
2019/09/28 Python
Python3.7 基于 pycryptodome 的AES加密解密、RSA加密解密、加签验签
2019/12/04 Python
python zip,lambda,map函数代码实例
2020/04/04 Python
python datetime时间格式的相互转换问题
2020/06/11 Python
python中yield的用法详解
2021/01/13 Python
css3 transform及原生js实现鼠标拖动3D立方体旋转
2016/06/20 HTML / CSS
html5指南-2.如何操作document metadata
2013/01/07 HTML / CSS
乌克兰排名第一的在线旅游超市:Farvater.Travel
2020/01/02 全球购物
办公室文秘自我评价
2013/09/21 职场文书
超市端午节活动方案
2014/01/23 职场文书
修理厂厂长岗位职责
2014/01/30 职场文书
二手房购房意向书范本
2014/04/01 职场文书
高校教师个人总结
2015/02/10 职场文书
Python实现文本文件拆分写入到多个文本文件的方法
2021/04/18 Python