Advertisement

【进阶】自动化发送邮件(包含图片/html报告等附件)

阅读量:

目录

流程:

步骤:

【重点】

【MIMEText--发送文本类型的邮件】

【MIMEImage-发送附件为图片的邮件】

【MIMEBase--发送附件为html报告的邮件】


以qq邮箱为例,提前打开POP3/IMAP/SMTP/Exchange/CardDAV 服务 ,并获取授权码 *

账号与安全--->安全设置--->POP3/IMAP/SMTP/Exchange/CardDAV 服务

授权码不是qq密码

163邮箱不需要授权码,账号和密码就ok

密码失败的话,就换授权码_

需要用到smtplib 模块、email 模块,python内置模块,不需要下载

smtplib用于发送邮件,email用于编写邮件内容

邮箱登录后可以给任意邮箱发送邮件(qq可以发给163,qq等)

抄送邮件(发送同一邮件到多人),传收件人参数时,用英文分号隔开,如:'xiaoming@xx.com;xiaohong@xx.com'

流程:

连接邮箱服务器

登录邮箱

准备邮件数据

添加邮件数据到邮件对象

发送邮件

步骤:

导包

定义发送邮件的方法,需传参数(发送人邮箱、授权码、收件人邮箱、标题/主题、主体内容、附件路径)

创建邮件(MIMEMultipart)对象

构建邮件头部显示样式

