当前位置: 代码网 > it编程>前端脚本>Python > 使用Python实现自动发送邮件的实战指南(以QQ/163为例)

使用Python实现自动发送邮件的实战指南(以QQ/163为例)

2026年02月09日 Python 我要评论
摘要很多开发者需要将大模型生成的内容(如报告、代码、数据分析结果)自动发送给用户或团队,但手动复制粘贴效率低且容易出错。本文详细介绍如何用 python 实现自动发送邮件,以 qq 邮箱和 163 邮

摘要

很多开发者需要将大模型生成的内容(如报告、代码、数据分析结果)自动发送给用户或团队,但手动复制粘贴效率低且容易出错。本文详细介绍如何用 python 实现自动发送邮件,以 qq 邮箱和 163 邮箱为例,结合大模型生成内容的场景,给出完整的代码示例,包括纯文本邮件、html 邮件、附件发送等功能,帮你快速实现自动化邮件推送。

一、引言:为什么要自动发送邮件?

在大模型应用场景中,自动发送邮件可以解决以下痛点:

  1. 自动化报告生成:将大模型生成的数据分析报告、技术文档自动发送给相关人员;
  2. 代码推送:将大模型生成的代码自动发送给开发团队;
  3. 通知提醒:将大模型生成的异常检测结果、预警信息自动发送给运维人员;
  4. 批量处理:一次性将大模型生成的多份内容发送给不同收件人。

python 的smtplibemail库可以轻松实现邮件发送功能,结合大模型 api(如 openai、ollama),可以实现从内容生成到邮件发送的全流程自动化。

二、准备工作:开启邮箱 smtp 服务

在使用 python 发送邮件前,需要开启邮箱的 smtp 服务,并获取授权码(而非邮箱密码)。

2.1 qq 邮箱设置

  1. 登录 qq 邮箱,点击右上角的 “设置”→“账户”;
  2. 找到 “pop3/imap/smtp/exchange/carddav/caldav 服务”;
  3. 开启 “smtp 服务”;
  4. 点击 “生成授权码”,按照提示操作,获取授权码。

2.2 163 邮箱设置

  1. 登录 163 邮箱,点击右上角的 “设置”→“pop3/smtp/imap”;
  2. 开启 “smtp 服务”;
  3. 点击 “设置客户端授权密码”,按照提示操作,获取授权码。

三、python 发送邮件核心代码

python 发送邮件主要依赖smtplib(连接 smtp 服务器)和email(构建邮件内容)两个库。

3.1 发送纯文本邮件

代码示例

import smtplib
from email.mime.text import mimetext
from email.header import header
 
def send_text_email(
    smtp_server: str,
    smtp_port: int,
    sender_email: str,
    sender_password: str,
    receiver_email: str,
    subject: str,
    content: str
):
    """
    发送纯文本邮件
    :param smtp_server: smtp服务器地址
    :param smtp_port: smtp服务器端口
    :param sender_email: 发件人邮箱
    :param sender_password: 发件人邮箱授权码
    :param receiver_email: 收件人邮箱
    :param subject: 邮件主题
    :param content: 邮件内容
    """
    # 构建邮件内容
    message = mimetext(content, "plain", "utf-8")
    message["from"] = sender_email  # 直接设置邮箱地址,不使用header包装
    message["to"] = receiver_email  # 直接设置邮箱地址,不使用header包装
    message["subject"] = header(subject, "utf-8")
 
    # 发送邮件
    try:
        with smtplib.smtp_ssl(smtp_server, smtp_port) as server:
            server.login(sender_email, sender_password)
            server.sendmail(sender_email, receiver_email, message.as_string())
        print("纯文本邮件发送成功")
    except exception as e:
        print(f"纯文本邮件发送失败:{str(e)}")
 
# 测试代码
if __name__ == "__main__":
    # qq邮箱配置
    smtp_server = "smtp.qq.com"
    smtp_port = 465
    sender_email = "your_qq_email@qq.com"
    sender_password = "your_qq_authorization_code"
    receiver_email = "receiver_email@example.com"
    subject = "大模型生成的纯文本邮件"
    content = "这是大模型生成的纯文本邮件内容,用于测试自动发送邮件功能。"
 
    send_text_email(
        smtp_server,
        smtp_port,
        sender_email,
        sender_password,
        receiver_email,
        subject,
        content
    )

