【Python结合Ollama本地大模型实现SMTP发送】
Python结合Ollama本地大模型实现SMTP发送
一、项目简介
本项目基于Python实现Ollama+SMTP智能发信工具,采用三层分层架构:配置层、AI生成层、邮件发送层。依靠本地Qwen2.5:7b大模型,用户只需要填写收件邮箱+自然语言描述邮件需求,AI自动生成邮件主题与正文,确认后通过邮箱SMTP协议一键发送邮件。
整体执行流程:用户输入收件邮箱+发送意图 → Ollama大模型生成邮件标题+正文 → 人工预览确认 → SMTP服务发送
二、整体三层架构
| 分层 | 功能说明 |
|---|---|
| 配置层 | 读取.env环境配置文件,加载发件邮箱、SMTP授权码、Ollama服务地址、模型名称 |
| AI生成层 | 调用本地Ollama REST接口,使用Qwen2.5:7b模型,根据收件人、需求自动生成标准化JSON格式邮件内容 |
| 邮件发送层 | 依托邮箱SSL加密SMTP服务,组装MIME邮件报文,完成邮件推送 |
三、Ollama本地部署模型
3.1 Ollama安装(程序+模型全安装至D盘)
3.1.1 新建D盘目录
D盘创建两个文件夹:
D:\Ollama # 程序目录
D:\Ollama\Models # 模型存储目录
3.1.2 下载安装包
官网下载OllamaSetup.exe,存放路径避免中文。
3.1.3 管理员终端自定义安装
Win+X打开【终端(管理员)】- 切换目录:
cd D:/
- 指定盘符安装:
.\OllamaSetup.exe /DIR="D:\Ollama"
弹窗向导下一步完成安装。
3.2 配置模型存储路径(二选一)
方案1:系统环境变量(这种我的电脑没生效)
此电脑→属性→高级系统设置→环境变量→系统变量新建
- 变量名:
OLLAMA_MODELS - 变量值:
D:\Ollama\Models
保存后完全退出Ollama托盘,重启软件生效。
方案2:客户端图形配置
打开Ollama-Settings,Model location修改为D:\ollama\model,保存重启。

3.3 本地部署Qwen2.5:7B模型
Win+R输入cmd打开命令行- 查看已有模型:
ollama list
- 一键下载并启动千问7B:
ollama run Qwen2.5:7b
模型大小约4.7G,等待全部分片100%下载、校验完成,出现
>>> Send a message即为部署成功。
- 再次执行
ollama list,列表出现Qwen2.5:7b代表部署完毕。