复制代码
1. ![](https://ad.itadn.com/c/weblog/blog-img/images/2025-04-04/69cvK345Hj7m2xa8osE0ZGkSfUyp.png)
2. 

包括--标题/主题、发件人、收件人(时间是自动生成的,无需设置)

根据不同正文内容类型,构建不同email对象,设置文件主体内容(正文)

连接邮箱服务器,SMTP_SSL协议(安全邮件传输协议),传参服务器地址、端口号

登录、发送邮件

【重点】

根据发送的不同类型文件构建不同邮件对象

掌握步骤后,发送任何形式的邮件,都可套用步骤,只需修改正文内容,也就是构建不同的邮件对象

【MIMEText--发送文本类型的邮件】

语法:MIMEText(文字内容,文本类型,编码方式)

文字内容:普通文本就是’文字内容‘,超链接文本三对双引号包裹起来的html语言,二进制文本则为路径

文本类型:普通文本(plain),超文本(html),二进制文本--附件为txt,html,xlsx等(base64)

连接邮箱服务器,SMTP_SSL协议(安全邮件传输协议),传参服务器地址、端口号

服务器地址:'smtp.qq.com' ,qq可替换为其他使用邮箱,如:'smtp.163.com'等 端口号:465/25,用于区分服务器下的不同服务 使用with...as可避免忘记关闭链接对象

发送文本类型为普通文本的内容

复制代码
        1.  # 第一步 :导包

    
        2.  import smtplib
    
        3.  ​
    
        4.  # 发文本类型的文件所用到的模块
    
        5.  from email.mime.text import MIMEText
    
        6.  # 创建邮件对象(真正被发送的对象)所需要的模块
    
        7.  from email.mime.multipart import MIMEMultipart
    
        8.  # 定义邮件主题所用到的模块
    
        9.  from email.header import Header
    
        10.  ​
    
        11.  ​
    
        12.  def send_email(from_email, pass_code, to_email, title, email_body):
    
        13.      '''
    
        14.      第二步 :定义发送邮件的方法
    
        15.      :param from_email: 发件人邮箱
    
        16.      :param pass_code: 发件人邮箱的授权码(163邮箱是密码)
    
        17.      :param to_email: 收件人邮箱
    
        18.      :param title: 邮件标题
    
        19.      :param email_body: 邮件正文
    
        20.      :return: 无
    
        21.      '''
    
        22.      # 第三步 :创建邮件对象
    
        23.      msg = MIMEMultipart()
    
        24.      
    
        25.      # 第四步 : 构建邮件头部显示样式
    
        26.      #       设置邮件主题---语法:Header(主题/标题,编码格式)
    
        27.      #       设置主题后,对其进行二进制编码
    
        28.      subject = Header(title, 'utf-8').encode()
    
        29.      msg['Subject'] = subject
    
        30.      # 设置邮件发件人
    
        31.      msg['From'] = from_email
    
        32.      # 设置收件人
    
        33.      msg['To'] = to_email
    
        34.      
    
        35.      # 第五步 : 设置邮件主体内容---文本类型
    
        36.      #   语法:MIMEText(文字内容,文本类型,编码方式)
    
        37.      #   文本类型:普通文本(plain),超文本(html),二进制文本(附件为文本文件.txt等 base64)
    
        38.      body = MIMEText(email_body, 'plain', 'utf-8')
    
        39.      # 将主体添加到邮件中
    
        40.      msg.attach(body)
    
        41.  ​
    
        42.      # 第六步 : 连接邮箱服务器,SMTP_SSL协议(安全邮件传输协议),传参服务器地址、端口号
    
        43.      #       服务器地址 :'smtp.qq.com' qq可替换为其他使用邮箱,如:'smtp.163.com'等
    
        44.      #       端口号 :465/25,用于区分服务器下的不同服务
    
        45.      # 使用with...as可避免忘记关闭连接对象
    
        46.      with smtplib.SMTP_SSL('smtp.qq.com', 465) as smtp:
    
        47.          # 第七步 : 登录
    
        48.          smtp.login(from_email, pass_code)
    
        49.          # 发送邮件
    
        50.          smtp.send_message(msg)
    
        51.          
    
        52.  if __name__ == '__main__':
    
        53.      send_email('发件人邮箱','发件人邮箱授权码','收件人邮箱','主题','正文')
    
    AI写代码

发送文本类型为超链接的内容

复制代码
        1.  # 发送文本类型为超链接的文本

    
        2.  import smtplib
    
        3.  ​
    
        4.  from email.header import Header
    
        5.  from email.mime.text import MIMEText
    
        6.  from email.mime.multipart import MIMEMultipart
    
        7.  ​
    
        8.  def send_email(from_email, pass_code, to_email, title, email_body):
    
        9.      '''
    
        10.      第一步:定义发送邮件的方法
    
        11.      :param from_email: 发件人邮箱
    
        12.      :param pass_code: 发件人邮箱的授权码(163邮箱就是密码)
    
        13.      :param to_email: 收件人邮箱
    
        14.      :param title: 邮件标题
    
        15.      :param email_body: 邮件正文
    
        16.      :return: 无
    
        17.      '''
    
        18.      msg = MIMEMultipart()
    
        19.  ​
    
        20.      subject = Header(title, 'utf-8').encode()
    
        21.      msg['Subject'] = subject
    
        22.      msg['From'] = from_email
    
        23.      msg['To'] = to_email
    
        24.  ​
    
        25.      body = MIMEText(email_body, 'html', 'utf-8')
    
        26.      msg.attach(body)
    
        27.  ​
    
        28.      with smtplib.SMTP_SSL('smtp.qq.com', 465) as smtp:
    
        29.          smtp.login(from_email, pass_code)
    
        30.          smtp.sendmail(from_email, to_email, msg.as_string())
    
        31.  ​
    
        32.  ​
    
        33.  if __name__ == '__main__':
    
        34.      send_email('发件人@qq.com', '授权码', '收件人@qq.com', '发送html格式的文本邮件', """
    
        35.      <img src="https://www.baidu.com/img/flexible/logo/pc/result.png">
    
        36.      <a href="https://www.baidu.com/">点我去百度</a>
    
        37.      """)
    
    AI写代码

效果如下图:

复制代码
* ![](https://ad.itadn.com/c/weblog/blog-img/images/2025-04-04/glGQUZqcwzLuYVop9e1bAB5dSI4W.png)

发送文本类型为二进制的内容,以.html为例

设置附件名称时,后缀要与源文件保持一致

复制代码
        1.  import smtplib

    
        2.  ​
    
        3.  from email.header import Header
    
        4.  from email.mime.text import MIMEText
    
        5.  from email.mime.multipart import MIMEMultipart
    
        6.  ​
    
        7.  ​
    
        8.  def send_email(from_email, pass_code, to_email, title, email_body):
    
        9.      '''
    
        10.      第一步:定义发送邮件的方法
    
        11.      :param from_email: 发件人邮箱
    
        12.      :param pass_code: 发件人邮箱的授权码(163邮箱就是密码)
    
        13.      :param to_email: 收件人邮箱
    
        14.      :param title: 邮件标题
    
        15.      :param email_body: 邮件正文
    
        16.      :return: 无
    
        17.      '''
    
        18.      msg = MIMEMultipart()
    
        19.  ​
    
        20.      subject = Header(title, 'utf-8').encode()
    
        21.      msg['Subject'] = subject
    
        22.      msg['From'] = from_email
    
        23.      msg['To'] = to_email
    
        24.      file_content = open(email_body, 'rb').read()
    
        25.      body = MIMEText(file_content, 'base64', 'utf-8')
    
        26.      # 设置附件名称---附件名称须为英文,中文会乱码
    
        27.      body['Content-Disposition'] = 'attachment; filename="test.html"'
    
        28.      msg.attach(body)
    
        29.  ​
    
        30.      with smtplib.SMTP_SSL('smtp.qq.com', 465) as smtp:
    
        31.          smtp.login(from_email, pass_code)
    
        32.          smtp.sendmail(from_email, to_email, msg.as_string())
    
        33.  ​
    
        34.  ​
    
        35.  if __name__ == '__main__':
    
        36.      send_email('发件人@qq.com', '授权码', '收件人@qq.com', '发送html格式的文本邮件',
    
        37.                 r'路径\test.html')
    
    AI写代码
【MIMEImage-发送附件为图片的邮件】

与发送文本的流程、步骤均一致,构建邮件对象发生了变化

获取图片内容,创建邮件图片对象---MIMEImage(),传参图片的二进制数据 ,通过open('path',mode='rb')获取图片二进制

设置附件名称 ---除了文件名称外,其余都是固定名称,附件名称须为英文

图片路径可加r转义符

复制代码
        1.  import smtplib

    
        2.  ​
    
        3.  from email.header import Header
    
        4.  from email.mime.text import MIMEText
    
        5.  from email.mime.multipart import MIMEMultipart
    
        6.  ​
    
        7.  def send_email(from_email, pass_code, to_email, title, email_body):
    
        8.      '''
    
        9.      第一步:定义发送邮件的方法
    
        10.      :param from_email: 发件人邮箱
    
        11.      :param pass_code: 发件人邮箱的授权码(163邮箱就是密码)
    
        12.      :param to_email: 收件人邮箱
    
        13.      :param title: 邮件标题
    
        14.      :param email_body: 邮件正文
    
        15.      :return: 无
    
        16.      '''
    
        17.      msg = MIMEMultipart()
    
        18.  ​
    
        19.      subject = Header(title, 'utf-8').encode()
    
        20.      msg['Subject'] = subject
    
        21.      msg['From'] = from_email
    
        22.      msg['To'] = to_email
    
        23.  ​
    
        24.      body = MIMEImage(open(email_body, mode='rb').read())
    
        25.      # 设置附件名称---附件名称须为英文,中文会乱码
    
        26.      body['Content-Disposition'] = 'attachment; filename="englishName.png"'
    
        27.      msg.attach(body)
    
        28.  ​
    
        29.      with smtplib.SMTP_SSL('smtp.qq.com', 465) as smtp:
    
        30.          smtp.login(from_email, pass_code)
    
        31.          smtp.sendmail(from_email, to_email, msg.as_string())
    
        32.  ​
    
        33.  ​
    
        34.  if __name__ == '__main__':
    
        35.      send_email('发件人@qq.com', '授权码', '收件人@qq.com', '发送html格式的文本邮件',  r'路径\01.png')
    
    AI写代码
【MIMEBase--发送附件为html报告的邮件】

近似MIMEText的'base64'

可发送.html/.xlsx/.doc等

body = MIMEBase('application', 'octet-stream')

复制代码
        1.  import smtplib

    
        2.  ​
    
        3.  from email.mime.multipart import MIMEMultipart
    
        4.  from email.mime.base import MIMEBase
    
        5.  # 用于编码
    
        6.  from email import encoders
    
        7.  # 定义邮件主题
    
        8.  from email.header import Header
    
        9.  ​
    
        10.  def send_email(from_email, pass_code, to_email, title, email_body):
    
        11.      '''
    
        12.      定义发送邮件的方法
    
        13.      :param from_email: 发件人邮箱
    
        14.      :param pass_code: 发件人邮箱的授权码(163邮箱就是密码)
    
        15.      :param to_email: 收件人邮箱
    
        16.      :param title: 邮件标题
    
        17.      :param email_body: 邮件正文
    
        18.      :return: 无
    
        19.      '''
    
        20.      
    
        21.      msg = MIMEMultipart()
    
        22.      subject = Header(title, 'utf-8').encode()
    
        23.      msg['Subject'] = subject
    
        24.      msg['From'] = from_email
    
        25.      msg['To'] = to_email
    
        26.  ​
    
        27.      body = MIMEBase('application', 'octet-stream')
    
        28.      body.set_payload(open(email_body, mode='rb').read())
    
        29.      encoders.encode_base64(body)
    
        30.      # 附件名称须为英文
    
        31.      body['Content-Disposition'] = 'attachment; filename="test.html"'
    
        32.      # 将主体添加到邮件中
    
        33.      msg.attach(body)
    
        34.  ​
    
        35.      with smtplib.SMTP_SSL('smtp.qq.com', 465) as smtp:
    
        36.          smtp.login(from_email, pass_code)
    
        37.          smtp.sendmail(from_email, to_email, msg.as_string())
    
        38.  ​
    
        39.  ​
    
        40.  if __name__ == '__main__':
    
        41.      send_email('发件人@qq.com', '授权码', '收件人@qq.com', '发送html文件附件邮件', r'路径\test.html')
    
    AI写代码

全部评论 (0)

还没有任何评论哟~