手把手教你使用Python轻松搞定发邮件
前言
现在生活节奏加快,人们之间交流方式也有了天差地别,为了更加便捷的交流沟通,电子邮件产生了,众所周知,电子邮件其实就是客户端和服务器端发送接受数据一样,他有一个发信和一个收信的功能,电子邮件的通信协议为SMTP ,POP3,IMAP,而且他们都属于tcp/ip协议,像我们经常用到的QQ邮箱,网易邮箱,这些都是同样的模式。
准备
- 编辑器:sublime text 3
 - 模块:smtplib和email
 
项目实施
1.安装
pip install smtplib
pip install email
注:这里有一个小坑,就是安装smtplib不能像上面那样直接安装,那样会安装不上的,你得先安装PyEmail,因为你smtplib 集成在了这个模块中了,就好比pillow模块集成在PIL中一样的,另一个正常安装即可。
2.开通pop3 SMTP imap 服务了解邮箱授权码
任何一个邮箱你如果想要发邮件,你得先开通以上服务,让邮件能够通信,而且还得有邮箱授权码,比如说QQ邮箱:
打开QQ邮箱,选择设置--------账户,然后开启服务。


开启服务后,点击生成授权码,保存好授权码。获取授权码只需要你用注册手机号发短信或者动态令牌即可。
3.构建邮件端口,建立连接
import smtplib
sm=smtp.SMTP() # 初始化连接
sm.connect('邮件服务器地址','端口') #建立连接
sm.login('邮箱账号','邮箱密码/授权码') #登陆账户
sm.sendmail('邮件发送方','邮件接受方','邮件内容') #发送邮件
sm.quit() #关闭连接,结束邮件服务
了解了以上的知识后,我们来试着登陆一下吧,我以QQ邮箱为例:

有这样的标识表示登陆成功,顺便强调一句,在这里我为什么没有配置邮件服务器端口,因为服务器已经帮我们配置好了,默认的都是25号端口,如果你担心邮件的安全问题,比如会被黑客截胡,你也可以使用ssl链接传输:

同样它的端口也是默认配置好了,他的端口号为465,为了安全,咱们选择这项。
4.构建邮件内容部分
这里我们需要用到email模块,我们都知道,邮件一般可以发很多东西,比如说文本,图片,文件等等,那么我们来看看吧。
一、文本
导入模块
from email.mime.text import MIMEText
填充文本
在此之前我们得知道它的具体用法:
- MIMEText(‘邮件内容’,‘类型’, '编码')
 - 邮件内容为字符串
 - 类型: text/plain text/html
 - 编码 : utf-8 gbk
 
构造文本
MIMEText('hello','text/plain','utf-8') 
构造超文本
MIMEText('<a href='www.baidu.com'>点击此处有惊喜</a>','text/html','utf-8') 
下面我们来实际操作下吧。


非常成功收到了邮件了。正是2091500484这个邮箱给我发的。当然我们这样只是实现了最简单的功能,
我们需要将它格式规范下,比如给它添加个开头结尾什么的。我们需要导入构建邮件完整内容的模块:
from email.header import Header
然后设置头部,内容,尾部
msg1['From']=Header('你是猪吗')  #设置发件人昵称 
msg1['To']=Header('hwhrr123321@163.com') #设置收件人昵称 
msg1['Subject'] = Header('我是猪') #设置标题 

可以看到,是不是觉得很有趣了,快来试试吧,哈哈哈。。。
二、图片
发了文本后我们还想发一张图片,那该怎么办呢?莫慌,此时需要先导入发图片的模块:
from email.mime.image import MIMEImage
然后我们在读取图片文件将它添加到邮件中去。
ff=open('1.jpg','rb').read() #打开文件 
fd=MIMEImage(ff,'subtype')    #初始化 
fd.add_header('Content-ID','1.jpg')  #添加到头部 

