NX Lab

Gửi email báo cáo kết quả chạy hàng loạt bằng smtplib: nội dung UTF-8, đính kèm CSV, không lộ mật khẩu

#Python#Tích hợp#Email1 lượt xem

  1. Quản trị viênQuản trị· 0 điểm

    Câu hỏi ·

    Tác vụ chạy đêm cần báo kết quả cho người phụ trách vào sáng hôm sau. Thư viện smtplib và email của Python đủ để gửi thư UTF-8 có đính kèm CSV. Điều quan trọng nhất là không viết mật khẩu vào code.

    Gửi email báo cáo kết quả chạy hàng loạt… Gửi email báo cáo kết quả chạy hàng loạt…

    Các bước thực hiện

    1. Đọc cấu hình từ môi trường. Máy chủ, cổng, người gửi, mật khẩu.
    2. Dựng thư. EmailMessage với tiêu đề, nội dung UTF-8.
    3. Đính kèm file. add_attachment với MIME phù hợp.
    4. Gửi bằng TLS. starttls trước khi đăng nhập.
    5. Xử lý lỗi. Không làm hỏng tác vụ chính nếu gửi thư lỗi.

    Code tham khảo (Python)

    import mimetypes
    import os
    import smtplib
    from email.message import EmailMessage
    
    def gui_bao_cao(tieu_de, noi_dung, nguoi_nhan, file_dinh_kem=None):
        may_chu = os.environ.get("NXLAB_SMTP_HOST")
        cong = int(os.environ.get("NXLAB_SMTP_PORT", "587"))
        nguoi_gui = os.environ.get("NXLAB_SMTP_USER")
        mat_khau = os.environ.get("NXLAB_SMTP_PASS")
        if not (may_chu and nguoi_gui):
            raise RuntimeError("Chưa cấu hình biến môi trường SMTP (NXLAB_SMTP_HOST, NXLAB_SMTP_USER)")
    
        thu = EmailMessage()
        thu["Subject"] = tieu_de
        thu["From"] = nguoi_gui
        thu["To"] = ", ".join(nguoi_nhan)
        thu.set_content(noi_dung, charset="utf-8")
    
        for duong_dan in (file_dinh_kem or []):
            loai, _ = mimetypes.guess_type(duong_dan)
            chinh, phu = (loai or "application/octet-stream").split("/", 1)
            with open(duong_dan, "rb") as f:
                thu.add_attachment(f.read(), maintype=chinh, subtype=phu, filename=os.path.basename(duong_dan))
    
        with smtplib.SMTP(may_chu, cong, timeout=20) as s:
            s.starttls()
            if mat_khau:
                s.login(nguoi_gui, mat_khau)
            s.send_message(thu)
    
    def main():
        try:
            gui_bao_cao("NX Lab - báo cáo chạy đêm",
                        "Tác vụ đã hoàn tất. Chi tiết trong file đính kèm.\nKết quả: 118 thành công, 2 lỗi.",
                        ["ky.thuat@congty.vn"],
                        ["D:/NXLab_xuat/bao_cao_step.csv"])
            print("Đã gửi thư")
        except Exception as ex:
            print("Không gửi được thư (tác vụ chính vẫn hoàn tất):", ex)
    
    if __name__ == "__main__":
        main()
    

    Giải thích code

    • Thông tin máy chủ và mật khẩu đọc từ biến môi trường; không bao giờ đưa vào mã nguồn hay kho Git.
    • set_content(..., charset="utf-8") đảm bảo tiếng Việt có dấu hiển thị đúng.
    • Bọc việc gửi thư trong try/except để lỗi mạng thư không làm mất kết quả tác vụ chính.

    Lỗi thường gặp

    • Nhiều dịch vụ thư yêu cầu mật khẩu ứng dụng riêng thay vì mật khẩu tài khoản; xin quản trị mạng.
    • Đừng gửi dữ liệu thiết kế mật qua thư ngoài công ty; chỉ gửi báo cáo tổng hợp.

    Code mang tính tham khảo, viết cho NX 12 trở lên (Python journal). Tên menu và một số lớp có thể khác theo phiên bản NX; hãy chạy thử trên bản sao của chi tiết trước khi dùng cho dữ liệu thật.

    Điểm: 0

Trả lời

Đăng nhập để tham gia thảo luận.