Python 实现邮件发送功能(进阶)
上篇文章已经介绍了利用Python发送文本消息的用法,也在文末遗留了如何发送图片和附件的问题,本章主要来回答这两个问题。
本章主要包含知识点:
1. 如何将图片放到邮件主体中发送
2. 如何发送附件
问题一: 如何将图片放在邮件主体中发送
从上篇中应该都已知道,其实发送邮件,就是发送Html格式的字符串,那么发送图片时,可不可以也放到html中去呢?答案是肯定的,但是html中有一个指定图片的地址或来源,那么邮件中该指向何处呢?答案是附件。
根据这个思路,在发送文本的代码上进行一个优化,先上代码:
class Email4Pic(Email):
'''
入参为filenames 即图片列表,即可以一次发送多张图片
'''
def __init__(self, filenames : list):
super(Email4Pic, self).__init__()
self.filenames = filenames def message_init(self, html):
message = MIMEMultipart()
message['subject'] = Header(self.subject, 'utf-8')
message['From'] = self.sender
message['To'] = ', '.join(self.receiver)
message['Cc'] = ', '.join(self.cc) # 解决乱码, html是html格式的str
message_context = MIMEText(html, _subtype='html', _charset='utf-8') # 邮件正文内容
message.attach(message_context) # 邮件加入图片
cid = 0
for filename in self.filenames:
m_file = MIMEBase('image','jpg')
m_file.add_header('Content-Disposition', 'attachment') # 将图片放进附件
m_file.add_header('Content-ID', '<' + str(cid) + '>') # 设置图片id f = open(filename, 'rb')
m_file.set_payload(f.read())
encoders.encode_base64(m_file)
message.attach(m_file)
cid += 1
return message if __name__ == '__main__':
print('start……') pic1 = "C:\\Users\\Administrator\\Pictures\\Python.png"
pic2 = "C:\\Users\\Administrator\\Pictures\\IMG_9676.jpg"
pics = []
pics.append(pic1)
pics.append(pic2) sendpic = Email4Pic(pics) sendpic.smtp = 'smtp.163.com'
sendpic.username = 'wjian.coming@163.com'
sendpic.password = 'passwd'
sendpic.subject = 'Test/测试邮件'
sendpic.sender = 'wjian.coming@163.com'
sendpic.receiver.append('948001879@qq.com')
sendpic.cc.append('948001879@qq.com') strs = '''<span>This is the first picture</span><br> <img src='cid:0'><br>
<span>This is the Second picture</span><br> <img src='cid:1'>''' sendpic.send_email(strs) print('end')
没错!发送图片即在原来的父类上做了个子类,并复用了父类中的属性和部分方法(send_email),并在message_init方法基础上添加了图片处理的一些逻辑。
第6行:即继承父类的属性
第25~32行:将图片放进附件缓存中,并将每个图片标记ID,再读取后放入邮件主体文本中
第55~56行:此字符串就是即将发送的html格式文件,其中 <img src='cid:0'> 即读取编号为0的图片,从附件缓存中读取的,作为html文件的图片来源
第58行:调用父类的send_email方法,发送邮件
如上执行后,我们看下发送后的效果(图片2太大,没有完全截图出来)。
这样就可以理解,只要编辑好Html就可以发送任意内容啦~

问题二: 如何发送附件
这时,又有人出来问了,你这是两张图片,那要是100张呢,那不得用附件形式才更合理? 这正是接下来准备讲的,如何发送附件呢?
同样,有了上面的经验,我们也写一个子类,只不过这次只要将文件读入附件即可,不需要写到邮件主体中,代码如下:
class Email4Attr(Email):
'''
入参为filenames 即文件列表,即可以一次发送多个附件
'''
def __init__(self, filenames : list):
super(Email4Attr, self).__init__()
self.filenames = filenames def message_init(self, html):
message = MIMEMultipart()
message['subject'] = Header(self.subject, 'utf-8')
message['From'] = self.sender
message['To'] = ', '.join(self.receiver)
message['Cc'] = ', '.join(self.cc) # 解决乱码, html是html格式的str
message_context = MIMEText(html, _subtype='html', _charset='utf-8') # 邮件正文内容
message.attach(message_context) # 邮件加入图片
for filename in self.filenames:
name = os.path.split(filename)[-1] # 从绝对路径中取出文件名
m_file = MIMEBase('image','jpg')
m_file.add_header('Content-Disposition', 'attachment', filename = name) # 将文件放入附件
f = open(filename, 'rb') m_file.set_payload(f.read())
encoders.encode_base64(m_file)
message.attach(m_file)
return message if __name__ == '__main__':
print('start……') pic1 = "C:\\Users\\Administrator\\Pictures\\Python.png"
pic2 = "C:\\Users\\Administrator\\Pictures\\IMG_9676.jpg"
pics = []
pics.append(pic1)
pics.append(pic2) sendAtt = Email4Attr(pics) sendAtt.smtp = 'smtp.163.com'
sendAtt.username = 'wjian.coming@163.com'
sendAtt.password = 'passwd'
sendAtt.subject = 'Test/测试邮件'
sendAtt.sender = 'wjian.coming@163.com'
sendAtt.receiver.append('948001879@qq.com')
sendAtt.cc.append('948001879@qq.com') strs = 'Please check the attachment '
sendAtt.send_email(strs) print('end')
可以看出,与图片不同的地方就是处理内容的方式不同,一个是放在附件中,并标记ID由主体内容读取,一个是直接放到附件中。
第26行:将文件写入附件中,利用filename这个关键属性命名附件
如上执行后,我们看下发送后的效果,此时两个图片已经被放进了附件中。对于文件类型的附件,都是一样处理,直接按规则调用就行了,这里就不再示例,有兴趣的伙伴可以自己下来试试呢。

