Python实现发送邮件的功能(进阶)

  上篇文章已经介绍了利用Python发送文本消息的用法,也在文末遗留了如何发送图片和附件的问题,本章主要来回答这两个问题。

本文主要包含知识点:

  1. 如何发送图片

  2. 如何发送普通附件

问题一: 如何发送图片

    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

  综上,对于邮件的发送方法已基本实现,那么问题来了,当你发送测试报告的时候当然需要发送多个文件,像这样单独一个文件一个文件添加到附件就不太切实际,这样就需要我们发送一个压缩包,怎么压缩文件呢?关注我,下期为你解答。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值