使用Python實現(xiàn)自動發(fā)送郵件的實戰(zhàn)指南(以QQ/163為例)
摘要
很多開發(fā)者需要將大模型生成的內容(如報告、代碼、數(shù)據(jù)分析結果)自動發(fā)送給用戶或團隊,但手動復制粘貼效率低且容易出錯。本文詳細介紹如何用 Python 實現(xiàn)自動發(fā)送郵件,以 QQ 郵箱和 163 郵箱為例,結合大模型生成內容的場景,給出完整的代碼示例,包括純文本郵件、HTML 郵件、附件發(fā)送等功能,幫你快速實現(xiàn)自動化郵件推送。
一、引言:為什么要自動發(fā)送郵件?
在大模型應用場景中,自動發(fā)送郵件可以解決以下痛點:
- 自動化報告生成:將大模型生成的數(shù)據(jù)分析報告、技術文檔自動發(fā)送給相關人員;
- 代碼推送:將大模型生成的代碼自動發(fā)送給開發(fā)團隊;
- 通知提醒:將大模型生成的異常檢測結果、預警信息自動發(fā)送給運維人員;
- 批量處理:一次性將大模型生成的多份內容發(fā)送給不同收件人。
Python 的smtplib和email庫可以輕松實現(xiàn)郵件發(fā)送功能,結合大模型 API(如 OpenAI、Ollama),可以實現(xiàn)從內容生成到郵件發(fā)送的全流程自動化。
二、準備工作:開啟郵箱 SMTP 服務
在使用 Python 發(fā)送郵件前,需要開啟郵箱的 SMTP 服務,并獲取授權碼(而非郵箱密碼)。
2.1 QQ 郵箱設置
- 登錄 QQ 郵箱,點擊右上角的 “設置”→“賬戶”;
- 找到 “POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV 服務”;
- 開啟 “SMTP 服務”;
- 點擊 “生成授權碼”,按照提示操作,獲取授權碼。
2.2 163 郵箱設置
- 登錄 163 郵箱,點擊右上角的 “設置”→“POP3/SMTP/IMAP”;
- 開啟 “SMTP 服務”;
- 點擊 “設置客戶端授權密碼”,按照提示操作,獲取授權碼。
三、Python 發(fā)送郵件核心代碼
Python 發(fā)送郵件主要依賴smtplib(連接 SMTP 服務器)和email(構建郵件內容)兩個庫。
3.1 發(fā)送純文本郵件
代碼示例:
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
):
"""
發(fā)送純文本郵件
:param smtp_server: SMTP服務器地址
:param smtp_port: SMTP服務器端口
:param sender_email: 發(fā)件人郵箱
:param sender_password: 發(fā)件人郵箱授權碼
: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")
# 發(fā)送郵件
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("純文本郵件發(fā)送成功")
except Exception as e:
print(f"純文本郵件發(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 = "這是大模型生成的純文本郵件內容,用于測試自動發(fā)送郵件功能。"
send_text_email(
smtp_server,
smtp_port,
sender_email,
sender_password,
receiver_email,
subject,
content
)3.2 發(fā)送 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
):
"""
發(fā)送HTML郵件
:param smtp_server: SMTP服務器地址
:param smtp_port: SMTP服務器端口
:param sender_email: 發(fā)件人郵箱
:param sender_password: 發(fā)件人郵箱授權碼
: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")
# 發(fā)送郵件
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郵件發(fā)送成功")
except Exception as e:
print(f"HTML郵件發(fā)送失?。簕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郵件內容,用于測試自動發(fā)送郵件功能。</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 發(fā)送帶附件的郵件
代碼示例:
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
):
"""
發(fā)送帶附件的郵件
:param smtp_server: SMTP服務器地址
:param smtp_port: SMTP服務器端口
:param sender_email: 發(fā)件人郵箱
:param sender_password: 發(fā)件人郵箱授權碼
: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
# 發(fā)送郵件
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("帶附件的郵件發(fā)送成功")
except Exception as e:
print(f"帶附件的郵件發(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
)
三、實戰(zhàn)案例:大模型生成內容自動發(fā)送郵件
結合 Ollama 本地大模型,實現(xiàn)從內容生成到郵件發(fā)送的全流程自動化。
代碼示例:
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
):
"""
發(fā)送郵件
:param smtp_server: SMTP服務器地址
:param smtp_port: SMTP服務器端口
:param sender_email: 發(fā)件人郵箱
:param sender_password: 發(fā)件人郵箱授權碼
: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("郵件發(fā)送成功")
except Exception as e:
print(f"郵件發(fā)送失?。簕str(e)}")
# 主函數(shù)
if __name__ == "__main__":
# 大模型配置
model_name = "llama3:8b"
prompt = "生成一份Python數(shù)據(jù)分析報告的大綱,包括數(shù)據(jù)收集、數(shù)據(jù)清洗、數(shù)據(jù)分析、數(shù)據(jù)可視化、報告總結等部分。"
# 生成內容
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數(shù)據(jù)分析報告大綱"
# 發(fā)送郵件
send_email(
smtp_server,
smtp_port,
sender_email,
sender_password,
receiver_email,
subject,
content
)
四、常見問題與解決方案
4.1 授權碼錯誤
問題:發(fā)送郵件時提示 “535 Login Fail. Please enter your authorization code to login.”解決方案:檢查授權碼是否正確,確保使用的是授權碼而非郵箱密碼。
4.2 端口錯誤
問題:發(fā)送郵件時提示 “Connection refused”解決方案:檢查 SMTP 服務器端口是否正確,QQ 郵箱和 163 郵箱的 SMTP 端口通常為 465(SSL)或 587(TLS)。
4.3 郵件被攔截
問題:郵件發(fā)送成功但收件人未收到解決方案:檢查郵件內容是否包含敏感詞匯,避免被垃圾郵件過濾器攔截;可以在郵件中添加退訂鏈接,提高郵件可信度。
五、總結
Python 的smtplib和email庫可以輕松實現(xiàn)郵件發(fā)送功能,結合大模型生成內容的場景,可以實現(xiàn)從內容生成到郵件發(fā)送的全流程自動化。本文以 QQ 郵箱和 163 郵箱為例,給出了純文本郵件、HTML 郵件、附件郵件的代碼示例,并結合 Ollama 大模型實現(xiàn)了內容生成與郵件發(fā)送的自動化。希望本文對你有所幫助,讓你在大模型應用場景中實現(xiàn)自動化郵件推送。
以上就是使用Python實現(xiàn)自動發(fā)送郵件的實戰(zhàn)指南(以QQ/163為例)的詳細內容,更多關于Python QQ/163自動發(fā)送郵件的資料請關注腳本之家其它相關文章!
相關文章
將Dataframe數(shù)據(jù)轉化為ndarry數(shù)據(jù)的方法
今天小編就為大家分享一篇將Dataframe數(shù)據(jù)轉化為ndarry數(shù)據(jù)的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-06-06
Python Dict 到 Dataclass實現(xiàn)高效數(shù)據(jù)訪問與管理的兩種方式(推薦)
本文介紹了Python中的字典和DataClass兩種數(shù)據(jù)結構,并探討了如何將字典轉換為DataClass,字典適用于鍵值對存儲,感興趣的朋友一起看看吧2024-12-12
如何解決import torchvision報錯問題 DLL:找不到模塊
這篇文章主要介紹了如何解決import torchvision報錯問題 DLL:找不到模塊,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01
Python如何創(chuàng)建裝飾器時保留函數(shù)元信息
這篇文章主要介紹了Python如何創(chuàng)建裝飾器時保留函數(shù)元信息,文中講解非常細致,幫助大家更好的理解和學習,感興趣的朋友可以了解下2020-08-08
使用coverage統(tǒng)計python web項目代碼覆蓋率的方法詳解
這篇文章主要介紹了使用coverage統(tǒng)計python web項目代碼覆蓋率的方法,詳細分析了coverage的安裝以及coverage命令統(tǒng)計py文件相關操作技巧,需要的朋友可以參考下2019-08-08