3.4 备注
普通硬件优先选择7B及以下模型,硬件配置充足可选用10B以上大模型。
四、完整代码分模块详解
4.1 模块导入区
import os
import json
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import requests
from dotenv import load_dotenv
模块作用说明
os:内置模块,读取系统环境变量,获取配置参数json:解析大模型返回的JSON格式邮件数据smtplib:Python内置SMTP客户端,实现邮件传输协议MIMEText/MIMEMultipart:构造标准MIME格式邮件(正文、主题、收发件人)requests:HTTP请求库,调用Ollama开放API接口dotenv.load_dotenv:加载项目.env配置文件,隔离敏感隐私配置
4.2 环境配置加载模块
# 加载 .env配置文件
load_dotenv()
# 读取配置,无配置时使用默认参数
QQ_EMAIL = os.getenv("QQ_EMAIL")
QQ_SMTP_AUTH_CODE = os.getenv("QQ_SMTP_AUTH_CODE")
OLLAMA_BASE_URL = os.getenv("OLLAMA_BASE_URL", "http://localhost:11434")
OLLAMA_MODEL = os.getenv("OLLAMA_MODEL", "qwen2.5:7b")
配置说明
load_dotenv():自动读取项目根目录.env文件,将配置写入环境变量,敏感信息不硬编码在源码QQ_EMAIL:发件QQ邮箱账号,SMTP登录用户名QQ_SMTP_AUTH_CODE:QQ邮箱POP3/SMTP授权码(非QQ登录密码,邮箱后台开启服务获取)OLLAMA_BASE_URL:Ollama本地服务地址,默认本机11434端口OLLAMA_MODEL:指定Ollama运行的大模型,默认qwen2.5:7b
开发规范:配置与代码分离,
.env配置文件添加至.gitignore,避免隐私信息上传代码仓库
4.3 AI自动生成邮件内容函数generate_email_content
def generate_email_content(to: str, intent: str) -> dict:
# 构造提示词Prompt
prompt = f"""你是一个邮件助手。根据用户的要求,生成一封邮件的【主题】和【正文】。
收件人是:{to}
用户要求:{intent}
请严格按以下 JSON 格式输出,不要输出其他内容:
{{"subject": "邮件主题", "body": "邮件正文"}}
注意:
- 正文要有礼貌、专业
- 正文用中文
- 主题简洁明了"""
# 请求Ollama接口
resp = requests.post(
f"{OLLAMA_BASE_URL}/api/chat",
json={
"model": OLLAMA_MODEL,
"messages": [{"role": "user", "content": prompt}],
"stream": False,
},
timeout=120,
)
resp.raise_for_status()
# 提取模型返回内容
content = resp.json()["message"]["content"].strip()
# 剔除markdown代码标记,纯提取JSON字符串
if "```" in content:
start = content.find("{")
end = content.rfind("}") + 1
content = content[start:end]
result = json.loads(content)
# 控制台预览生成内容
print(f"主题: {result['subject']}")
print(f"正文:\n{result['body']}")
return result
关键细节解析
- Prompt设计
- 角色限定:指定AI为专业邮件助手,约束输出风格
- 动态入参:注入收件人邮箱、用户发送需求
- 格式强约束:强制返回纯JSON字符串,双大括号
{{}}实现f-string符号转义,便于程序解析 - 内容约束:规范正文语言、礼貌性、主题精简
- Ollama接口请求参数
/api/chat:Ollama标准对话接口地址stream:False:关闭流式输出,一次性完整返回生成内容timeout=120:接口超时时间120s,适配7B模型生成耗时resp.raise_for_status():HTTP异常自动抛出,快速捕获服务连接错误
- 数据清洗逻辑
部分大模型会使用```markdown代码块包裹JSON,代码自动截取首尾{},过滤多余字符,保证json.loads正常解析。
4.4 SMTP邮件发送函数send_email
def send_email(to: str, subject: str, body: str):
# 初始化邮件对象
msg = MIMEMultipart()
msg["From"] = QQ_EMAIL
msg["To"] = to
msg["Subject"] = subject
# 挂载纯文本正文,utf-8适配中文
msg.attach(MIMEText(body, "plain", "utf-8"))
# SSL加密连接QQ邮箱SMTP服务器
with smtplib.SMTP_SSL("smtp.qq.com", 465) as server:
server.login(QQ_EMAIL, QQ_SMTP_AUTH_CODE)
server.sendmail(QQ_EMAIL, to, msg.as_string())
SMTP配置说明
- QQ邮箱SSL SMTP地址:
smtp.qq.com,端口465 with上下文管理:自动关闭SMTP连接,无需手动closeMIMEText(plain):纯文本格式邮件,utf-8编码解决中文乱码问题- 登录凭证使用邮箱+SMTP授权码,禁止使用QQ明文密码
4.5 主交互函数main
def main():
# 前置配置校验
if not QQ_EMAIL or not QQ_SMTP_AUTH_CODE:
print("错误:请在 .env 文件中配置 QQ_EMAIL 和 QQ_SMTP_AUTH_CODE")
return
print("=" * 50)
print(" Ollama + QQ邮箱 智能发邮件工具")
print("=" * 50)
# 用户交互输入
to = input("\n请输入收件人邮箱: ").strip()
if not to:
print("收件人不能为空")
return
intent = input("请描述你想发什么内容的邮件: ").strip()
if not intent:
print("邮件意图不能为空")
return
# AI生成邮件内容
email_content = generate_email_content(to, intent)
# 确认是否发送
confirm = input("确认发送?(y/n): ").strip().lower()
if confirm == "y":
send_email(to, email_content["subject"], email_content["body"])
print("邮件发送成功!")
else:
print("已取消发送。")
4.6 程序入口
if __name__ == "__main__":
main()
Python标准入口写法:脚本直接运行触发
main();代码被其他项目导入时不会自动执行,方便函数二次调用。
五、项目数据流图

六、部署使用步骤
6.1 环境依赖安装
pip install requests python-dotenv
6.2 安装配置Ollama
- 安装Ollama客户端,执行命令拉取模型:
ollama pull qwen2.5:7b - 启动Ollama本地服务(默认开机自启,端口11434)
6.3 新建.env配置文件
项目根目录创建.env,填入配置信息:
QQ_EMAIL=你的QQ邮箱@qq.com
QQ_SMTP_AUTH_CODE=你的SMTP授权码
# 可选配置,默认localhost:11434 qwen2.5:7b
# OLLAMA_BASE_URL=http://localhost:11434
# OLLAMA_MODEL=qwen2.5:7b
6.4 运行项目
终端运行python main.py或直接右键运行
输入收件邮箱+邮件需求,等待AI生成内容,输入y即可完成发送。


七、注意事项
- 邮箱必须开启POP3/SMTP服务,在邮箱设置-账户页面开启,获取16位授权码;
- Ollama服务必须提前启动,确保11434端口正常可访问;
- 若模型输出格式异常,可优化Prompt增加输出限制,规避非标准JSON返回;
项目链接: https://pan.baidu.com/s/1XdEZPsVm4pzruBUAyVPu4w?pwd=2qfa 提取码: 2qfa
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)