综上,对于邮件的发送只要按照指定的框架即可轻松定制,这里只是做了个指引和参考,如果您有更好的想法,或更难的挑战,不妨评论区留言,我们来互相交流一下啊。
(希望我的文章能够助你一臂之力,成就更辉煌的你,关注我,我们一起进步)
Python 实现邮件发送功能(进阶)的更多相关文章
- Python 实现邮件发送功能(初级)
在我们日常项目中,会经常使用到邮件的发送功能,如何利用Python发送邮件也是一项必备的技能.本文主要讲述利用Python来发送邮件的一些基本操作. 本章主要包含知识点: 邮件发送原理简述即常用smt ...
- Python 基于Python实现邮件发送
基于Python实现邮件发送 by:授客 QQ:1033553122 测试环境: Python版本:Python 2.7 注:需要修改mimetypes.py文件(该文件可通过文章底部的网盘分 ...
- .NET开发邮件发送功能的全面教程(含邮件组件源码)
今天,给大家分享的是如何在.NET平台中开发“邮件发送”功能.在网上搜的到的各种资料一般都介绍的比较简单,那今天我想比较细的整理介绍下: 1) 邮件基础理论知识 2) ...
- 用ASP.NET Core 1.0中实现邮件发送功能-阿里云邮件推送篇
在上篇中用MailKit实现了Asp.net core 邮件发送功能,但一直未解决阿里云邮件推送问题,提交工单一开始的回复不尽如人意,比如您的网络问题,您的用户名密码不正确等,但继续沟通下阿里云客户还 ...
- redmine邮件发送功能配置详解
redmine的邮件发送功能还是很有用的.像项目有更新啦,任务分配啦,都能邮件发送的相关责任人.我自己在linux服务器上安装并启动了redmine后,邮件一直发送了不了.查了网上的资料,都是讲修改下 ...
- .NET开发邮件发送功能
.NET开发邮件发送功能 今天,给大家分享的是如何在.NET平台中开发“邮件发送”功能.在网上搜的到的各种资料一般都介绍的比较简单,那今天我想比较细的整理介绍下: 1) 邮件基础理论知 ...
- shell邮件发送功能实现
本文中以163邮箱为例,测试shell邮件发送功能.常见的工具有:mailx.sendmail.mutt等. 1.设置邮件客户端 (1)启用pop3.smtp服务,以支持第三方客户端支持 (2)设置授 ...
- 用Python实现邮件发送Hive明细数据
代码地址如下:http://www.demodashi.com/demo/12673.html 一.需求描述 客户需要每周周一接收特定的活动数据,生成Excel或是CSV文件,并通过邮件发送给指定接收 ...
- SpringBoot 2.X从0到1实现邮件发送功能
Spring中提供了JavaMailSender接口实现邮件发送功能,在SpringBoot2.X中也封装了发送邮件相关的Starter并且提供了自动化配置. 本文目录 一.添加对应的Starter二 ...
随机推荐
- APP移动端测试
重点: app测试的内容 add 命令 monkey命令 次重点:模拟器的安装 雷电 夜神 android 自带的模拟器 真机测试 简单了解云测Testing 腾讯云() 了解:市场有点移动端的操 ...
- Shiro实战教程-刘志敏-专题视频课程
Shiro实战教程-62人已学习 课程介绍 本教程只介绍基本的 Shiro 使用,不会过多分析源码等,重在使用. 适用人群: 1.了解基于Servlet进行Web应用开发 2.了解Spr ...
- JAVA SOCKET 通信总结 BIO、NIO、AIO ( NIO 2) 的区别和总结
1 同步 指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪 自己上街买衣服,自己亲自干这件事,别的事干不了.2 异步 异步是指用户进程触发IO操作以后便开始做自己的事情,而当IO操作已 ...
- HttpClient优化
HttpClient优化思路: 1.池化 2.长连接 3.httpclient和httpget复用 4.合理的配置参数(最大并发请求数,各种超时时间,重试次数) 5.异步 6.多读源码 1.背景我们有 ...
- es性能调优---写优化操作
ES 的默认配置,是综合了数据可靠性.写入速度.搜索实时性等因素.实际使用时,我们需要根据公司要求,进行偏向性的优化. 写优化 假设我们的应用场景要求是,每秒 300 万的写入速度,每条 500 字节 ...
- 深入理解React:事件机制原理
目录 序言 DOM事件流 事件捕获阶段.处于目标阶段.事件冒泡阶段 addEventListener 方法 React 事件概述 事件注册 document 上注册 回调函数存储 事件分发 小结 参考 ...
- Python3-shelve模块-持久化字典
Python3中的shelve提供了持久化字典对象 和字典基本一个样,只不过数据保存在了文件中,没什么好说的,直接上代码 注: 1.打开文件后不要忘记关闭文件 2.键只能是字符串,值可以是任何值 3. ...
- soapUI使用小结(一)
本篇博客是照搬虫师的<Web接口开发与自动化测试>一书的soapUI测试工具一节 以及博文http://blog.csdn.net/a19881029/article/details/26 ...
- express高效入门教程(2)
2.请求和响应 2.1.请求相关 2.1.1.返回一个html页面 // 注意path模块需要先引入 app.get('/', function (req, res){ res.sendFile(pa ...
- C# 从1到Core--委托与事件
委托与事件在C#1.0的时候就有了,随着C#版本的不断更新,有些写法和功能也在不断改变.本文温故一下这些改变,以及在NET Core中关于事件的一点改变. 一.C#1.0 从委托开始 1. 基本方式 ...