python 自动发送邮件

news/2025/2/26 7:34:56

    对于工作中,如果每日需要发送具有规律性的邮件,采用python自动发送可以节约很多时间,提高效率。本文主要以腾讯企业邮箱为例,介绍python自动发送邮件(含附件)的功能。为保护隐私,代码中的邮箱及授权码已替换,测试使用时更换为实际邮箱和授权码即可。

1. 获取授权码

  授权码类似于密码,每家邮箱几乎都有,本文以腾讯企业邮箱为例,对应授权码在设置-账户设置的目录下,对应开通协议后即可过的授权码。

2. 源代码

  本章节主要介绍不含附件,即纯文本的邮件发送,主要的步骤如下:

1. 传入邮箱账号和密码,进行登录

2. 传入邮件标题和内容,以及附件(没有可以不写)

3. 传入收件人邮箱,发送邮件

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
from email.mime.application import MIMEApplication
import os
import datetime


class Send_Eamil(object):
    def __init__(self, mailbox, pwd, addressee, title, text, attachments=None):
        self.email_host = "smtp.exmail.qq.com"  # 发送邮件的服务器,此处以腾讯企业邮箱为例
        self.email_user = mailbox  # 发送者的邮箱
        self.email_pwd = pwd  # 授权码
        self.email_port = 465  # 服务器SSL端口号,默认是465
        self.addressee = addressee  # 收件人邮箱,格式为列表
        self.title = title  # 邮件标题
        self.text = text  # 邮件正文内容
        self.attachments = attachments  # 附件,格式为列表,对应添加绝对路径的文件名
        return

    def log_in(self):
        # 登录邮箱,并检验是否成功
        smtpSSL = smtplib.SMTP_SSL(self.email_host, self.email_port)  # 创建SSL对象
        loginRes = smtpSSL.login(self.email_user, self.email_pwd)  # 输入账号和授权码,进行登录
        log_code = loginRes[0]  # 登录对应返回的编码,235表示成功
        if log_code == 235:
            print('登录邮箱成功!')
            return smtpSSL
        else:
            print('登录邮箱失败,报错编码:', log_code)
            os._exit(0)
    def write_email(self):
        # 创建邮件,并写入信息
        mail = MIMEMultipart()  # 创建邮件
        mail['From'] = Header(self.email_user, 'utf-8')  # 发件人
        mail['To'] = Header(",".join(self.addressee), 'utf-8')  # 收件人列表
        mail['Subject'] = Header(self.title, 'utf-8')  # 邮件标题
        mail.attach(MIMEText(self.text, 'plain', 'utf-8'))  # 邮件正文内容
        # 添加附件,若没有则不添加
        if self.attachments == None:
            pass
        else:
            # 循环读取附件并添加
            for num in range(len(self.attachments)):
                document = self.attachments[num]
                try:
                    document_name = document.split('/')[-1]  # 剔除绝对路径后的文件名
                except:
                    document_name = '附件' + str(num + 1) + document
                one_doc = MIMEApplication(open(document, 'rb').read())  # 读取附件
                one_doc['Content-Type'] = 'application/octet-stream'  # 设置格式
                # 添加附件标题
                one_doc.add_header('Content-Disposition', 'attachment', filename=document_name)
                mail.attach(one_doc)
        return mail
    def send(self):
        # 发送邮件
        mail = Send_Eamil.write_email(self)
        smtpSSL = Send_Eamil.log_in(self)
        try:
            smtpSSL.sendmail(self.email_user, self.addressee, mail.as_string())
            print('邮件发送成功')
        except Exception as e:
            print('邮件发送失败,报错为:',e)

if __name__ == '__main__':
    today = datetime.date.today().strftime("%Y%m%d")
    title = today+'业绩报告'
    text = today + 'xxx产品涨跌幅为:{},xx指数涨跌幅为:{},跑赢指数:{}'.format('1%','0.5%','0.5%')
    mailbox = "send.cn"
    pwd = "password"
    addressee = ["adr.cn"]
    Send_Eamil(mailbox, pwd, addressee, title, text).send()

  对应测试的结果如下:

3. 功能优化

   在需要增加附件的情况下,可以将所需要的附件都放在一个文件夹中,自动读取,然后加入邮件中发送。

     构建函数,读取上述文件夹下的文件,并保存为列表,其中的文件格式为‘绝对路径+文件名’ ,例如:‘D/桌面/附件/表格.xlsx’。函数的代码如下:

