基于Python实现自动化邮件发送系统的完整指南

2025-08-20 10:50

本文主要是介绍基于Python实现自动化邮件发送系统的完整指南,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《基于Python实现自动化邮件发送系统的完整指南》在现代软件开发和自动化流程中,邮件通知是一个常见且实用的功能,无论是用于发送报告、告警信息还是用户提醒,通过Python实现自动化的邮件发送功能都能...

一、前言:

在现代软件开发和自动化流程中,邮件通知是一个常见且实用的功能。无论是用于发送报告、告警信息还是用户提醒,通过 Python 实现自动化的邮件发送功能都能极大提升工作效率。本文将基于你提供的两个文件(`.env` 配置文件与 Python 脚本),详细介绍如何构建一个支持单发和群发、可配置 SMTP 的邮件发送系统

二、项目概述

我们将使用以下技术栈来完成这个任务:

  • Python:核心编程语言
  • smtplib:Python 内置库,用于连接 SMTP 服务器
  • email.mime:处理邮件内容(文本、html、附件)
  • python-dotenv:读取 `.env` 文件中的环境变量
  • os:获取环境变量
  • json:处理结构化数据(如 JSON 格式的邮件正文)

三、配置文件 `.env` 解析

你的 `.env` 文件如下所示:

# Gmail 配置
EMAIL=123477787@http://www.chinasem.cnqq.com  ## 你的邮箱地址
EMAIL_PASSWORD=vfoae#####   ## 你的授权码
 
# 其他配置项
SMTP_SERVER=smtp.qq.com
SMTP_PORT=587

该文件定义了发送邮件所需的必要参数:

  • EMAIL:发件人邮箱地址
  • EMAIL_PASSWORD:授权码(不是登录密码!QQ 邮箱需要开启 POP3/SMTP 并获取授权码)
  • SMTP_SERVER 和 SMTP_PORT:指定 SMTP 服务器地址及端口

注意:QQ 邮箱等部分邮箱不支持直接使用登录密码,需启用“POP3/SMTP服务”并获取专用授权码。

基于Python实现自动化邮件发送系统的完整指南

基于Python实现自动化邮件发送系统的完整指南

四、代码结构解析

1. 导入模块

import json
import os
from dotenv import load_dotenv
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders

这些模块分别负责加载环境变量、连接 SMTP 服务器、构造邮件内容以及编码附件。

2. 加载环境变量

load_dotenv()
EMAIL = os.getenv('EMAIL')
PASSWORD = os.getenv('EMAIL_PASSWORD')
SandroidMTP_SERVER = os.getenv('SMTP_SERVER')
SMTP_PORT = int(os.getenv('SMTP_PORT'))

通过 `python-dotenv` 模块读取 `.env` 中的配置信息,并将其赋值给全局变量。

3. EmailSender 类设计

这是整个系统的核心类,封装了连接、发送、断开 SMTP 的逻辑。

初始化方法:

def __init__(self, smtp_server, smtp_port, email, password):
    self.smtp_server = smtp_server
    self.smtp_port = smtp_port
    self.email = email
    self.password = password

连接服务器:

def connect(self):
    try:
        self.server = smtplib.SMTP(self.smtp_server, self.smtp_port)
        self.server.starttls()
        self.server.login(self.email, self.password)
        return True
    except Exception as e:
        print(f"连接失败:{e}")
        return False

发送邮件(支持纯文本、HTML、附件):

def send_email(self, to_email, subject, body, html_body=None, attachments=None):
    ...

群发邮件功能:

def send_bulk_email(self, to_emails, subject, body, html_body=None, attachments=None):
    ...

断开连接:

def disconnect(self):
    if hasattr(self, 'server'):
        self.server.quit()

4. 主函数调用逻辑

def checker_send_email(recipient_list, title_text, ret_text):
    sender = EmailSender(SMTP_SERVER, SMTP_PORT, EMAIL, PASSWORD)
    if sender.connect():
        data = json.dumps(ret_text, ensure_ascii=False, indent=2) if isinstance(ret_text, dict) else ret_text
        success = sender.send_bulk_email(
            to_emails=recipient_list,
            subject=title_text,
            body=data,
        )
        if success:
            print("邮件发送成功!")
        sender.disconnect()
    return

此函数作为对外接口,接受收件人列表、主题、内容,然后进行群发操作。

5. 测试入口

if __name__ == '__main__':
    recipients = ['402914287@qq.com']
    title = '群发邮件测试'
    ret = "这是一封测试邮件"
    checker_send_email(recipients, title, ret)

运行脚本时,会向指定邮箱发送一封测试邮件。

五、完整代码:

.env文件内容:

# Gmail 配置
EMAIL=123477787@qq.com  ## 你的邮箱地址
EMAIL_PASSWORD=vfoae#####   ## 你的授权码
 
# 其他配置项
SMTP_SERVER=smtp.qq.com
SMTP_PORT=587

send_mail.python文件内容:

import json
import os
from dotenv import load_dotenv
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders
 
load_dotenv()
EMAIL = os.getenv('EMAIL')
PASSWORD = os.getenv('EMAIL_PASSWORD')
SMTP_SERVER = os.getenv('SMTP_SERVER')
SMTP_PORT = os.getenv('SMTP_PORjXjxRnOT')
 
 
# # 常用邮箱SMTP设置
# SMTP_SETTINGS = {
#     'gmail': {python
#         'server': 'smtp.gmail.com',
#         'port': 587
#     },
#     'outlook': {
#         'server': 'smtp-mail.outlook.com',
#         'port': 587
#     },
#     'qq': {
#         'server': 'smtp.qq.com',
#         'port': 587
#     },
#     '163': {
#         'server': 'smtp.163.com',
#         'port': 25
#     },
#     'sina': {
#         'server': 'smtp.sina.com',
#         'port': 25
#     }
# }
 
# def get_smtp_config(provider):
#     """获取SMTP配置"""
#     return SMTP_SETTINGS.get(provider, SMTP_SETTINGS['gmail'])
 
class EmailSender:
    def __init__(self, smtp_server, smtp_port, email, password):
        self.smtp_server = smtp_server
        self.smtp_port = smtp_port
        self.email = email
        self.password = password
 
    def connect(self):
        """连接SMTP服务器"""
        try:
            self.server = smtplib.SMTP(self.smtp_server, self.smtp_port)
            self.server.starttls()
            self.server.login(self.email, self.password)
            return True
        except Exception as e:
            print(f"连接失败:{e}")
            return False
 
    def send_email(self, to_email, subject, body, html_body=None, attachments=None):
        """发送邮件"""
        try:
            msg = MIMEMultipart('alternative')
            msg['From'] = self.email
            msg['To'] = to_email
            msg['Subject'] = subject
 
            # 添加文本内容
            msg.attach(MIMEText(body, 'plain', 'utf-8'))
 
            # 添加HTML内容(如果提供)
            if html_body:
                msg.attach(MIMEText(html_body, 'html', 'utf-8'))
 
            # 添加附件(如果提供)
            if attachments:
                for file_path in attachments:
                    if os.path.exists(file_path):
                        with open(file_path, "rb") as attachment:
                            part = MIMEBase('application', 'octet-stream')
                            part.set_payload(attachment.read())
 
                        encoders.encode_base64(part)
                        part.add_header(
                            'Content-Disposition',
                            f'attachment; filename= {os.path.basename(file_path)}'
                        )
                        msg.attach(part)
 
            # 发送邮件
            self.server.sendmail(self.email, to_email, msg.as_string())
            return True
 
        except Exception as e:
            print(f"发送失败:{e}")
            return False
 
    def send_bulk_email(self, to_emails, subject, body, html_body=None, attachments=None):
        """
        群发邮件
        :param to_emails: 收件人邮箱列表
        :param subject: 邮件主题
        :param body: 邮件正文
        :param html_body: HTML格式正文
        :param attachments: 附件列表
        """
        if not self.server:
            print("请先连接到SMTP服务器")
            return False
 
        success_count = 0
        for email in to_emails:
            if self.send_email(email, subject, body, html_body, attachments):
                success_count += 1
 
        print(f"群发完成:成功 {success_count}/{len(to_emails)}")
        return success_count == len(to_emails)
 
    def disconnect(self):
        """断开连接"""
        if hasattr(self, 'server'):
            self.server.quit()
 
