手把手教你使用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 ...
随机推荐
- Kafka 内存管理类BufferPool
基本上每个成熟的框架或者工具都有一套内存管理机制 BufferPool 是Kafka 用来管理内存的工具类 BufferPool内存管理包含2个部分,已用空间+可用空间(未申请空间+ ...
- 【模板】【P3605】【USACO17JAN】Promotion Counting 晋升者计数——动态开点和线段树合并(树状数组/主席树)
(题面来自Luogu) 题目描述 奶牛们又一次试图创建一家创业公司,还是没有从过去的经验中吸取教训--牛是可怕的管理者! 为了方便,把奶牛从 1⋯N(1≤N≤100,000) 编号,把公司组织成一棵树 ...
- Matlab 数值计算
本博客记录一些简单的计算 det(A):矩阵求行列式 A=[1,2;3,4]; det(A) ans=-2; inv(A):矩阵求逆 A=[1,2;3,4]; B=inv(A) B=[-2,1;1,5 ...
- Java蓝桥杯——递归练习题:走台阶(偶数版)
递归练习题:走台阶(偶数版) 小明刚刚看完电影<第39级台阶>.离开电影院的时候,他数了数礼堂前的台阶数,恰好是39级! 站在台阶前,他突然又想着一个问题: 如果我每一步只能迈上1个或2个 ...
- 拿到这份 Java、C++ 软件开发完整学习路线图,我面试再也没挂过..
大家好,我是柠檬. 柠檬哥作为一个普通大学.非计算机专业,自学后端技术进入腾讯做后端开发工作,我自己也是非科班自学计算机成功转行软件开发(有想听柠檬哥转行之路经历的吗,可以留言告诉我,人多就写写),体 ...
- arthas监控elasticsearch(7.x)
arthas介绍 arthas是Alibaba推出的java诊断工具 官方文档 准备 准备docker环境 name port centos_arthas 3658:3658 docker run - ...
- 上传视频到七牛云Django后端实现
1.上传视频到七牛云django端实现 1.1 获取七牛云秘钥 https://portal.qiniu.com/user/key 1.2 在syl/settings.py中配置七牛云上传 参考官方 ...
- ActionResult的返回类型
ActionResult是控制器方法执行后返回的结果类型,控制器方法可以返回一个直接或间接从ActionResult抽象类继承的类型,如果返回的是非ActionResult类型,控制器将会将结果转换为 ...
- Python-Wechaty: 面向所有IM软件的聊天机器人框架
Author: wj-Mcat Code: python-wechaty 个人开发项目,且行且不易,有感兴趣的朋友可以去给一波关注,你们的支持就是我最大的动力,谢谢大家. Python-wechaty ...
- Scrum 冲刺 第三篇
Scrum 冲刺 第三篇 每日会议照片 昨天已完成工作 队员 昨日完成任务 黄梓浩 继续完成app项目架构搭建 黄清山 完成部分个人界面模块数据库的接口 邓富荣 完成部分后台首页模块数据库的接口 钟俊 ...