可以看到图片并没有显示出来,那么这是怎么回事,哦,原来图片是依托附件而存在的,要么是html要么是附件,但是两者都需要附件模块的支持,下面我们导入附件模块:
from email.mime.multipart import MIMEMultipart
1.将图片插入到html中
也就是将图片插入到正文部分,而非附件的形式。
msg3 = MIMEMultipart('related') 
msg3['From'] = '你是猪吗' 
msg3['To'] = 'hwhrr123321@163.com' 
msg3['Subject'] = '我是猪' 
msg4 = MIMEMultipart('alternative') #构建一个附件 
msg3.attach(msg4)  #将附件引入到另一个附件 
text=""" 
   <html> 
   <body> 
   <img src='cid:img' tittle='I am  pig'> 
   </body> 
   </html> 
""" 
msg4.attach(MIMEText(text, 'html', 'utf-8')) #将html插入到附件中 
ff=open('2.jpg','rb') 
img = MIMEImage(ff.read())  #将图片读取到附件中 
ff.close() 
img.add_header('Content-ID','<img>') #添加图片头部 
msg3.attach(img)   #将图片添加到附件 
sm.sendmail('2091500484@qq.com','hwhrr123321@163.com',msg3.as_string()) #发送 
sm.quit() 
可以看出,过程还是比较复杂的,比单纯附件添加图片麻烦点,主要是嵌套了一层附件结构。

2.将图片引入到附件中
这个比较好实现。如图:

三、文件
在发送文件前,我们要考虑的一个问题是,我们读取它要以二进制的形式,然后再将它添加到附件中,搞懂了这个就好办了。
1.读取文件
这里我们需要构造一个base64的一个数据流读取文件:
msg6=MIMEMultipart()
txt=MIMEText(open('fd.txt','rb').read(), 'base64', 'utf-8')
2.设置传输类型
txt["Content-Type"] = 'application/octet-stream'
3.设置附件名称
txt["Content-Disposition"] = 'attachment; filename = "fd.txt" '
4.将文件添加到附件中
msg6.attach(txt)
最后就成功将文件添加到了附件中了。

项目总结
以上便是我对邮件发送的所有感悟了,另外如果你想将邮件传输时的过程直观展示出来的话只需在邮件服务器登陆的前一句加上:
sm.set_debuglevel(1)
这样便可以将所有传输过程打印在终端了。通过对邮件的学习,可以极大地便利我们的生活,你可以使用邮件来给你设置一个计划表,通过程序实现,每天按时发送邮件,是不是很高逼格了,希望今天这篇文章能让大家对邮件有个全新的认识。
本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理
想要获取更多Python学习资料可以加
QQ:2955637827私聊
或加Q群630390733
大家一起来学习讨论吧!
手把手教你使用Python轻松搞定发邮件的更多相关文章
- 手把手教你学Numpy,搞定数据处理——收官篇
		
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Numpy专题第6篇文章,我们一起来看看Numpy库当中剩余的部分. 数组的持久化 在我们做机器学习模型的研究或者是学习的时候,在完成 ...
 - 20 行代码:Serverless 架构下用 Python 轻松搞定图像分类和预测
		
作者 | 江昱 前言 图像分类是人工智能领域的一个热门话题.通俗解释就是,根据各自在图像信息中所反映的不同特征,把不同类别的目标区分开来的图像处理方法. 它利用计算机对图像进行定量分析,把图像或图像中 ...
 - Python高级特性: 12步轻松搞定Python装饰器
		
12步轻松搞定Python装饰器 通过 Python 装饰器实现DRY(不重复代码)原则: http://python.jobbole.com/84151/ 基本上一开始很难搞定python的装 ...
 - 手把手教你吧Python应用到实际开发 不再空谈悟法☝☝☝
		
手把手教你吧Python应用到实际开发 不再空谈悟法☝☝☝ 想用python做机器学习吗,是不是在为从哪开始挠头?这里我假定你是新手,这篇文章里咱们一起用Python完成第一个机器学习项目.我会手把手 ...
 - 基于 CODING 轻松搞定持续集成
		
点击观看视频教程 带你一步一步搞定 CODING 持续集成 持续集成加速软件交付 持续集成这个概念是由 Grady Booch 在 1991 年首次提出,随后成为了 DevOps 的核心实践之一.持续 ...
 - 春节过后就是金三银四求职季,分享几个Java面试妙招,轻松搞定HR!
		
春节过后就是金三银四,分享几个Java面试妙招,轻松搞定HR! 2020年了,先祝大家新年快乐! 今年IT职位依然相当热门,特别是Java开发岗位.软件开发人才在今年将有大量的就业机会.春节过后,金三 ...
 - 盘它!基于CANN的辅助驾驶AI实战案例,轻松搞定车辆检测和车距计算!
		
摘要:基于昇腾AI异构计算架构CANN(Compute Architecture for Neural Networks)的简易版辅助驾驶AI应用,具备车辆检测.车距计算等基本功能,作为辅助驾驶入门级 ...
 - 【转】轻松搞定FTP之FlashFxp全攻略
		
转载网址:http://www.newhua.com/2008/0603/39163.shtml 轻松搞定FTP之FlashFxp全攻略 导读: FlashFXP是一款功能强大的FXP/FTP软件,融 ...
 - 轻松搞定javascript变量(闭包,预解析机制,变量在内存的分配 )
		
变量: 存储数据的容器 1.声明 var 2.作用域 全局变量. 局部变量. 闭包(相对的全局变量): 3.类型 a.基本类型(undefi ...
 
随机推荐
- 2020 CSP-J 多校赛 Day 2 T2 题解
			
0x01 引入 在考场时想了一个错误算法,口胡一下,或许对理解正解有点帮助. 我们考虑交换两个数产生的代价,你会发现我们需要让大的数重复被交换的次数尽可能少,减少它对后面的代价. 那么不难构思出一个按 ...
 - C语言新手入门
			
include<stdio.h> int main() { //输入一个数 输出它的反序列 c int a,b=0; scanf("%d",&a);//输入一个 ...
 - jstack测试
			
1.RUNABLE 2.BLOCKED 3.WAITING/TIMED_WAITING Reference Handler线程与Finalizer线程,这两个线程用于虚拟机处理override了obj ...
 - LaTeX中的数学公式之矩阵
			
矩阵的代码及注释: 显示效果:
 - eNSP VLAN划分基础配置及Access接口
			
交换机内实现VLAN通信拓扑图: 一.修改主机名并保存 1.进入系统视图模式(配置模式) <Huawei>system-view 2.sysname命令修改主机名为yanyuda [Hua ...
 - Java 关于策略模式+简单工厂模式下的思考
			
导读 最近在做公司一个消息网关的服务,包括:短信.微信.邮件等,所有请求通过一个入口,方便接口的管理(记录日志.接口限流白名单啥的).如何写这个接口呢,还有为了以后扩展,对接过短信.微信.公众号的童鞋 ...
 - 关于你天天见到的JDK、JRE和JVM
			
什么是JDK.JRE.JVM? 大家都知道电脑的操作系统是由汇编和C语言写出,因此操作系统无法直接识别其他语言.这时我们就需要为我们写的Java程序配备一名翻译官 ----- 编译环境,将Java程序 ...
 - Centos7安装Kubernetes k8s v1.16.0 国内环境
			
一. 为什么是k8s v1.16.0? 最新版的v1.16.2试过了,一直无法安装完成,安装到kubeadm init那一步执行后,报了很多错,如:node xxx not found等.centos ...
 - day3(axios封装)
			
1. 始vue化项目 https://www.cnblogs.com/xiaonq/p/11027880.html vue init webpack deaxios # 使用脚手架创建项目 d ...
 - 5.3 Spring5源码--Spring AOP使用接口方式实现
			
Spring 提供了很多的实现AOP的方式:Spring 接口方式,schema配置方式和注解. 本文重点介绍Spring使用接口方式实现AOP. 使用接口方式实现AOP以了解为目的. 更好地理解动态 ...