1. 程式人生 > >Python3:自動發送賬單郵件

Python3:自動發送賬單郵件

wid ont 技術 www. size 還款 att username driver

Python3:自動發送賬單郵件

一、前言

民間借貸,沒有信用卡那樣,每月會收到賬單;為了民間借貸管理更加合理化,寫了個還款賬單小程序。

二、源碼

(1)配置文件代碼:

[dbmysql]
ip = localhost
port = 3306
user = root
password = ******
dbname = pythondb

[dbtime]
starttime = 220000

[dbemail]
username = ******@qq.com
password = ******
smtp = smtp.qq.com
sender = ******@qq.com
receiver 
= ******@qq.com sign_company = ****** sign_addr = ****** sign_dept = ****** sign_name =****** sgin_email = ******@qq.com sign_phone = ****** sign_qq = ****** sign_www = http://www.******.com [dbpath] logpath = E:\logs\autoemail

(2)程序代碼:

# python3
# author:lizm
# date:2018-07-19 10:00:00 
# -*- coding: utf-8 -*-
‘‘‘ description:自動發送賬單郵件 ‘‘‘ import logging import configparser import sys import datetime,time from smtplib import SMTP_SSL from email.header import Header from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart import pymysql from selenium import webdriver from sqlalchemy import
Column, Integer, String, DateTime, create_engine from sqlalchemy.orm import sessionmaker from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import and_, func class Email(object): def __init__(self, hkrq, sqjyje, rll, bqyhlx, bqhkje, bqjyje, remark): self.hkrq = hkrq self.sqjyje = sqjyje self.rll = rll self.bqyhlx = bqyhlx self.bqhkje = bqhkje self.bqjyje = bqjyje self.remark = remark def __get__(self, instance, cls): if instance is None: return self else: return instance.__dict__[self.name] def __set__(self, instance, value): instance.__dict__[self.name] = value def __delete__(self, instance): del instance.__dict__[self.name] # 獲取配置文件信息 def dbconfig(): # 生成config對象 cfg = configparser.ConfigParser() # 讀取配置文件(此處是utf-8-sig,而不是utf-8) cfg.read(sys.path[0]+"\dbconfig.ini",encoding="utf-8-sig") # dbmysql ip = cfg.get("dbmysql","ip") port = cfg.get("dbmysql","port") user = cfg.get("dbmysql","user") pwd = cfg.get("dbmysql","password") dbname = cfg.get("dbmysql","dbname") # dbtime starttime = cfg.get("dbtime","starttime") # dbemail username = cfg.get("dbemail","username") password = cfg.get("dbemail","password") smtp = cfg.get("dbemail","smtp") sender = cfg.get("dbemail","sender") receiver = cfg.get("dbemail","receiver") sign_company = cfg.get("dbemail","sign_company") sign_addr = cfg.get("dbemail","sign_addr") sign_dept = cfg.get("dbemail","sign_dept") sign_name = cfg.get("dbemail","sign_name") sgin_email = cfg.get("dbemail","sgin_email") sign_phone = cfg.get("dbemail","sign_phone") sign_qq = cfg.get("dbemail","sign_qq") sign_www = cfg.get("dbemail","sign_www") # dbpath logpath = cfg.get("dbpath","logpath") return (ip,port,user,pwd,dbname,starttime,username,password,smtp,sender,receiver,sign_company,sign_addr,sign_dept,sign_name,sgin_email,sign_phone,sign_qq,sign_www,logpath) #郵件定義 mail_info = { "from": dbconfig()[9], "to": dbconfig()[10], "hostname": dbconfig()[8], "username": dbconfig()[6], "password": dbconfig()[7], "mail_subject": "還款賬單("+time.strftime("%Y%m%d")+"", "mail_text": "你好, this is a test email, sended by py", "mail_encoding": "utf-8", "sign_all": "簽名" } # 配置日誌 logger = logging.getLogger() # 設置文件 file = logging.FileHandler(sys.path[0]+"\logs"+time.strftime("%Y%m%d")+".log") #file = logging.FileHandler(dbconfig()[11]+"\log"+time.strftime("%Y%m%d")+".log") # set formatter formatter = logging.Formatter("%(asctime)s %(levelname)s %(message)s") file.setFormatter(formatter) logger.addHandler(file) # set log level logger.setLevel(logging.NOTSET) #查詢最新的數據 def qryData(): try: # 打開數據庫連接 conn = pymysql.connect(host=dbconfig()[0], user=dbconfig()[2],passwd=dbconfig()[3], db=dbconfig()[4], port=int(dbconfig()[1]), charset=utf8) # 獲取一個遊標 cursor = conn.cursor() # 查詢數據庫中的最新數據 sql_date = """select bqjyje,rll from """+dbconfig()[4]+""".py_email order by hkrq desc limit 1 ;""" #print(‘sql_check>>>:%s‘ %sql_date) cursor.execute(sql_date) results = cursor.fetchall() # 判斷是否有記錄數 if len(results) != 0: r_date = results[0] cursor.close() # 關閉遊標 conn.close() # 釋放數據庫資源 except: logger.info("Email異常(qryData):獲取最新數據失敗") print("Email異常(qryData):獲取最新數據失敗") r_bqjyje = r_date[0] r_rll = r_date[1] return (r_bqjyje,r_rll) #數據入庫處理 def saveData(rp): r_code = 0 try: # 打開數據庫連接 conn = pymysql.connect(host=dbconfig()[0], user=dbconfig()[2],passwd=dbconfig()[3], db=dbconfig()[4], port=int(dbconfig()[1]), charset=utf8) # 獲取一個遊標 cursor = conn.cursor() sql = """INSERT INTO """+dbconfig()[4]+""".py_email(hkrq,sqjyje,rll,bqyhlx,bqhkje,bqjyje,remark,createtime) VALUES(‘"""+rp.hkrq+"""‘,‘""" + rp.sqjyje + """‘,‘"""+rp.rll+"""‘,‘""" + rp.bqyhlx + """‘,‘""" + rp.bqhkje + """‘,‘""" + rp.bqjyje + """‘,‘‘,sysdate());""" try: #print(‘sql>>>:‘ + sql) # 執行sql語句 cursor.execute(sql) # 提交到數據庫執行 conn.commit() r_code = 0 except: # 如果發生錯誤則回滾 conn.rollback() r_code = 1 cursor.close() # 關閉遊標 conn.close() # 釋放數據庫資源 except: r_code = 1 if r_code ==1: logger.info("Email異常(saveData):數據入庫失敗") print("Email異常(saveData):數據入庫失敗") else: logger.info("還款賬單已生成並發送郵件") print("還款賬單已生成並發送郵件") return r_code def send(rp): #使用SMTP_SSL就是默認使用465端口 smtp = SMTP_SSL(mail_info["hostname"]) #set_debuglevel()是用來調試的。參數值為1表示開啟調試模式,參數值為0關閉調試模式 smtp.set_debuglevel(0) #連接服務器 smtp.ehlo(mail_info["hostname"]) #郵箱登錄 smtp.login(mail_info["username"], mail_info["password"]) msg = MIMEMultipart() #填寫正文內容 main_html = """ <html> <head></head> <body> <div font-size:15px;background-color:#FFFFFF;"> <div> <span style="line-height:3;">------------------------還款賬單("""+rp.hkrq+""")------------------------</span> </div> <div> <span style="line-height:1.5;">應還總金額:"""+rp.sqjyje+"""元</span> </div> <div> <span style="line-height:1.5;">本期還款:"""+rp.bqhkje+"""元</span> </div> <div> <span style="line-height:1.5;">本期利息:"""+rp.sqjyje+"""(本金)*"""+rp.rll+"""(萬分之三/日)*30(天)="""+rp.bqyhlx+"""元</span> </div> <div> <span style="line-height:1.5;">------------------------</span> </div> <div> <span style="line-height:1.5;">剩余應還總金額:"""+rp.sqjyje+"""(本金)+"""+rp.bqyhlx+"""(利息)-"""+rp.bqhkje+"""(本期還款)="""+rp.bqjyje+"""元</span> </div> <p><br/></p> <div> <span style="line-height:1.5;">————————————</span> </div> </div> <div style="font-size:13px;background-color:#FFFFFF;"> <div style="font-family:Verdana;"> <div> <span style="font-size:13px;line-height:1.5;">公司:"""+dbconfig()[11]+"""</span> </div> <div> <span style="font-size:13px;line-height:1.5;">通訊地址:"""+dbconfig()[12]+"""</span> </div> <div> <span style="font-size:13px;line-height:1.5;">"""+dbconfig()[13]+""""""+dbconfig()[14]+"""</span> </div> <div> <span style="font-size:13px;line-height:1.5;">郵箱:<a href=‘mailto:"""+dbconfig()[15]+"""‘ target="_blank">"""+dbconfig()[15]+"""</a></span> </div> <div> <span style="font-size:13px;line-height:1.5;">手機:"""+dbconfig()[16]+"""</span> </div> <div"> <span style="font-size:13px;line-height:1.5;">QQ:"""+dbconfig()[17]+"""</span> </div> <div> <span style="font-size:13px;line-height:1.5;">公司網址:<a href=‘"""+dbconfig()[18]+"""‘ target="_blank">"""+dbconfig()[18]+"""</a></span> </div> </div> </div> <p><br/></p> </body> </html> """ main_msg = MIMEText(main_html, "html", mail_info["mail_encoding"]) msg.attach(main_msg) #填寫郵件標題 msg["Subject"] = Header(mail_info["mail_subject"], mail_info["mail_encoding"]) #發送者郵箱地址 msg["from"] = mail_info["from"] #接收者郵件地址 msg["to"] = mail_info["to"] try: #發送郵件 smtp.sendmail(mail_info["from"], mail_info["to"], msg.as_string()) #退出 smtp.quit() #入庫操作 saveData(rp) except: logger.info("還款賬單生成失敗") print("還款賬單生成失敗") if __name__ == __main__: bqhkje = input("請輸入還款金額:") print("還款賬單生成中...") hkrq = time.strftime(%Y%m%d) rdata = qryData() sqjyje = rdata[0] rll = rdata[1] bqhklx = str(float(sqjyje)*float(rll)*30) #bqhkje = ‘3500.00‘ bqjyje = str(float(sqjyje)+float(bqhklx)-float(bqhkje)) remark = "" #print("參數%s,%s,%s,%s,%s,%s" %(hkrq,sqjyje,rll,bqhklx,bqhkje,bqjyje)) rp = Email(hkrq,sqjyje,rll,bqhklx,bqhkje,bqjyje,remark) send(rp)

三、效果

技術分享圖片

Python3:自動發送賬單郵件