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 管理员终端自定义安装
  1. Win+X打开【终端(管理员)】
  2. 切换目录:
cd D:/
  1. 指定盘符安装:
.\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模型

  1. Win+R输入cmd打开命令行
  2. 查看已有模型:
ollama list
  1. 一键下载并启动千问7B:
ollama run Qwen2.5:7b

模型大小约4.7G,等待全部分片100%下载、校验完成,出现>>> Send a message即为部署成功。

  1. 再次执行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
模块作用说明
  1. os:内置模块,读取系统环境变量,获取配置参数
  2. json:解析大模型返回的JSON格式邮件数据
  3. smtplib:Python内置SMTP客户端,实现邮件传输协议
  4. MIMEText/MIMEMultipart:构造标准MIME格式邮件(正文、主题、收发件人)
  5. requests:HTTP请求库,调用Ollama开放API接口
  6. 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")
配置说明
  1. load_dotenv():自动读取项目根目录.env文件,将配置写入环境变量,敏感信息不硬编码在源码
  2. QQ_EMAIL:发件QQ邮箱账号,SMTP登录用户名
  3. QQ_SMTP_AUTH_CODE:QQ邮箱POP3/SMTP授权码(非QQ登录密码,邮箱后台开启服务获取)
  4. OLLAMA_BASE_URL:Ollama本地服务地址,默认本机11434端口
  5. 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
关键细节解析
  1. Prompt设计
  • 角色限定:指定AI为专业邮件助手,约束输出风格
  • 动态入参:注入收件人邮箱、用户发送需求
  • 格式强约束:强制返回纯JSON字符串,双大括号{{}}实现f-string符号转义,便于程序解析
  • 内容约束:规范正文语言、礼貌性、主题精简
  1. Ollama接口请求参数
  • /api/chat:Ollama标准对话接口地址
  • stream:False:关闭流式输出,一次性完整返回生成内容
  • timeout=120:接口超时时间120s,适配7B模型生成耗时
  • resp.raise_for_status():HTTP异常自动抛出,快速捕获服务连接错误
  1. 数据清洗逻辑
    部分大模型会使用```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配置说明
  1. QQ邮箱SSL SMTP地址:smtp.qq.com,端口465
  2. with上下文管理:自动关闭SMTP连接,无需手动close
  3. MIMEText(plain):纯文本格式邮件,utf-8编码解决中文乱码问题
  4. 登录凭证使用邮箱+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

  1. 安装Ollama客户端,执行命令拉取模型:ollama pull qwen2.5:7b
  2. 启动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即可完成发送。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

七、注意事项

  1. 邮箱必须开启POP3/SMTP服务,在邮箱设置-账户页面开启,获取16位授权码;
  2. Ollama服务必须提前启动,确保11434端口正常可访问;
  3. 若模型输出格式异常,可优化Prompt增加输出限制,规避非标准JSON返回;

项目链接: https://pan.baidu.com/s/1XdEZPsVm4pzruBUAyVPu4w?pwd=2qfa 提取码: 2qfa

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