Chào các bác, dạo này em đang tìm hiểu về Python để tự động hóa mấy cái báo cáo lặp đi lặp lại ở công ty. Thấy chuyên mục Tin học mở rộng có nhiều bài hay quá, em cũng mạnh dạn chia sẻ một chút kinh nghiệm cá nhân về việc tự động hóa gửi báo cáo hàng tháng qua email.
Cái này thì không mới, có lẽ nhiều bác đã dùng VBA hay Power Automate rồi. Nhưng hôm nay em muốn giới thiệu cách làm bằng Python, nó khá linh hoạt và mạnh mẽ, đặc biệt khi các bác cần xử lý dữ liệu phức tạp trước khi gửi.
Mục tiêu: Tự động tạo báo cáo (ví dụ: file Excel, PDF) và gửi email đính kèm cho người nhận vào cuối mỗi tháng.
Công cụ cần dùng:
- Python 3.x
- Thư viện
pandas(để xử lý dữ liệu, tạo file Excel) - Thư viện
smtplibvàemail(để gửi email)
Các bước chính:
- Tạo báo cáo: Sử dụng
pandasđể đọc dữ liệu, xử lý, tổng hợp và lưu thành file Excel (hoặc định dạng khác tùy nhu cầu). Ví dụ, nếu cần tạo file Excel:import pandas as pd df = pd.read_csv('data.csv') # ... xử lý dữ liệu ... report_file = 'bao_cao_thang.xlsx' df.to_excel(report_file, index=False) - Chuẩn bị nội dung email: Tạo tiêu đề, nội dung email. Có thể lấy tên file báo cáo động theo tháng.
from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from email.mime.base import MIMEBase from email import encoders import datetime now = datetime.datetime.now() thang_hien_tai = now.strftime('%m/%Y') msg = MIMEMultipart() msg['From'] = 'your_email@gmail.com' msg['To'] = 'recipient@example.com' msg['Subject'] = f'Bao cao thang {thang_hien_tai}' body = "Kinh gui anh/chi, Xin vui long xem file bao cao dinh kem. Trân trọng," msg.attach(MIMEText(body, 'plain')) - Đính kèm file báo cáo:
part = MIMEBase('application', 'octet-stream')
part.set_payload(open(report_file, 'rb').read())
encoders.encode_base64(part)
part.add_header('Content-Disposition', f'attachment; filename= {report_file}')
msg.attach(part)smtplib để kết nối đến server email và gửi. Lưu ý bật chế độ 'less secure app access' hoặc tạo mật khẩu ứng dụng cho Gmail.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@example.com', text)
server.quit()Các bác có thể kết hợp thêm schedule hoặc APScheduler để lên lịch chạy tự động script này vào thời điểm mong muốn. Em thấy cách này rất tiện, đỡ phải thao tác thủ công nhiều.
Có bác nào có kinh nghiệm hay cách làm khác hay hơn không, chia sẻ cho em học hỏi với ạ!