Python封装QQ邮件发送类:支持纯文本、HTML、图片及附件

程一诺
程一诺
发布时间:2026-10-13| 2人浏览过
原创

本文介绍了一个Python实现的QQ邮件发送封装类,支持纯文本、HTML、带本地图片的HTML以及附件发送。通过配置发件人、授权码及收件人,可灵活调用sendQQEmail方法完成各类邮件发送任务,适用于自动化通知、报告生成等场景。

本文分享了一个使用Python编写的QQ邮件发送封装代码示例,供读者参考学习。

以下是核心封装代码的实现部分。

import smtplib
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.header import Header

# type=plain 文本格式 默认
# type=html 网页格式
# type=image 带本地图片的html
# type=file 带附件
# 带图片时,msg为html格式
# 示例:
'''
msg ='<p>Python 邮件发送测试...</p><p>图片演示:</p><p><img src="cid:image1"></p>'
'''

class MyQQEmail:
 __mail_user = '' # 登陆邮箱
 __mail_pass = '' # 邮箱授权码
 __senderName= '' # 发件人
 def __init__(self,user,pas,name) -> None:
  self.__mail_user=user
  self.__mail_pass=pas
  self.__senderName=name

 def sendQQEmail(self,receiver, title, msg, type='plain', filePaths=[], fileNames=[], imagePaths=None):
  if receiver == '':
   return False

  mail_host = 'smtp.qq.com'
  mail_port = 465 # qq smtp端口465
  sender = self.__mail_user

  type = type.lower()
  if type.__eq__('plain') or type.__eq__('html'):
   message = MIMEText(msg, type, 'utf-8')
  elif type.__eq__('file') or type.__eq__('image'):
   message = MIMEMultipart()
  else:
   return False

  try:
   message['From'] = Header(self.__senderName, 'utf-8')
   message['To'] = Header(str(receiver), 'utf-8')
   subject = title
   message['Subject'] = Header(subject, 'utf-8')

   if type.__eq__('file') or type.__eq__('image'):
    # 邮件正文内容
    if imagePaths is not None:
     message.attach(MIMEText(msg, 'html', 'utf-8'))
     # 添加图片
     if imagePaths is not None:
      for index,imagePath in enumerate(imagePaths,1):
       # 指定图片为当前目录
       fp = open(imagePath, 'rb')
       msgImage = MIMEImage(fp.read())
       fp.close()

       # 定义图片 ID,在 HTML 文本中引用
       msgImage.add_header('Content-ID', '<image'+str(index)+'>')
       message.attach(msgImage)
    else:
     message.attach(MIMEText(msg, 'plain', 'utf-8'))
    # 构造附件,传送filePath制定文件
    for filePath, fileName in zip(filePaths, fileNames):
     att = MIMEText(open(filePath, 'rb').read(), 'base64', 'utf-8')
     att["Content-Type"] = 'application/octet-stream'
     # 邮件中显示文件名
     att["Content-Disposition"] = 'attachment; filename="' + fileName + '"'
     message.attach(att)

  except Exception as e:
   print(e)
   return False
  try:
   smtpObj = smtplib.SMTP_SSL(mail_host, mail_port)
   smtpObj.login(self.__mail_user, self.__mail_pass)
   smtpObj.sendmail(sender, receiver, message.as_string())
   smtpObj.quit()
   return True
  except Exception as e:
   print(e)
   return False

接下来展示具体的使用示例。

演示如何发送纯文本邮件。

qq=MyQQEmail('登陆邮箱','邮箱授权码','发件人')
qq.sendQQEmail(['收件人邮箱1','收件人邮箱2'], "标题", '内容')

演示如何发送HTML格式邮件。

from smtp.myqqemail import MyQQEmail
from urllib import request

response = request.urlopen("http://www.vove7.cn:800/getCopyright.php") # 打开网站
htmlContent=response.read()   #获取网站内容

myqqemail=MyQQEmail('xxx@qq.com','xxxxxx','发件人')
if myqqemail.sendQQEmail(['xxx@qq.com'],title="html测试",msg=htmlContent,type='html'):
  print('Send successful')
else:
  print('Send failed')

演示如何发送包含本地图片内容的邮件。

请注意,HTML中<img>标签引用的cid标识(如image1、image2)必须与代码中imagePaths列表里的索引顺序保持一致,否则图片无法正确显示。

from smtp.myqqemail import MyQQEmail
msg = '<p>Python 邮件发送测试...</p><p>图片演示:</p><p><img src="cid:image1"><img src="cid:image2"></p>'
myQQEmail=MyQQEmail('xxx@qq.com','xxxxxx','发件人')
if myQQEmail.sendQQEmail(
    ['xxx@qq.com'], '图片and附件', msg,
    type='image', filePaths=['../two/t.py', 'B.txt'],
    fileNames=['test.txt', 'B.txt'],
    imagePaths=['image.jpg','image.jpg']):
  print('Send successful')
else:
  print('Send failed')

演示如何发送带有附件的邮件。

其中fileName参数用于指定附件在邮件中显示的文件名。

from smtp.myqqemail import MyQQEmail

qqemail=MyQQEmail('xxx@qq.com','xxxxx','发件人')
if qqemail.sendQQEmail(
    ['xxx@qq.com'],
    '附件',msg='附件测试',
    type='file',filePaths=['../two/t.py','B.txt'],
    fileNames=['test.txt','B.txt']):
  print('Send successful')
else:
  print('Send failed')

演示如何发送既包含图片又包含附件的邮件。

from smtp.myqqemail import MyQQEmail

msg = '<p>Python 邮件发送测试...</p><p>图片演示:</p><p><img src="cid:image1"><img src="cid:image2"></p>'
qqemail=MyQQEmail('xxx@qq.com','xxx','发件人')
if qqemail.sendQQEmail(
    ['xxx@qq.com'],
    '附件&图片',msg,
    type='file',filePaths=['../two/t.py','B.txt'],
    fileNames=['test.txt','B.txt'],
    imagePaths=['image.jpg','image.jpg']):
  print('Send successful')
else:
  print('Send failed')

最后,开发者可以根据实际需求修改代码,简化传入的参数类型,以提高调用便捷性。

在使用前,需要先获取QQ邮箱的登录授权码。

获取路径为:登录QQ邮箱后,进入设置,选择账户选项。


以上就是本文的全部内容,希望能为读者的学习提供一定帮助,也欢迎大家继续支持本站。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。