Để tích hợp khả năng thông báo tự động sau khi sinh báo cáo, Python cung cấp thư viện chuẩn smtplib và các lớp MIME để xây dựng và gửi email qua giao thức SMTP. Quá trình này yêu cầu cấu hình dịch vụ SMTP trên tài khoản email (ví dụ: QQ Mail, 163 Mail, Gmail) và sử dụng mật khẩu ứng dụng thay vì mật khẩu đăng nhập thông thường.
Các bước cơ bản để gửi email
- Tạo nội dung tin nhắn dưới dạng đối tượng MIME phù hợp (văn bản thuần, HTML hoặc hỗn hợp)
- Thiết lập tiêu đề: người gửi, người nhận, chủ đề — chú ý mã hóa UTF-8 cho ký tự không ASCII
- Kết nối tới máy chủ SMTP (thường dùng SSL/TLS), xác thực và gửi
Ví dụ: Gửi email văn bản đơn giản
import smtplib
from email.mime.text import MIMEText
# Nội dung email
content = "Báo cáo kiểm thử đã hoàn tất. Vui lòng xem chi tiết trong tệp đính kèm."
message = MIMEText(content, "plain", "utf-8")
# Thiết lập tiêu đề
message["From"] = "sender@example.com"
message["To"] = "recipient@domain.com"
message["Subject"] = "✅ Báo cáo kiểm thử tự động"
# Gửi qua máy chủ SMTP được bảo mật
with smtplib.SMTP_SSL("smtp.example.com", 465) as server:
server.login("sender@example.com", "app_password_here")
server.send_message(message)
Ví dụ: Gửi email có tệp đính kèm HTML
Khi cần gửi báo cáo định dạng HTML kèm file gốc (đảm bảo định dạng CSS và hình ảnh nguyên vẹn), nên sử dụng MIMEMultipart kết hợp với phần đính kèm được mã hóa Base64.
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
from pathlib import Path
# Đọc nội dung HTML làm thân email
report_path = Path("test_report.html")
html_body = report_path.read_text(encoding="utf-8")
# Khởi tạo email hỗn hợp
email_package = MIMEMultipart("alternative")
email_package.attach(MIMEText(html_body, "html", "utf-8"))
# Thêm tệp đính kèm (giữ nguyên nội dung gốc)
with open(report_path, "rb") as f:
attachment = MIMEBase("application", "html")
attachment.set_payload(f.read())
encoders.encode_base64(attachment)
attachment.add_header(
"Content-Disposition",
f"attachment; filename={report_path.name}",
filename=report_path.name
)
email_package.attach(attachment)
# Thiết lập tiêu đề và gửi
email_package["From"] = "sender@example.com"
email_package["To"] = "recipient@domain.com"
email_package["Subject"] = "📊 Báo cáo kiểm thử – " + report_path.stem
with smtplib.SMTP_SSL("smtp.example.com", 465) as smtp_conn:
smtp_conn.login("sender@example.com", "app_password_here")
smtp_conn.send_message(email_package)