python邮件发送带附件

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()

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

warrah

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值