🔄 Ôn tập: Trong bài học trước, bạn đã tích hợp với API REST — lấy dữ liệu, xử lý phân trang và xây dựng các pipeline dữ liệu. Bây giờ, hãy thêm lớp giao tiếp: Gửi email và thông báo từ các script tự động hóa của bạn.
Email và thông báo biến các script tự động hóa của bạn từ những công cụ bạn chạy thủ công thành các hệ thống truyền đạt kết quả, gửi cảnh báo và cung cấp báo cáo theo lịch trình.
Gửi email bằng Python
Thư viện smtplib của Python xử lý SMTP (gửi email). Đối với các tài khoản hiện đại, bạn thường cần mật khẩu dành riêng cho ứng dụng (không phải mật khẩu thông thường của bạn).
Thiết lập mật khẩu ứng dụng Gmail:
Bật xác thực hai yếu tố trên tài khoản Google của bạn.
Truy cập tài khoản Google → Security → App passwords.
Tạo mật khẩu cho "Mail" trong mục "Other".
Lưu mật khẩu này vào file .env của bạn.
Script 1: Gửi email cơ bản
Prompt AI:
Viết một script Python gửi email bằng smtplib: (1) Đọc thông tin đăng nhập SMTP từ các biến môi trường (SMTP_SERVER, SMTP_PORT, EMAIL_USER, EMAIL_PASSWORD), (2) Hỗ trợ cả nội dung plain text và HTML, (3) Hỗ trợ file đính kèm (CSV, Excel, PDF), (4) Chấp nhận người nhận, chủ đề và nội dung làm tham số hàm, (5) Bao gồm xử lý lỗi thích hợp cho các lỗi kết nối, lỗi xác thực và lỗi gửi. Tạo một hàm send_email() có thể tái sử dụng mà tôi có thể nhập từ các script khác.
Mẫu gửi email cốt lõi:
📍 Nơi dán: Mở ChatGPT (chat.openai.com), Claude (claude.ai) hoặc Gemini (gemini.google.com) và bắt đầu một cuộc trò chuyện mới.
📋 Cách sao chép prompt này: Nhấp vào bất kỳ đâu bên trong khối màu xám, nhấn Cmd+A rồi Cmd+C (Mac) hoặc Ctrl+A rồi Ctrl+C (Windows). Hoặc sử dụng biểu tượng sao chép xuất hiện.
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
# 1. Create message
msg = MIMEMultipart("alternative")
msg["Subject"] = "Daily Report"
msg["From"] = sender
msg["To"] = ", ".join(recipients)
# 2. Attach both plain text and HTML
msg.attach(MIMEText(plain_text, "plain"))
msg.attach(MIMEText(html_content, "html"))
# 3. Send
with smtplib.SMTP(smtp_server, port) as server:
server.starttls()
server.login(username, password)
server.send_message(msg)
✏️ Cách điền thông tin chi tiết của bạn: Thay thế mỗi [] và trình giữ chỗ trong ngoặc bằng thông tin cụ thể từ tình huống thực tế của bạn. Thông tin đầu vào mơ hồ sẽ tạo ra kết quả mơ hồ — hãy cụ thể hơn.
👀 Những gì bạn sẽ thấy: Trong vòng vài giây, AI sẽ trả về một phản hồi có cấu trúc dựa vào prompt ở trên. Hãy đọc kỹ và coi đó là bản nháp, không phải câu trả lời cuối cùng.
📌 Nên làm gì với kết quả: Lưu phản hồi vào file Notes. Chọn gợi ý có hiệu quả cao nhất và thực hiện nó trong tuần này — đừng cố gắng làm tất cả cùng một lúc.
⚠️ Nếu kết quả không ổn: Nếu các gợi ý có vẻ chung chung, hãy dán nội dung sau: "Hãy cụ thể hơn với ngữ cảnh thực tế của tôi. Bỏ qua những lời khuyên chung chung." Nếu nó bỏ qua các chi tiết quan trọng bạn đã cung cấp, hãy hỏi: "Bạn đã bỏ sót [X] trong ngữ cảnh của tôi — hãy thực hiện lại với điều đó làm ràng buộc chính."
Script 2: Email báo cáo HTML
Prompt AI:
Viết một hàm Python tạo báo cáo email HTML từ một DataFrame của pandas: (1) Chuyển đổi DataFrame thành bảng HTML với CSS nội tuyến: màu hàng xen kẽ, tiêu đề in đậm, số căn phải, (2) Thêm phần tóm tắt phía trên bảng: tổng số hàng, các chỉ số chính (tổng, trung bình của các cột số), (3) Bao gồm ngày báo cáo và tiêu đề ngắn gọn, (4) Cung cấp một phiên bản plain text định dạng cùng dữ liệu dưới dạng bảng văn bản căn chỉnh, (5) Đính kèm dữ liệu thô dưới dạng file CSV. Tôi muốn gọi hàm này từ các script xử lý dữ liệu của mình để tự động gửi kết quả qua email.
Script 3: Cảnh báo có điều kiện
Prompt AI:
Viết một hệ thống cảnh báo bằng Python để giám sát các điều kiện và gửi thông báo: (1) Chấp nhận danh sách các điều kiện cần kiểm tra (ví dụ: "giá dưới 50 USD", "hết hàng", "thời gian phản hồi API > 5 giây"), (2) Đối với mỗi điều kiện được kích hoạt, gửi một email cảnh báo kèm theo chi tiết, (3) Giới hạn cảnh báo: tối đa 1 cảnh báo cho mỗi điều kiện mỗi giờ (theo dõi trong file JSON cục bộ), (4) Giới hạn toàn cầu: tối đa 10 cảnh báo mỗi giờ, (5) Ghi nhật ký tất cả các cảnh báo (đã gửi và bị chặn) vào file CSV, (6) Hỗ trợ các mức độ khẩn cấp: "thông tin" (chỉ email), "cảnh báo" (email + console), "nghiêm trọng" (email + console + lặp lại sau 15 phút). Trả về bản tóm tắt các cảnh báo đã gửi và bị chặn.
Các kênh thông báo thay thế
Email không phải là lựa chọn duy nhất. Nhiều script tự động hóa được hưởng lợi từ tin nhắn tức thời:
Kênh
Thư viện
Tốt nhất cho
Slack
slack_sdk
Thông báo nhóm, cảnh báo kênh
Discord
discord-webhook
Thông báo cá nhân, bot cộng đồng
Telegram
python-telegram-bot
Thông báo cá nhân thân thiện với thiết bị di động
Desktop
plyer
Thông báo pop-up cục bộ
Prompt AI cho thông báo Slack:
Viết một hàm Python gửi thông báo đến kênh Slack bằng URL webhook: (1) Chấp nhận văn bản tin nhắn, tiêu đề tùy chọn và mức độ khẩn cấp (thông tin/cảnh báo/nghiêm trọng), (2) Định dạng bằng Slack Block Kit để định dạng phong phú, (3) Bao gồm mã màu: xanh lá cây cho thông tin, vàng cho cảnh báo, đỏ cho nghiêm trọng, (4) Đọc URL webhook từ các biến môi trường.
Những thực tiễn tốt nhất về thông báo
Thực tiễn
Lý do
Triển khai
Cảnh báo kiểm soát
Ngăn chặn các cơn bão cảnh báo
Thời gian hồi chiêu cho mỗi trạng thái + giới hạn toàn hệ thống
Bao gồm ngữ cảnh
Người nhận cần thông tin có thể sử dụng được
Nguyên nhân gây ra sự kiện, giá trị hiện tại, ngưỡng, liên kết đến thông tin chi tiết
Plain text dự phòng
Không phải tất cả các trình duyệt đều hiển thị HTML
MIME đa phần với cả hai định dạng
Tự mình thử nghiệm trước
Hãy phát hiện và khắc phục các lỗi định dạng trước khi nhóm của bạn nhìn thấy chúng
Gửi email đến địa chỉ của chính bạn trước khi thêm người nhận
Cơ chế hủy đăng ký
Người nhận được tôn trọng
File cấu hình cho tùy chọn thông báo
✅ Kiểm tra nhanh: Script của bạn gửi email hàng ngày lúc 8 giờ sáng. Bạn muốn bỏ qua cuối tuần. Logic này nên được đặt ở đâu — trong script email hay trong bộ lập lịch?
Câu trả lời: Trong bộ lập lịch, không phải trong script email. Nhiệm vụ của script email là soạn thảo và gửi email khi được gọi. Nhiệm vụ của bộ lập lịch là quyết định khi nào gọi script email. Việc tách biệt các vấn đề này có nghĩa là bạn có thể sử dụng lại script email cho các lịch trình khác — chẳng hạn như tóm tắt hàng tuần vào thứ Sáu hoặc cảnh báo đột xuất bất cứ lúc nào. Prompt AI: "Thêm cấu hình lịch trình vào tự động hóa của tôi: chạy hàng ngày lúc 8 giờ sáng chỉ vào các ngày trong tuần, với một lịch trình riêng cho tóm tắt hàng tuần vào thứ Sáu lúc 5 giờ chiều."
Những điểm chính cần ghi nhớ
Không bao giờ hardcode thông tin đăng nhập email — hãy sử dụng biến môi trường hoặc mật khẩu dành riêng cho ứng dụng có thể bị thu hồi độc lập; Các dịch vụ email giao dịch (SendGrid, Mailgun) với API key chỉ gửi thậm chí còn an toàn hơn SMTP với mật khẩu email cá nhân của bạn.
Xây dựng cơ chế điều tiết cảnh báo ngay từ đầu: thời gian chờ cho mỗi điều kiện, giới hạn cảnh báo toàn cầu và loại bỏ trùng lặp giúp ngăn chặn một lỗi làm ngập hộp thư đến của bạn với hàng trăm thông báo — điều này bảo vệ bạn khỏi các lỗi mà bạn chưa viết.
Email HTML với các bảng CSS nội tuyến đơn giản giúp báo cáo tự động có thể đọc ngay lập tức mà không cần mở file đính kèm — luôn bao gồm một bản sao lưu plain text vì một số trình duyệt email sẽ loại bỏ HTML.
Câu 1:
Bạn muốn gửi email báo cáo hàng ngày lúc 8 giờ sáng với bảng hiển thị doanh số bán hàng ngày hôm qua. Bạn nên tạo bảng dưới dạng plain text hay HTML?
GIẢI THÍCH:
Email HTML với các bảng đơn giản là định dạng tốt nhất cho những báo cáo tự động vì chúng có thể đọc ngay lập tức mà không cần mở file đính kèm. Mấu chốt là giữ cho HTML đơn giản: CSS nội tuyến, bố cục dựa trên bảng và một phiên bản plain text dự phòng. HTML phức tạp với các bảng định kiểu bên ngoài sẽ bị lỗi trong những trình duyệt email. File đính kèm CSV rất tốt để bổ sung nhưng không nên là định dạng duy nhất.
Câu 2:
Script cảnh báo của bạn gửi cho bạn một email mỗi khi giá giảm xuống dưới 50 USD. Hôm nay API trả về lỗi cho một sản phẩm và script của bạn gửi 100 email cảnh báo trong 10 phút (lỗi này kích hoạt kiểm tra điều kiện liên tục). Làm thế nào để bạn ngăn chặn điều này?
GIẢI THÍCH:
Lượng cảnh báo quá tải là một trong những lỗi tự động hóa phổ biến nhất. Cửa sổ thời gian chờ, giới hạn số lượng cảnh báo theo từng điều kiện và giới hạn cảnh báo toàn cầu giúp ngăn chặn một lỗi duy nhất tạo ra hàng trăm thông báo. Vấn đề cơ bản (lỗi API kích hoạt logic cảnh báo) cũng cần được khắc phục, nhưng việc giới hạn số lượng cảnh báo sẽ bảo vệ bạn khỏi bất kỳ cơn bão cảnh báo bất ngờ nào — bao gồm cả những lỗi trong tương lai mà bạn chưa viết ra.
Câu 3:
Bạn viết một script tự động hóa email để gửi báo cáo bán hàng hàng ngày cho nhóm của mình. Bạn hardcode mật khẩu SMTP trong script. Một đồng nghiệp xem xét code của bạn và nêu lên mối lo ngại về bảo mật. Bạn trả lời: "Nhưng đó chỉ là mật khẩu email, không phải là API key." Đồng nghiệp của bạn có đúng khi lo ngại không?
GIẢI THÍCH:
Tất cả thông tin xác thực — mật khẩu email, API key, token — phải được lưu trữ an toàn bằng cách sử dụng biến môi trường, không được hardcode. Thông tin xác thực email đặc biệt nguy hiểm vì chúng thường cung cấp quyền truy cập đầy đủ vào hộp thư đến, không chỉ khả năng gửi. Mật khẩu dành riêng cho ứng dụng hoặc API email giao dịch với quyền hạn chế là cách tiếp cận an toàn.
Theo Nghị định 147/2024/ND-CP, bạn cần xác thực tài khoản trước khi sử dụng tính năng này. Chúng tôi sẽ gửi mã xác thực qua SMS hoặc Zalo tới số điện thoại mà bạn nhập dưới đây: