Python实现自动发送邮件

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值