Menu

Tự động hóa gửi email báo cáo Excel hàng tháng bằng Python và `smtplib`

Thẩm Thúy Trung 13/06/2026 16:11 375 lượt xem 3 trả lời

Chào các bác, hôm nay em muốn chia sẻ một chút kinh nghiệm về việc tự động hóa gửi email báo cáo Excel hàng tháng. Công việc của em thỉnh thoảng phải gửi các báo cáo tổng hợp cho sếp, mà làm thủ công thì mất công quá, nhất là khi file báo cáo có thể thay đổi tên file hoặc đường dẫn.

Em đã tìm hiểu và dùng Python để giải quyết vấn đề này. Cụ thể là dùng thư viện smtplib để gửi email và email.mime để tạo nội dung email có đính kèm file.

Cách làm cơ bản:

  • Đầu tiên, các bác cần chuẩn bị file báo cáo Excel mà mình muốn gửi.
  • Tiếp theo, viết một đoạn script Python để thực hiện các bước sau:
    • Kết nối đến máy chủ email (ví dụ: Gmail, Outlook).
    • Tạo nội dung email, bao gồm tiêu đề, người nhận, người gửi và phần thân email.
    • Đính kèm file Excel báo cáo vào email.
    • Gửi email đi.

Code mẫu cho việc gửi email đính kèm file Excel (với Gmail) sẽ như sau:

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders


msg = MIMEMultipart()
msg['From'] = 'your_email@gmail.com'
msg['To'] = 'recipient_email@example.com'
msg['Subject'] = 'Bao cao thang [Thang] [Nam]'

body = """Dear Team,\n\nXin vui long xem file bao cao dinh kem.\n\nBest regards,\nYour Name"""
msg.attach(MIMEText(body, 'plain'))

filename = "BaoCao_Thang_10_2023.xlsx" # Ten file Excel cua ban
attachment = open(filename, "rb")

part = MIMEBase('application', 'octet-stream')
part.set_payload((attachment).read())
encoders.encode_base64(part)
part.add_header('Content-Disposition', "attachment; filename= %s" % filename)

msg.attach(part)

server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login('your_email@gmail.com', 'your_password')
text = msg.as_string()
server.sendmail('your_email@gmail.com', 'recipient_email@example.com', text)
server.quit()

Lưu ý:

  • Các bác cần thay thế 'your_email@gmail.com', 'your_password', 'recipient_email@example.com' và tên file cho phù hợp.
  • Đối với Gmail, các bác có thể cần bật chế độ 'Less secure app access' hoặc tạo mật khẩu ứng dụng.
  • Để chạy tự động hàng tháng, các bác có thể dùng Task Scheduler trên Windows hoặc cron job trên Linux để lên lịch chạy script này.

Hy vọng chia sẻ này hữu ích cho các bác nào đang làm công việc tương tự. Nếu có câu hỏi hoặc cách làm hay hơn, mọi người cùng thảo luận nhé!

5

Hay quá bạn ơi! Mình cũng đang đau đầu vụ gửi báo cáo Excel thủ công hàng tháng đây. Bạn có thể chia sẻ chi tiết hơn về cách bạn xử lý trường hợp tên file hoặc đường dẫn báo cáo thay đổi được không? Mình dùng Python cũng được một thời gian nhưng mảng tự động hóa gửi email này vẫn còn khá mới với mình.

0

Tuyệt vời! Chia sẻ của bạn rất hữu ích, đặc biệt là với những ai đang muốn tối ưu hóa quy trình làm việc.

Về việc xử lý tên file hoặc đường dẫn báo cáo thay đổi, mình thường dùng một cách kết hợp. Thay vì hardcode tên file vào script, mình sẽ lưu đường dẫn báo cáo vào một file cấu hình (ví dụ: .ini hoặc .json). Script Python sẽ đọc đường dẫn này từ file cấu hình. Khi nào báo cáo thay đổi tên hoặc vị trí, mình chỉ cần cập nhật lại file cấu hình đó là xong, không cần sửa code.

Bạn đã thử cách này chưa, hay có cách nào khác hiệu quả hơn không? Rất muốn học hỏi thêm!

5

Cảm ơn bạn đã chia sẻ cách dùng file cấu hình, rất hay và tiện lợi! Mình cũng hay dùng cách tương tự cho các thông tin nhạy cảm như mật khẩu email để tránh lộ trong code.

Nhân tiện, mình đang tìm hiểu cách để gửi email có định dạng HTML cho đẹp hơn thay vì chỉ đính kèm file Excel. Bạn đã có kinh nghiệm về phần này chưa? Nếu có, chia sẻ thêm cho anh em với nhé!

3

Bạn cần đăng nhập để trả lời chủ đề này.

Đăng nhập Đăng ký