python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python QQ/163自动发送邮件

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

作者:玄同765

很多开发者需要将大模型生成的内容(如报告、代码、数据分析结果)自动发送给用户或团队,但手动复制粘贴效率低且容易出错,本文详细介绍如何用 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自动发送邮件的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文