使用Python自动发送邮件-添加将图片插入正文

import smtplib
# 负责构造文本
from email.mime.text import MIMEText
# 负责构造图片
from email.mime.image import MIMEImage
# 负责将多个对象集合起来
from email.mime.multipart import MIMEMultipart
from email.header import Header
import os,sys
BASE_PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, BASE_PATH)
import configparser
cf = configparser.ConfigParser()
cf.read(os.path.join(BASE_PATH, 'doc/config.ini'))
sender_dict = dict(cf.items('sender-config'))
recivers_dict = dict(cf.items('recivers-config'))


class Mail(object):
    def __init__(self):
        self.mail_host = sender_dict['host']  # SMTP服务器
        self.port = int(sender_dict['port']) # 端口号
        self.mail_sender = sender_dict['sender']  # 发件人邮箱
        self.mail_license = sender_dict['pwd']  # 授权密码
        self.mail_receivers = [v for k, v in recivers_dict.items() if 'reciver' in k]  # 收件人邮箱,可以为多个收件人
    def send(self,subject,body_content,attachs,pics):
        '''
        :param subject: str,邮件主题
        :param body_content: str,邮件正文
        :param attachs: list,附件地址
        :param pics: list,图片地址
        :return: 发送邮件
        '''
        mm = MIMEMultipart('related')# 构建MIMEMultipart对象代表邮件本身,可以往里面添加文本、图片、附件等
        # 设置发送者,注意严格遵守格式,里面邮箱为发件人邮箱
        mm["From"] = self.mail_sender
        # 设置接受者,注意严格遵守格式,里面邮箱为接受者邮箱
        mm["To"] = ','.join(self.mail_receivers)
        # 1. 设置邮件头部内容
        mm["Subject"] = Header(subject, 'utf-8')
        # 2. 添加正文内容
        body_footer = '<p style="color:red">此邮件为系统自动发送,请勿在此邮件上直接回复,谢谢~</p>'
        # 3. 添加附件
        for attach_file in attachs:
            with open(attach_file, 'rb') as file_info:
                atta = MIMEText(file_info.read(), 'base64', 'utf-8')
                atta.add_header('Content-Disposition', 'attachment', filename=('utf-8', '', os.path.basename(attach_file)))
                # 添加附件到邮件信息当中去
                mm.attach(atta)
        # 4. 添加图片到附件
        for pic_file in pics:
            with open(pic_file,'rb') as image:
                image_info = MIMEImage(image.read())
                image_info.add_header('Content-Disposition', 'attachment', filename=('utf-8', '', os.path.basename(pic_file)))
                mm.attach(image_info)
        # 5. 添加图片到正文
        pic_inline = '<p> 图片展示:</p>'
        for index,pic_file in enumerate(pics):
            pic_file_name = os.path.basename(pic_file)
            with open(pic_file,'rb') as image:
                image_info = MIMEImage(image.read())
                image_info.add_header('Content-Id',f'<image{index+1}>')
                mm.attach(image_info)
                tmp_pic_inline = f'''
                    <!-- <br>这是一段对图片进行描述的文本 {pic_file_name}:</br> -->
                    <br><img src="cid:image{index+1}" width="300" alt={pic_file_name}></br>
                    '''
                pic_inline += tmp_pic_inline
        mm.attach(MIMEText(body_content + pic_inline + body_footer, "html", "utf-8"))
        # 创建SMTP对象
        stp = smtplib.SMTP(self.mail_host)
        # 设置发件人邮箱的域名和端口
        stp.connect(self.mail_host, self.port)
        # set_debuglevel(1)可以打印出和SMTP服务器交互的所有信息
        # stp.set_debuglevel(1)
        stp.starttls()
        # 登录邮箱,传递参数1:邮箱地址,参数2:邮箱授权码
        stp.login(self.mail_sender,self.mail_license)
        # 发送邮件,传递参数1:发件人邮箱地址,参数2:收件人邮箱地址,参数3:把邮件内容格式改为str
        stp.sendmail(self.mail_sender, self.mail_receivers, mm.as_string())
        print("邮件发送成功")
        # 关闭SMTP对象
        stp.quit()

if __name__ == '__main__':
    subject = """Python邮件测试"""
    body_content = """
    <h1>这是一封测试邮件 - 1级标题</h1>
    <h2>这是一封测试邮件 - 2级标题</h2>
    <h3>这是一封测试邮件 - 3级标题</h3>
    """
    attachs = [f'{BASE_PATH}/doc/attach1.txt',f'{BASE_PATH}/doc/attach2.xlsx']
    pics = [f'{BASE_PATH}/doc/pic1.jpg',f'{BASE_PATH}/doc/pic2.png']
    Mail().send(subject,body_content,attachs,pics)

在这里插入图片描述

  • 1
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值