Sử dụng Python kết nối Database xuất file report và gửi qua Email

Trong quá trình làm việc, có một số yêu cầu gửi báo cáo định kỳ hàng ngày, hàng tháng, hàng quý từ Kinh doanh sang anh em Vận hành hệ thống. Hôm nay mình sẽ viết một bài hướng dẫn sử dụng Python để kết nối đến database xuất file báo cáo và gửi file

Trong quá trình làm việc, có một số yêu cầu gửi báo cáo định kỳ hàng ngày, hàng tháng, hàng quý từ Kinh doanh sang anh em Vận hành hệ thống.

Hôm nay mình sẽ viết một bài hướng dẫn sử dụng Python để kết nối đến database xuất file báo cáo và gửi file báo cáo qua email.
Ở đây mình sử dụng database Mysql, định dạng file export là xls.

image.png

1. Chuẩn bị

  • Cài đặt thư viện mysql-connector cho việc kết nối database mysql: pip install mysql-connector-python
  • Cài đặt thư viện xlwt cho việc xử lý file excel: pip install xlwt
  • Cài đặt thư viện smtplib cho việc gửi email: pip install smtplib

2. Code xử lý

Tạo file report_python.py, nội dung file như dưới.

Import thư viện

#!/usr/bin/python
# -*- coding: utf8 -*-

import mysql.connector
import xlwt
#import datetime
from datetime import date, timedelta
import time

###Lib smpp###
import smtplib
import os.path as op
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from email.utils import COMMASPACE, formatdate
from email import encoders

Hàm export file xls từ database Mysql

workbook = xlwt.Workbook(encoding ='utf-8') # workbook is the carrier on which sheet depends.
def main(sql,sheet,sheet_name):
     myconn = mysql.connector.connect(host = "10.144.xxxx.xxxx", user = "xxxx",
     passwd = "xxxx", database= "xxxx")
     cursor = myconn.cursor()
     result = cursor.execute(sql)
     #Search all results
     results = cursor.fetchall()
     # Get the data field name in MYSQL
     fields = cursor.description
     sheet = workbook.add_sheet(sheet_name,cell_overwrite_ok=True)
     # Write field information
     for field in range(0,len(fields)):
          sheet.write(0,field,fields[field][0])
         # Get and write data segment information
     row = 1
     col = 0
     for row in range(1,len(results)+1):
          for col in range(0,len(fields)):
               sheet.write(row,col,u'%s'%results[row-1]
	
) workbook.save(out_path)

Hàm gửi email

####Email##
def send_mail(send_from, send_to, subject, message, files=[],
              server="localhost", port=587, username='', password='',
               use_tls=True):
     """Compose and send email with provided info and attachments.
     Args:
        subject (str): message title
        message (str): message body
        files (list[str]): list of file paths to be attached to email
        server (str): mail server host name
        port (int): port number
        username (str): server auth username
        password (str): server auth password
        use_tls (bool): use TLS mode
     """
     msg = MIMEMultipart()
     msg['From'] = send_from
     msg['To'] = COMMASPACE.join(send_to)
     msg['Date'] = formatdate(localtime=True)
     msg['Subject'] = subject

     msg.attach(MIMEText(message))

     for path in files:
          part = MIMEBase('application', "octet-stream")
          with open(path, 'rb') as file:
               part.set_payload(file.read())
          encoders.encode_base64(part)
          part.add_header('Content-Disposition',
                        'attachment; filename="{}"'.format(op.basename(path)))
          msg.attach(part)

     smtp = smtplib.SMTP(server, port)
     if use_tls:
          smtp.starttls()
     smtp.login(username, password)
     smtp.sendmail(send_from, send_to, msg.as_string())
     smtp.quit()

Hàm main

yesterday=date.today() - timedelta(1)
filename = 'report_'+time.strftime("%Y-%m-%d")+'.xls'
out_path = '/home/ht_anhln/scripts/file/report_'+time.strftime("%Y-%m-%d")+'.xls'
sheet01 = 'report'+time.strftime("%Y-%m-%d")

#Get the data whose release time and system time are the same month
sql01 = "Câu lệnh sql các bạn cần export dữ liệu từ database"

if name == 'main':   
     main(sql01,sheet01,sheet01)
     ##Body
     localtime = time.asctime( time.localtime(time.time()) )
     Body = "File report ABC ngày: " + time.strftime("%Y-%m-%d")
     send_mail('anhln12@xxxx.vn', ['anhln12@xxxx.vn','a@xxxx.vn','b@xxxx.vn','c@xxxx.vn'], 'File report hàng ngày', Body,[out_path],'email.xxxx.vn',587,'anhln12@xxxx.vn','Password','True')

3. Kết quả
Mình đặt crontab chạy report và gửi email hàng ngày

image.png

Bài sau mình sẽ hướng dẫn kết nối Database Oracle.

Nguồn: viblo.asia

Bài viết liên quan

WebP là gì? Hướng dẫn cách để chuyển hình ảnh jpg, png qua webp

WebP là gì? WebP là một định dạng ảnh hiện đại, được phát triển bởi Google

Điểm khác biệt giữa IPv4 và IPv6 là gì?

IPv4 và IPv6 là hai phiên bản của hệ thống địa chỉ Giao thức Internet (IP). IP l

Check nameservers của tên miền xem website trỏ đúng chưa

Tìm hiểu cách check nameservers của tên miền để xác định tên miền đó đang dùn

Mình đang dùng Google Domains để check tên miền hàng ngày

Từ khi thông báo dịch vụ Google Domains bỏ mác Beta, mình mới để ý và bắt đầ