Gửi email tự động từ Python với hỗ trợ tệp đính kèm

Để 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

  1. 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)
  2. 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
  3. 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)

Thẻ: python smtplib email-mime smtp-ssl base64-encoding

Đăng vào ngày 30 tháng 5 lúc 03:57