使用MIME發送附件+純文字信件
import os
from pathlib import Path
from dotenv import load_dotenv
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
from email.header import Header
### 環境變數
current_file = Path(__file__).resolve() # 取得目前執行檔的絕對路徑
project_root = current_file.parent.parent # 往上返回兩層,回到專案根目錄
env_path = project_root / ".env" # 組合 .env 檔案路徑
load_dotenv(dotenv_path=env_path) # 載入指定位置的環境變數
### 讀取環境變數
AppPassword = os.getenv("AppPassword") # Gmail App Password
FromAddress = os.getenv("FromAddress") # 寄件者信箱
ToAddress = os.getenv("ToAddress") # 收件者信箱
### 郵件設定
subject = "【課程即將上課通知】" # 郵件主旨
text_content = """
您好:
附件為本次課程講義 PDF,
請記得提前下載與閱讀。
謝謝。
"""
### PDF 路徑
# 指向欲附加的 PDF 檔案
pdf_path = project_root / "Gmail_datasets" / "產業新尖兵計畫-1120701.pdf"
### 建立郵件主體
# 使用 MIMEMultipart 才能同時包含:
# 1. 郵件本文
# 2. 附件檔案
msg = MIMEMultipart()
msg["Subject"] = Header(subject, "utf-8")
msg["From"] = FromAddress
msg["To"] = ToAddress
### 加入純文字內容
# MIMEText 用來建立郵件本文
msg.attach(
MIMEText(
text_content,
"plain",
"utf-8"
)
)
### 加入 PDF 附件
# 以二進位模式讀取 PDF 檔案
with open(pdf_path, "rb") as file:
pdf_file = MIMEApplication(file.read())
# 設定附件資訊
# filename 使用 UTF-8,避免中文檔名亂碼
pdf_file.add_header(
"Content-Disposition",
"attachment",
filename=("utf-8", "", pdf_path.name)
)
msg.attach(pdf_file)
### 準備收件人清單
# sendmail() 第二個參數必須是 Email List
all_recipients = [ToAddress]
### 登入 SMTP 並寄送郵件
with smtplib.SMTP("smtp.gmail.com", 587) as server:
server.ehlo() # 啟動 SMTP 連線
server.starttls() # 升級為 TLS 加密傳輸
server.login(
FromAddress,
AppPassword
) # 登入 Gmail
server.sendmail(
FromAddress,
all_recipients,
msg.as_string()
) # 寄送郵件
print("郵件已寄出!")