3.2 发送 html 邮件

代码示例

import smtplib
from email.mime.text import mimetext
from email.header import header

def send_html_email(
    smtp_server: str,
    smtp_port: int,
    sender_email: str,
    sender_password: str,
    receiver_email: str,
    subject: str,
    html_content: str
):
    """
    发送html邮件
    :param smtp_server: smtp服务器地址
    :param smtp_port: smtp服务器端口
    :param sender_email: 发件人邮箱
    :param sender_password: 发件人邮箱授权码
    :param receiver_email: 收件人邮箱
    :param subject: 邮件主题
    :param html_content: html格式的邮件内容
    """
    # 构建邮件内容
    message = mimetext(html_content, "html", "utf-8")
    message["from"] = sender_email  # 直接设置邮箱地址,不使用header包装
    message["to"] = receiver_email  # 直接设置邮箱地址,不使用header包装
    message["subject"] = header(subject, "utf-8")

    # 发送邮件
    try:
        with smtplib.smtp_ssl(smtp_server, smtp_port) as server:
            server.login(sender_email, sender_password)
            server.sendmail(sender_email, receiver_email, message.as_string())
        print("html邮件发送成功")
    except exception as e:
        print(f"html邮件发送失败:{str(e)}")

# 测试代码
if __name__ == "__main__":
    # 163邮箱配置
    smtp_server = "smtp.163.com"
    smtp_port = 465
    sender_email = "your_163_email@163.com"
    sender_password = "your_163_authorization_code"
    receiver_email = "receiver_email@example.com"
    subject = "大模型生成的html邮件"
    html_content = """
    <html>
        <body>
            <h1>大模型生成的html邮件</h1>
            <p>这是大模型生成的html邮件内容,用于测试自动发送邮件功能。</p>
            <p>以下是大模型生成的代码示例:</p>
            <pre><code>def fibonacci(n):
    if n <= 1:
        return n
    else:
        return fibonacci(n-1) + fibonacci(n-2)
</code></pre>
        </body>
    </html>
    """

    send_html_email(
        smtp_server,
        smtp_port,
        sender_email,
        sender_password,
        receiver_email,
        subject,
        html_content
    )

3.3 发送带附件的邮件

代码示例

import smtplib
from email.mime.text import mimetext
from email.mime.multipart import mimemultipart
from email.mime.base import mimebase
from email import encoders
from email.header import header
import os

def send_email_with_attachment(
    smtp_server: str,
    smtp_port: int,
    sender_email: str,
    sender_password: str,
    receiver_email: str,
    subject: str,
    content: str,
    attachment_path: str
):
    """
    发送带附件的邮件
    :param smtp_server: smtp服务器地址
    :param smtp_port: smtp服务器端口
    :param sender_email: 发件人邮箱
    :param sender_password: 发件人邮箱授权码
    :param receiver_email: 收件人邮箱
    :param subject: 邮件主题
    :param content: 邮件内容
    :param attachment_path: 附件路径
    """
    # 构建邮件内容
    message = mimemultipart()
    message["from"] = sender_email  # 直接设置邮箱地址,不使用header包装
    message["to"] = receiver_email  # 直接设置邮箱地址,不使用header包装
    message["subject"] = header(subject, "utf-8")

    # 添加邮件正文
    message.attach(mimetext(content, "plain", "utf-8"))

    # 添加附件
    if os.path.exists(attachment_path):
        filename = os.path.basename(attachment_path)
        with open(attachment_path, "rb") as f:
            part = mimebase("application", "octet-stream")
            part.set_payload(f.read())
            encoders.encode_base64(part)
            part.add_header("content-disposition", f"attachment; filename={filename}")
            message.attach(part)
    else:
        print(f"附件不存在:{attachment_path}")
        return

    # 发送邮件
    try:
        with smtplib.smtp_ssl(smtp_server, smtp_port) as server:
            server.login(sender_email, sender_password)
            server.sendmail(sender_email, receiver_email, message.as_string())
        print("带附件的邮件发送成功")
    except exception as e:
        print(f"带附件的邮件发送失败:{str(e)}")

