对于固化的周期性报表,我们可以使用定时任务自动化处理,本文简单介绍下 Python定时邮件发送报表 的实现过程。

1. 邮箱设置

要想在Python中登录我们的邮箱并发送邮件,首先需要对我们的邮箱进行设置,让其允许第三方客户端登录。以163邮箱为例,我们需要在设置中开启SMTP服务,开启SMTP服务时其会给我们一个授权密码,我们要把这个授权码记录下来以便后续使用,如下图所示。

2. 代码开发

定时发送邮件,实质是发送邮件和定时执行两个功能的组合。发送邮件,我们通过emailsmtplib这2个包来实现。定时执行,我们通过schedule包来实现,也可以使用Windows系统自带的计划任务来实现。以下是完整的实现代码:

#导入包
import numpy as np
import pandas as pd
import smtplib
import email
from email import encoders
from email.header import Header
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication


#数据处理
def data_process():
    #这里简化处理,实际替换为工作中的取数代码
    data = pd.DataFrame({'列1':[1, 3, 5, 7, 9], '列2':[2, 4, 6, 8, 10]})
    data.to_excel(r'.\运营日报.xlsx', index=False)


#发送邮件
def send_mail():
    #数据处理
    data_process()
    
    
    #创建邮件对象实例
    mail = MIMEMultipart()


    #设置邮件正文
    mail_body = """
    你好:

    附件是运营日报,请查收!
    """

    mail.attach(MIMEText(mail_body, 'plain', 'utf-8'))


    #设置邮件附件
    attach_file = MIMEApplication(open(r'.\运营日报.xlsx', 'rb').read())
    attach_file.add_header('Content-Disposition', 'attachment', filename='运营日报.xlsx')
    mail.attach(attach_file)


    #设置邮件发送信息
    mail_from = 'boxwsh@163.com'    #发件人邮箱地址
    mail_to = ['987008184@qq.com']    #收件人邮箱地址列表
    mail_cc = ['boxwsh@126.com']    #抄送人邮箱地址列表

    mail["From"] = mail_from    #发件人邮箱显示名称
    mail["To"] = ','.join(mail_to)    #收件人邮箱显示名称
    mail["Cc"] = ','.join(mail_cc)    #抄送人邮箱显示名称

    mail["Subject"] = Header('运营日报','utf-8')    #添加邮件主题


    #发送邮件
    mail_token = 'XXXXXXXXXXXX'    #发件人邮箱的授权码
    mail_host = "smtp.163.com"    #SMTP服务器
    smtp = smtplib.SMTP(mail_host, 25)    #创建SMTP对象
    smtp.login(mail_from, mail_token)    #登录邮箱
    
    from_addr = mail_from
    to_addrs = mail_to + mail_cc
    smtp.sendmail(from_addr, to_addrs, mail.as_string())    #发送邮件
    smtp.quit()    #断开连接



#使用schedule模块定时执行
import schedule
import time

schedule.every(1).minutes.do(send_mail)    #每1分钟执行1次,测试的时候用
#schedule.every().day.at("08:00").do(send_mail)    #每天早上8点执行

while True:
    schedule.run_pending()
    time.sleep(1)

3. 报错处理

代码首次执行过程中,可能会遇到报错:SMTPHeloError: (500, b’Error: bad syntax’),此时按照网上的解决办法处理后再重新执行代码即可。

4. 执行结果

因为我们测试设置的是每1分钟执行1次,执行以上代码后,我们登录查看邮箱,能够看到每1分钟会收到一封对应的邮件,如下图所示,说明代码运行正常,可正式部署。


原创文章,转载请务必注明出处并留下原文链接。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注