一、前言:
在现代软件开发和自动化流程中,邮件通知是一个常见且实用的功能。无论是用于发送报告、告警信息还是用户提醒,通过 python 实现自动化的邮件发送功能都能极大提升工作效率。本文将基于你提供的两个文件(`.env` 配置文件与 python 脚本),详细介绍如何构建一个支持单发和群发、可配置 smtp 的邮件发送系统。
二、项目概述
我们将使用以下技术栈来完成这个任务:
- python:核心编程语言
- smtplib:python 内置库,用于连接 smtp 服务器
- email.mime:处理邮件内容(文本、html、附件)
- python-dotenv:读取 `.env` 文件中的环境变量
- os:获取环境变量
- json:处理结构化数据(如 json 格式的邮件正文)
三、配置文件 `.env` 解析
你的 `.env` 文件如下所示:
# gmail 配置 email=123477787@qq.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服务”并获取专用授权码。


四、代码结构解析
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')
smtp_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_port')
# # 常用邮箱smtp设置
# smtp_settings = {
# 'gmail': {
# '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` 模块,我们可以轻松实现单发、群发、带附件的邮件功能。这种自动化工具在实际工作中具有很高的实用价值,特别是在定时任务、监控报警、数据分析等场景中。
**提示**:在部署到生产环境前,请务必确认邮箱账号权限设置正确,并对敏感信息(如密码)做好安全保护措施。
以上就是基于python实现自动化邮件发送系统的完整指南的详细内容,更多关于python自动化邮件发送系统的资料请关注代码网其它相关文章!
发表评论