上篇文章已经介绍了利用Python发送文本消息的用法,也在文末遗留了如何发送图片和附件的问题,本章主要来回答这两个问题。
本文主要包含知识点:
-
如何发送图片
-
如何发送普通附件
问题一: 如何发送图片
def attach_picture(self, picture_path, msg):
try:
with open(picture_path, 'rb') as f:
image = f.read()
except Exception as e:
self.logger.error(e)
image_name = picture_path.split('/')[-1]
image_attach = MIMEImage(image)
image_attach.add_header('Content-Disposition', 'attachment', filename=Header(image_name, 'utf-8').encode())
msg.attach(image_attach)
return msg
如上代码是将图片通过附件发送,在上一篇文章中可知发送邮件就是发送html格式的字符串,那么发送图片时,可不可以也放到html中去呢?答案是肯定的,但是html中有一个指定图片的地址或来源,那么邮件中该指向何处呢?答案是附件。
# 发送多张图片,picture_path是一个图片路径列表
def attach_picture(self, picture_path, msg):
cid = 0
for filename in picture_path:
try:
with open(filename, 'rb') as f:
image = f.read()
except Exception as e:
self.logger.error(e)
image_name = filename.split('/')[-1]
image_attach = MIMEImage(image)
image_attach.add_header('Content-Disposition', 'attachment', filename=Header(image_name, 'utf-8').encode()) # 将图片放入附件中
image_attach.add_header('Content-ID', '<' + str(cid) + '>') # 设置图片id
msg.attach(image_attach)
cid += 1
return msg
测试的数据可以写成如下方式:
html = '''<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'>'''
问题二: 如何发送普通附件
def attach_other_file(self, file_path, msg):
# 邮件加入附件
try:
with open(file_path, 'rb') as f:
file = f.read()
except Exception as e:
self.logger.error(e)
file_name = file_path.split('/')[-1] # 从绝对路径中取出文件名
# file_name = os.path.split(filename)[-1] # 从绝对路径中取出文件名
file_attach = MIMEApplication(file)
# 通过filename给附件命名
file_attach.add_header('Content-Disposition', 'attachment', filename=Header(file_name, 'utf-8').encode())
msg.attach(file_attach)
return msg
上面两个问题对应的message_init方法实现方式如下:
def message_init(self, html):
'''
对即将发送的内容进行初始化
:param html: 发送邮件正文内容
:return:
'''
message = MIMEMultipart() # 内容接收池
message['subject'] = Header(self.subject, 'utf-8')
message['From'] = self._format_addr('吴雪情 <%s>' % self.sender)
message['To'] = ', '.join(self.receiver)
message['Cc'] = ', '.join(self.cc)
# 解决乱码,html是html格式的字符串
message_content = MIMEText(html, _subtype='html', _charset='utf-8')
# 邮件的正文内容
message.attach(message_content)
# 注意这里的FILE_PATH里面是单个的文件路径,不涉及多个
if FILE_PATH.endswith('.png') or FILE_PATH.endswith('.jpg'):
# 邮件加入图片
message = self.attach_picture(FILE_PATH, message)
else:
# 邮件加入附件
message = self.attach_other_file(FILE_PATH, message)
return message
综上,对于邮件的发送方法已基本实现,那么问题来了,当你发送测试报告的时候当然需要发送多个文件,像这样单独一个文件一个文件添加到附件就不太切实际,这样就需要我们发送一个压缩包,怎么压缩文件呢?关注我,下期为你解答。