def get_attachments(file_Path):
    # 获取附件
    attachment_list = []
    for i, j, doc_list in os.walk(file_Path):
        for doc in doc_list:
            attachment_list.append(file_path + doc)
    return attachment_list


if __name__ == '__main__':
    file_path = 'C:/xx/xxx/Desktop/附件/'
    attachments = get_attachments(file_path)
    today = datetime.date.today().strftime("%Y%m%d")
    title = today + '业绩报告'
    text = today + 'xxx产品涨跌幅为:{},xx指数涨跌幅为:{},跑赢指数:{}'.format('1%', '0.5%', '0.5%')
    mailbox = "send.cn"
    pwd = "password"
    addressee = ["adr.cn", "adr1.cn"]
    Send_Eamil(mailbox, pwd, addressee, title, text, attachments).send()

  发送后的结果为:

4. 完全自动化

   发送邮件的问题解决了,但是每次发送时,都需要run一次代码。为了避免忘记,可以采取定时任务+启动脚本的方式,来自动发送邮件,这种情况下,只需要每日更新一下发送的内容即可(如果内容是固定格式,可以考虑使用自动生成的思路)。

 启动脚本的创建:新建一个txt文本,输入一下内容,再将脚本名称后缀改为“.bat”即可。

关于脚本的创建和定时任务网上资料非常多,这里也就不再进一步叙述。


http://www.niftyadmin.cn/n/5242802.html

相关文章

代理的三种方式

代理模式 代理模式(Proxy Pattern)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象,这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象…

在 AlmaLinux 9.2 上安装Oracle Database 23c

在 AlmaLinux 9.2 上安装Oracle Database 23c 1. 安装 Oracle Database 23c2. 连接 Oracle Database 23c3. 重启启动后,手动启动数据库4. 重启启动后,手动启动 Listener5. 手动启动 Pluggable Database6. 自动启动 Pluggable Database7. 设置开机启动数据…

2023-12-05 LeetCode每日一题(到达首都的最少油耗)

2023-12-05每日一题 一、题目编号 2477. 到达首都的最少油耗二、题目链接 点击跳转到题目位置 三、题目描述 给你一棵 n 个节点的树(一个无向、连通、无环图),每个节点表示一个城市,编号从 0 到 n - 1 ,且恰好有 …

linux优化-平均负载率

什么是平均负载率 平均负载是指单位时间内,系统处于 可运行状态 和 不可中断状态 的平均进程数,也就是平均活跃进程数,它和 CPU 使用率并没有直接关系。 可运行状态 是指正在使用 CPU 或者正在等待 CPU 的进程,也就是我们常用 …

【沐风老师】3DMAX切片工具插件安装使用方法详解

3DMAX切片工具安装使用方法 3DMAX切片工具,该工具沿世界坐标轴以规则的间隔对对象进行切片处理。例如,对于快速均匀细分复杂网格、顶点绘制或应用“弯曲”修改器非常有用。 【适用版本】 3dMax2016 - 2023(不仅限于此范围) 【安装…

【从零认识ECS云服务器 | 快速上线个人网站】二、使用ECS云服务器

第二章 使用ECS 2.1 获取ECS 方式一:通过试用中心免费领取ECS实例 满足以下全部条件的阿里云用户,可免费试用云服务器ECS: 阿里云注册会员用户并完成阿里云企业认证或个人认证用户。申请用户是云服务器ECS产品的新用户,可以申…

记录华为云服务器(Linux 可视化 宝塔面板)-- Nginx配置出现500错误记录

文章目录 1、路由配置,访问显示500如有启发,可点赞收藏哟~ 1、路由配置,访问显示500 错误如图显示500 解决思路如下 1、先查看错误日志 错误日志存放位置 提示 /login配置的文件有问题 开始配置如下图 修改前 修改后(即在/l…

配置REST API数据访问

大家好,才是真的好。 我希望你看过前一篇内容《Domino REST API安装和运行》。没有看过也没有关系,毕竟你可以点击上面的链接再去看一遍。 至于这一篇,趁热打铁,我们主要来讲述如何配置Domino Rest API的数据访问。 首先这里有…