Python 提取資料庫(Postgresql)並郵件發送

來源:互聯網
上載者:User

標籤:cell   資料   ftime   psycopg2   串連數   日期時間   入門   dma   ber   

剛入門python,發現確實是一個不錯的語言。


業務部門要求將將某一個資料庫中的表,定期發送到相關部門人員郵箱。


其實整個業務需求很簡單,實現起來也不難。

但是由於剛入門python,所以還是借鑒了不上網上的內容,也得到了許多群友的提醒。


業務部門使用的是Postgresql資料庫,所以使用 了psyconpg2的模組。

整個指令碼分為三部分:

1.資料庫的串連及資料寫入excel表中(整個對新手來說,應該是痛點)

2.郵件的發送

3.產生excel檔案的刪除


# coding: utf-8

import sys

import xlwt

import psycopg2

import datetime

import time

import smtplib

from email.mime.multipart import MIMEMultipart

from email.mime.text import MIMEText

from email.mime.application import MIMEApplication

import os.path

 

# 串連資料庫的參數:主機,使用者,密碼,連接埠及資料庫名稱

host = '192.168.1.77'

user = 'postgres'

pwd = 'postgres'

port = 5432

db = 'pytest'

 

sheet_name = 'report' + time.strftime("%Y-%m-%d")

filename = 'report_' + time.strftime("%Y-%m-%d" + "-" + "%H%M%S") + '.xls'

out_path = "d:/test/report_" + time.strftime("%Y-%m-%d" + "-" + "%H%M%S") + ".xls"  # 路徑檔案名稱使用日期時間來命名,但是檔案命名不支援冒號:所以去掉冒號

cur_path = 'd:/test'

 

print(out_path)

sql = 'select * from website;'

 

 

def export():

    # 資料庫連接

    conn = psycopg2.connect(dbname=db, user=user, password=pwd, host=host, port=port)

    cursor = conn.cursor()

    cursor.execute(sql)

    result = cursor.fetchall()

    count = cursor.rowcount

    print("Select  " + str(count) + "  Records")

 

    # cursor.scroll(0, mode='relative')

    fields = cursor.description    # 資料表的標題

    workbook = xlwt.Workbook(encoding='utf-8')          # 建立excel文檔

    sheet = workbook.add_sheet(sheet_name, cell_overwrite_ok=True)  # 根據sheet_name 建立excel文檔的sheet

    for field in range(1, len(fields)):      # 寫入資料表的檔案頭

        sheet.write(0, field, fields[field][0])

 

    # 逐行逐列的添加資料

    for row in range(1, len(result) + 1):

        for col in range(0, len(fields)):

            sheet.write(row, col, u'%s'%result[row-1][col])

    workbook.save(out_path)    # 按照out_path的格式和路徑儲存excel表格

 

 

_user = "[email protected]"

_pwd = "123456."

areceiver = "[email protected]"

acc = "[email protected]"

 

# 如名字所示Multipart就是多個部分

msg = MIMEMultipart()

msg["Subject"] = u'[Data Select_' + time.strftime("%Y-%m-%d") + u']'

msg["From"] = _user

msg["To"] = areceiver

msg["Cc"] = acc

 

 

def send_email():

    conn = psycopg2.connect(dbname=db, user=user, password=pwd, host=host, port=port)

    cursor = conn.cursor()

    cursor.execute(sql)

    cursor.fetchall()

    count = cursor.rowcount   # summary rows number

    # ----這是文字部分-----

    content = '''Dear All, \n 附件是每日統計情況,請查收!

    總計結果數位:''' + str(count)

 

    part = MIMEText(content, 'plain', 'utf-8')

    msg.attach(part)

    if count > 0:

        # 這是附件部分

        # xls類型附件

        file_name = 'd:/test/' + filename

        part = MIMEText(open(file_name, 'rb').read(), 'base64', 'gb2312')

        part["Content-Type"] = 'application/octet-stream'

        basename = os.path.basename(file_name)

        # part["Content-Disposition"] = 'attachment; filename=%s' % basename.encode('utf-8')

        part['Content-Disposition'] = 'attachment; filename=%s' % basename

 

        # part.add_header('Content-Disposition', 'attachment', filename=('utf-8', basename))

        msg.attach(part)

        s = smtplib.SMTP('mail.ucinbox.com', timeout=120)  # 串連smtp郵件伺服器

        s.login(_user, _pwd)

        s.sendmail(_user, areceiver.split(',') + acc.split(','), msg.as_string())  # send mail

        print("Email send successfully")

        s.close()

    else:

        print("nothing to send!")

 

 

# 刪除產生的excel檔案

# 之前使用的是將不同的excel放入不同的檔案夾,所以寫了遍曆刪除所有excel

def delete(path):

    ls = os.listdir(cur_path)

    for l in ls:

        path_file = os.path.join(path,l)  # 取檔案路徑

        if os.path.isfile(path_file):

            os.remove(path_file)

        else:

            for f in os.listdir(path_file):

                path_file2 = os.path.join(path_file,f)

                if os.path.isfile(path_file2):

                    os.remove(path_file2)

 

    # 調用函數

if __name__ == "__main__":

        export()

        send_email()

        delete(cur_path)

 

 


Python 提取資料庫(Postgresql)並郵件發送

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.