Chào mọi người,
Dạo gần đây mình thấy các bài viết trong chuyên mục Tin học mở rộng tập trung nhiều vào tự động hóa xử lý dữ liệu trong Excel. Mình cũng đang áp dụng một số giải pháp và thấy hiệu quả, đặc biệt là với việc gửi báo cáo định kỳ. Hôm nay mình muốn chia sẻ một cách tự động hóa việc gửi báo cáo Excel qua email bằng Python, hy vọng sẽ giúp ích cho các bạn nào đang làm các công việc tương tự.
Công việc này tuy không quá phức tạp nhưng nếu làm thủ công thì tốn khá nhiều thời gian, nhất là khi có nhiều báo cáo cần gửi cho các bộ phận khác nhau.
Yêu cầu:
- Cài đặt Python trên máy tính.
- Cài đặt thư viện
pandasvàopenpyxlđể đọc file Excel. - Cài đặt thư viện
smtplibvàemailđể gửi email.
Các bước thực hiện:
- Đọc dữ liệu từ file Excel: Sử dụng
pandas.read_excel()để nạp dữ liệu vào DataFrame. - Chuẩn bị nội dung email: Tạo tiêu đề, người nhận, và phần nội dung email. Có thể đính kèm file Excel trực tiếp hoặc gửi link tải file nếu lưu trên cloud.
- Thiết lập kết nối SMTP: Sử dụng
smtplibđể kết nối đến máy chủ email của bạn (ví dụ: Gmail, Outlook). - Gửi email: Sử dụng đối tượng
MIMEMultipartđể tạo email, đính kèm file nếu cần, và gửi đi bằngserver.sendmail().
Mình có một đoạn code mẫu đơn giản để gửi một file Excel cụ thể:
import pandas as pd
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
# Thông tin email
sender_email = "your_email@gmail.com"
sender_password = "your_app_password"
receiver_email = "recipient_email@example.com"
# Tạo đối tượng email
message = MIMEMultipart()
message["From"] = sender_email
message["To"] = receiver_email
message["Subject"] = "Báo cáo hàng ngày"
# Nội dung email
body = "Xin chào,
Đây là báo cáo hàng ngày của bạn. Vui lòng xem file đính kèm.
Trân trọng,
Đội ngũ của bạn"
message.attach(MIMEText(body, "plain"))
# Đính kèm file Excel
filename = "bao_cao.xlsx"
attachment = open(filename, "rb")
part = MIMEBase("application", "octet-stream")
part.set_payload(attachment.read())
encoders.encode_base64(part)
part.add_header("Content-Disposition", f"attachment; filename= {filename}")
message.attach(part)
# Kết nối SMTP và gửi email
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls() # Mã hóa kết nối
server.login(sender_email, sender_password)
text = message.as_string()
server.sendmail(sender_email, receiver_email, text)
server.quit()
print("Email đã được gửi thành công!")
Lưu ý: Đối với Gmail, bạn cần bật "Less secure app access" hoặc tạo "App Password" để sử dụng.
Đây chỉ là một ví dụ cơ bản, các bạn có thể tùy biến thêm như đọc danh sách người nhận từ một file khác, gửi email theo lịch trình cố định bằng schedule hoặc APScheduler, hoặc tạo báo cáo động trước khi gửi.
Rất mong nhận được thêm các ý kiến đóng góp và chia sẻ từ mọi người!