摘要
很多开发者需要将大模型生成的内容(如报告、代码、数据分析结果)自动发送给用户或团队,但手动复制粘贴效率低且容易出错。本文详细介绍如何用 python 实现自动发送邮件,以 qq 邮箱和 163 邮箱为例,结合大模型生成内容的场景,给出完整的代码示例,包括纯文本邮件、html 邮件、附件发送等功能,帮你快速实现自动化邮件推送。
一、引言:为什么要自动发送邮件?
在大模型应用场景中,自动发送邮件可以解决以下痛点:
- 自动化报告生成:将大模型生成的数据分析报告、技术文档自动发送给相关人员;
- 代码推送:将大模型生成的代码自动发送给开发团队;
- 通知提醒:将大模型生成的异常检测结果、预警信息自动发送给运维人员;
- 批量处理:一次性将大模型生成的多份内容发送给不同收件人。
python 的smtplib和email库可以轻松实现邮件发送功能,结合大模型 api(如 openai、ollama),可以实现从内容生成到邮件发送的全流程自动化。
二、准备工作:开启邮箱 smtp 服务
在使用 python 发送邮件前,需要开启邮箱的 smtp 服务,并获取授权码(而非邮箱密码)。
2.1 qq 邮箱设置
- 登录 qq 邮箱,点击右上角的 “设置”→“账户”;
- 找到 “pop3/imap/smtp/exchange/carddav/caldav 服务”;
- 开启 “smtp 服务”;
- 点击 “生成授权码”,按照提示操作,获取授权码。
2.2 163 邮箱设置
- 登录 163 邮箱,点击右上角的 “设置”→“pop3/smtp/imap”;
- 开启 “smtp 服务”;
- 点击 “设置客户端授权密码”,按照提示操作,获取授权码。
三、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 的smtplib和email库可以轻松实现邮件发送功能,结合大模型生成内容的场景,可以实现从内容生成到邮件发送的全流程自动化。本文以 qq 邮箱和 163 邮箱为例,给出了纯文本邮件、html 邮件、附件邮件的代码示例,并结合 ollama 大模型实现了内容生成与邮件发送的自动化。希望本文对你有所帮助,让你在大模型应用场景中实现自动化邮件推送。
以上就是使用python实现自动发送邮件的实战指南(以qq/163为例)的详细内容,更多关于python qq/163自动发送邮件的资料请关注代码网其它相关文章!
发表评论