def checker_send_email(recipient_list, title_text, ret_text):
    """发送邮件"""
    sender = EmailSender(SMTP_SERVER, SMTP_PORT, EMAIL, PASSWORD)
    if sender.connect():
        # 单发邮件
        # success = sender.send_email(
        #     '3909878531@qq.com',
        #     '测试邮件',
        #     '这是一封测试邮件',
        #     # html_body='<h1>测试邮件</h1><p>这是一封HTML邮件</p>',
        #     # attachments=['file1.pdf', 'file2.docx']
        # )
        # 群发邮件
        data = json.dumps(ret_text, ensure_ascii=False, indent=2) if isinstance(ret_text, dict) else ret_text
        success = sender.send_bulk_email(
            to_emails=recipient_list,
            subject=title_text,
            body=data,
            # html_body='<h1>测试邮件</h1><p>这是一封HTML邮件</p>',
        )
 
        if success:
            print("邮件发送成功!")
        sender.disconnect()
    return
 
if __name__ == '__main__':
    recipients = ['23398877797@qq.com']
    title = '群发邮件测试'
    ret = "这是一封测试邮件"
    checker_send_email(recipients, title, ret)

六、总结

通过合理使用 `.env` 配置文件、`smtplib` 及 `email` 模块,我们可http://www.chinasem.cn以轻松实现单发、群发、带附件的邮件功能。这种自动化工具在实际工作中具有很高的实用价值,特别是在定时任务、监控报警、数据分析等场景中。

 **提示**:在部署到生产环境前,请务必确认邮箱账号权限设置正确,并对敏感信息(如密码)做好安全保护措施。

以上就是基于Python实现自动化邮件发送系统的完整指南的详细内容,更多关于Python自动化邮件发送系统的资料请关注China编程(www.chinasem.cn)其它相关文章!

这篇关于基于Python实现自动化邮件发送系统的完整指南的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1155822

相关文章

C++中unordered_set哈希集合的实现

《C++中unordered_set哈希集合的实现》std::unordered_set是C++标准库中的无序关联容器,基于哈希表实现,具有元素唯一性和无序性特点,本文就来详细的介绍一下unorder... 目录一、概述二、头文件与命名空间三、常用方法与示例1. 构造与析构2. 迭代器与遍历3. 容量相关4

C++中悬垂引用(Dangling Reference) 的实现

《C++中悬垂引用(DanglingReference)的实现》C++中的悬垂引用指引用绑定的对象被销毁后引用仍存在的情况,会导致访问无效内存,下面就来详细的介绍一下产生的原因以及如何避免,感兴趣... 目录悬垂引用的产生原因1. 引用绑定到局部变量,变量超出作用域后销毁2. 引用绑定到动态分配的对象,对象

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

JDK21对虚拟线程的几种用法实践指南

《JDK21对虚拟线程的几种用法实践指南》虚拟线程是Java中的一种轻量级线程,由JVM管理,特别适合于I/O密集型任务,:本文主要介绍JDK21对虚拟线程的几种用法,文中通过代码介绍的非常详细,... 目录一、参考官方文档二、什么是虚拟线程三、几种用法1、Thread.ofVirtual().start(

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

从基础到高级详解Go语言中错误处理的实践指南

《从基础到高级详解Go语言中错误处理的实践指南》Go语言采用了一种独特而明确的错误处理哲学,与其他主流编程语言形成鲜明对比,本文将为大家详细介绍Go语言中错误处理详细方法,希望对大家有所帮助... 目录1 Go 错误处理哲学与核心机制1.1 错误接口设计1.2 错误与异常的区别2 错误创建与检查2.1 基础

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

Nginx搭建前端本地预览环境的完整步骤教学

《Nginx搭建前端本地预览环境的完整步骤教学》这篇文章主要为大家详细介绍了Nginx搭建前端本地预览环境的完整步骤教学,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录项目目录结构核心配置文件:nginx.conf脚本化操作:nginx.shnpm 脚本集成总结:对前端的意义很多

一文详解Python如何开发游戏

《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D