1 发送邮件
qq邮箱需要配置一下
import smtplib
from email.header import Header
from email.mime.application import MIMEApplication
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
def send_email_attach(self,subject,content, file_name,file_path):
# create msg
msg = MIMEMultipart()
msg['Subject'] = Header(subject, 'utf-8') # subject
msg['From'] = "{}".format(EMAIL_CONFIG['sender'])
msg['To'] = ",".join(EMAIL_CONFIG['receivers'])
# 附件
att = MIMEApplication(open(file_path, 'rb').read())
att.add_header('Content-Disposition','attachment',filename=file_name)
msg.attach(att)
# 文本
text = MIMEText(content,'html','utf-8')
msg.attach(text)
#
try:
print("开始发送邮件")
smtpObj = smtplib.SMTP_SSL(EMAIL_CONFIG['smtp']['host'], 465) # 启用SSL发信, 端口一般是465
smtpObj.login(EMAIL_CONFIG['smtp']['user'], EMAIL_CONFIG['smtp']['password']) # 登录验证
smtpObj.sendmail(EMAIL_CONFIG['sender'], EMAIL_CONFIG['receivers'], msg.as_string()) # 发送
print("mail has been send successfully.")
except smtplib.SMTPException as e:
print(e)
finally:
smtpObj.quit()
2 定时任务
'\t'
是为了解决csv
数字科学计数法的问题。使用apscheduler
管理定时任务
import pandas as pd
from sqlalchemy.engine import create_engine
from settings import MYSQL,ENV
from apscheduler.schedulers.blocking import BlockingScheduler
import datetime
import json
import csv
from email_service import EmailService
EAYC_MYSQL = MYSQL['eayc'][ENV]
eayc_engine = create_engine('mysql+pymysql://{}:{}@{}:{}/{}'.format(EAYC_MYSQL['user'], EAYC_MYSQL['pwd'],
EAYC_MYSQL['ip'],EAYC_MYSQL['port'], EAYC_MYSQL['db']),
connect_args={'charset': 'utf8'}, pool_size=50)
class WeekUserService(object):
def __init__(self):
self.emailService = EmailService()
def get_data(self,start,end):
sql = "select * from user where create_time>='{}' and create_time<='{}' order by create_time desc".format(start, end)
df = pd.read_sql(sql,eayc_engine)
return json.loads(df.to_json(orient='records'))
def week_report(self,start,end):
print('获取用户信息开始')
datas = self.get_data(start,end)
print('获取用户信息结束,开始生成附件信息')
if datas:
file_name = '{}.csv'.format(end)
with open(file_name,'w',encoding='utf_8_sig',newline='') as f:
csv_writer = csv.writer(f)
csv_writer.writerow(['用户账号','企业','编号号','创建日期','地区'])
for data in datas:
record = []
record.append(data['phone'])
record.append(data['name'])
if data['no']:
record.append(str(data['no'])+'\t')
else:
record.append("")
record.append(data['create_time'])
record.append(data['region'])
csv_writer.writerow(record)
content = "{}-{}期间,新增{}户".format(start, end, len(datas))
self.emailService.send_email_attach('日报({}-{})'.format(start,end),content,file_name,file_name)
def send_email_job():
print('开始统计用户信息')
now = datetime.datetime.now()
if now.weekday()==4:
# 星期五
start = now - datetime.timedelta(days=3)
else:
# 星期二
start = now - datetime.timedelta(days=4)
yesterday = now - datetime.timedelta(days=1)
weekUserService = WeekUserService()
weekUserService.week_report(start.strftime('%Y-%m-%d'),yesterday.strftime('%Y-%m-%d'))
print('用户信息发送完成')
if __name__ == '__main__':
print('开始执行任务')
sched = BlockingScheduler(timezone='Asia/Shanghai')
sched.add_job(send_email_job,'cron',day_of_week='tue,fri',hour=8,minute=45,id="send_week_user_id")
sched.start()