# 测试代码
if __name__ == "__main__":
    # qq邮箱配置
    smtp_server = "smtp.qq.com"
    smtp_port = 465
    sender_email = "your_qq_email@qq.com"
    sender_password = "your_qq_authorization_code"
    receiver_email = "receiver_email@example.com"
    subject = "大模型生成的带附件邮件"
    content = "这是大模型生成的带附件邮件内容,附件是大模型生成的代码文件。"
    attachment_path = "fibonacci.py"

    send_email_with_attachment(
        smtp_server,
        smtp_port,
        sender_email,
        sender_password,
        receiver_email,
        subject,
        content,
        attachment_path
    )

三、实战案例:大模型生成内容自动发送邮件

结合 ollama 本地大模型,实现从内容生成到邮件发送的全流程自动化。

代码示例

import ollama
import smtplib
from email.mime.text import mimetext
from email.header import header

def generate_content_with_ollama(model_name: str, prompt: str) -> str:
    """
    使用ollama大模型生成内容
    :param model_name: 模型名称
    :param prompt: 提示词
    :return: 大模型生成的内容
    """
    response = ollama.generate(model=model_name, prompt=prompt, stream=false)
    return response["response"]

def send_email(
    smtp_server: str,
    smtp_port: int,
    sender_email: str,
    sender_password: str,
    receiver_email: str,
    subject: str,
    content: str
):
    """
    发送邮件
    :param smtp_server: smtp服务器地址
    :param smtp_port: smtp服务器端口
    :param sender_email: 发件人邮箱
    :param sender_password: 发件人邮箱授权码
    :param receiver_email: 收件人邮箱
    :param subject: 邮件主题
    :param content: 邮件内容
    """
    message = mimetext(content, "plain", "utf-8")
    message["from"] = header(sender_email, "utf-8")
    message["to"] = header(receiver_email, "utf-8")
    message["subject"] = header(subject, "utf-8")

    try:
        with smtplib.smtp_ssl(smtp_server, smtp_port) as server:
            server.login(sender_email, sender_password)
            server.sendmail(sender_email, receiver_email, message.as_string())
        print("邮件发送成功")
    except exception as e:
        print(f"邮件发送失败:{str(e)}")

# 主函数
if __name__ == "__main__":
    # 大模型配置
    model_name = "llama3:8b"
    prompt = "生成一份python数据分析报告的大纲,包括数据收集、数据清洗、数据分析、数据可视化、报告总结等部分。"

    # 生成内容
    content = generate_content_with_ollama(model_name, prompt)
    print(f"大模型生成的内容:\n{content}")

    # 邮件配置
    smtp_server = "smtp.qq.com"
    smtp_port = 465
    sender_email = "your_qq_email@qq.com"
    sender_password = "your_qq_authorization_code"
    receiver_email = "receiver_email@example.com"
    subject = "大模型生成的python数据分析报告大纲"

    # 发送邮件
    send_email(
        smtp_server,
        smtp_port,
        sender_email,
        sender_password,
        receiver_email,
        subject,
        content
    )

四、常见问题与解决方案

4.1 授权码错误

问题:发送邮件时提示 “535 login fail. please enter your authorization code to login.”解决方案:检查授权码是否正确,确保使用的是授权码而非邮箱密码。

4.2 端口错误

问题:发送邮件时提示 “connection refused”解决方案:检查 smtp 服务器端口是否正确,qq 邮箱和 163 邮箱的 smtp 端口通常为 465(ssl)或 587(tls)。

4.3 邮件被拦截

问题:邮件发送成功但收件人未收到解决方案:检查邮件内容是否包含敏感词汇,避免被垃圾邮件过滤器拦截;可以在邮件中添加退订链接,提高邮件可信度。

五、总结

python 的smtplibemail库可以轻松实现邮件发送功能,结合大模型生成内容的场景,可以实现从内容生成到邮件发送的全流程自动化。本文以 qq 邮箱和 163 邮箱为例,给出了纯文本邮件、html 邮件、附件邮件的代码示例,并结合 ollama 大模型实现了内容生成与邮件发送的自动化。希望本文对你有所帮助,让你在大模型应用场景中实现自动化邮件推送。

以上就是使用python实现自动发送邮件的实战指南(以qq/163为例)的详细内容,更多关于python qq/163自动发送邮件的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com