Python实现自动发送邮件
由于工作中每天需要定时跑模型,结果文档需每天邮件发送给业务同学,所以学习了如何使用python进行自动发送邮件,并设置成定时任务。
1.主要用到的包:
smtplib,email,apscheduler
2.SMTP简介:
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。
3.APScheduler简介
APScheduler(Advanced Python Scheduler)是一个轻量级的Python定时任务调度框架(Python库)
APScheduler有三个内置的调度系统,其中包括:
1).cron式调度(可选开始/结束时间)
2).基于间隔的执行(以偶数间隔运行作业,也可以选择开始/结束时间)
3).一次性延迟执行任务(在指定的日期/时间内运行作业一次)
4.代码部分
# -*- coding: utf-8 -*-
import smtplib
from email.mime.text import MIMEText
import datetime
from email.mime.multipart import MIMEMultipart
from email.header import Header
from apscheduler.schedulers.blocking import BlockingScheduler
import numpy as np
def my_job():
def create_email(email_from, email_to, email_Subject, email_text, annex_path, annex_name):
# 输入发件人昵称、收件人昵称、主题,正文,附件地址,附件名称生成一封邮件
# 生成一个空的带附件的邮件实例
message = MIMEMultipart()
# 将正文以text的形式插入邮件中
message.attach(MIMEText(email_text, 'plain', 'utf-8'))
# 生成发件人名称(这个跟发送的邮件没有关系)
message['From'] = Header(email_from, 'utf-8')
# 生成收件人名称(这个跟接收的邮件也没有关系)
message['To'] = Header(",".join(email_to), 'utf-8')
# 生成邮件主题
message['Subject'] = Header(email_Subject, 'utf-8')
# 读取附件的内容
att1 = MIMEText(open(annex_path, 'rb').read(), 'base64', 'utf-8')
att1["Content-Type"] = 'application/octet-stream'
# 生成附件的名称
att1.add_header("Content-Disposition", "attachment", filename=annex_name)
# 将附件内容插入邮件中
message.attach(att1)
# 返回邮件
return message
def send_email(mailto, msg):
try:
print('connecting ', mail_host)
s = smtplib.SMTP_SSL(mail_host, 465)
s.connect(mail_host)
print('login to mail_host')
s.login(mail_user, mail_pwd)
print('send email')
s.sendmail(mail_user, mailto, msg.as_string())
print('close the connection between the mail server')
s.close()
except Exception as e:
print('Exception: ', e)
mail_host = '发信服务器'
mail_user = '邮箱账号'
mail_pwd = '邮箱密码'
to_list = '接收方邮箱列表'
my_msg = create_email(mail_user, to_list, '正文内容',annex_path='文件地址', annex_name='正文内容')
send_email(to_list, my_msg)
return
if __name__ == '__main__':
sched = BlockingScheduler()
time = datetime.datetime.now()
hour = time.hour
minute = int(np.where(time.minute == 59, 0, time.minute + 1))
sched.add_job(my_job, "cron", day_of_week='mon-sun', hour=hour, minute=minute) # 将每天的任务设置成运行时间的后一分钟
print('Press Ctrl+{0} to exit'.format('Break' if os.name == 'nt' else 'C '))
sched.start()
try:
sched.start()
except (KeyboardInterrupt, SystemExit):
pass