解锁自动化办公新技能:Python实战应用-自动转发邮件到企业微信

📧 【高效联络,信息不落空】 📧

在这个信息爆炸的时代,作为企业的一员,我们如何从繁杂的邮件中迅速筛选出客户的心声、展会的新动向,同时又不遗漏每一份重要的咨询呢?秘诀就在我们的新策略里!

✨ 【自动收取,省时省力】

首先,我们要告别定时查收邮件的烦恼。新系统将自动收取邮件,确保你不错过任何一封重要邮件。

🚀 【智能分类,去芜存菁】

然后,邮件将经过智能筛选,自动分为“重要邮件”和“垃圾邮件”。初期,我们采用简单关键词过滤,未来将引入更高级的机器学习算法。

📢 【信息直达,快速响应】

重要邮件?直接转发到企业微信群!这样,团队成员可以迅速响应,提供所需帮助。

🔔 【及时通知,使命必达】

每当重要邮件到达,系统将及时通知相关同事,确保信息得到快速处理。对于邮件收取和信息转发,我们已经轻车熟路。还不熟悉的请看往期文章:

如何一键群发企业微信,钉钉消息。

但为了让新鲜邮件持续涌入,我们需要微调系统。每次收取邮件时,我们会记录时间戳,只获取最新的邮件。至于通知机制,那就更简单了:邮件一到,直接推送到相应的群组,有需要时,还可以通过@功能提醒具体同事。

不过,邮件分类可是个技术活。首个版本中,我们将使用简单关键词过滤,未来再引入更智能的机器学习技术。以下是整个程序工作的流程图。
在这里插入图片描述

代码编写

想象一下,如果你的系统能够记住查看最后一封邮件的时间,那每次收取邮件时,它只需要查找那个时间点之后的新邮件。这就好比有个超级智能的秘书,总是在记录和更新你的工作进度。酷吧?

保存这些时间数据有多种方法,你可以选择文本文件、数据库,甚至是电子表格。但在这个例子中,我们选择了一种更为轻便快捷的方式——使用pkl文件。

🖥 【Python小助手:pkl文件的妙用】

pkl文件是Python的一种序列化数据保存格式。这意味着你代码里的列表、字典等数据结构,都可以直接被保存和读取。就像是把你的数据打包,需要的时候再解开,超级方便!


import pickle
from datetime import datetime, timedeltatry:# 从pkl文件中读取数据with open('last_email.pkl', 'rb') as file:last_email = pickle.load(file)
except:# 如果文件不存在,则初始化为当前时间前1天rece_time = datetime.today() - timedelta(days=1),last_email = {'email_from': 'example1@163.com','receive_time': rece_time.strftime('%Y-%m-%d %H:%M:%S'),'email_subject': 'None'}# 保存pkl文件
with open('data.pkl', 'wb') as file:pickle.dump(last_email, file)

对邮件的接收时间字符串处理为datetime类型,时间转换函数parse_mail_time()的代码。

def parse_mail_time(mail_datetime):# 定义邮件时间解析函数# 定义GMT时间格式GMT_FORMAT = "%a, %d %b %Y %H:%M:%S"# 查找'+0'的位置index = mail_datetime.find(' +0')# 如果存在时区信息,则去掉时区信息,若公司有不同时区的邮件,需要优化代码if index > 0:mail_datetime = mail_datetime[:index]try:# 将字符串解析为datetime对象mail_datetime = datetime.strptime(mail_datetime, GMT_FORMAT)return mail_datetimeexcept:# 如果解析出错,则打印错误信息并返回Noneprint("邮件时间格式解析错误:" + mail_datetime)return None

现在来编写邮件内容处理函数parse_email_server,倒序遍历邮件,若邮件的接收时间小于上一次邮件的时间,则结束循环。如不是则为新邮件,进入send_content_to_wx(msg)函数,提取邮件信息并按主题发送到不同的企业微信群,代码如下。

def parse_email_server(email_server, last_email):def get_email_content(email_server, index):# 倒序遍历邮件,这样取到的第一封就是最新邮件resp, lines, octets = email_server.retr(index)# lines存储了邮件的原始文本的每一行,# 邮件的原始文本:# lines是邮件内容,列表形式使用join拼成一个byte变量msg_content = b'\r\n'.join(lines).decode('utf-8')# 解析邮件:return Parser().parsestr(msg_content)resp, mails, octets = email_server.list()num, total_size = email_server.stat()print("邮件数量为:" + str(num))# mails存储了邮件编号列表,index = len(mails)# 上一次邮件接收时间last_receive_time = datetime.strptime(last_email.get('receive_time'),"%Y-%m-%d %H:%M:%S")# 倒序遍历邮件for i in range(index, 0, -1):msg = get_email_content(email_server, i)# 邮件时间,解析时间格式mail_datetime = parse_mail_time(msg.get("date"))if mail_datetime:if mail_datetime <= last_receive_time:# 旧邮件不处理,后面的邮件都是旧邮件,可以跳出循环break# 解析邮件具体内容,并发送到企业微信send_content_to_wx(msg)if i == index:# 更新最新一封邮件msg = get_email_content(email_server, index)from_addr = parseaddr(msg.get('From'))[1]subject = decode_header(msg.get('Subject'))subject = subject[0][0].decode(subject[0][1]) if subject[0][1] else subject[0][0]mail_datetime = parse_mail_time(msg.get("date"))last_email = {'email_from': from_addr,'receive_time': mail_datetime.strftime("%Y-%m-%d %H:%M:%S"),'email_subject': subject}# 保存到文件里面with open('last_email.pkl', 'wb') as file:pickle.dump(last_email, file)# 别忘记退出email_server.quit()def send_content_to_wx(msg):from_addr = parseaddr(msg.get('From'))[1]to_addr = parseaddr(msg.get('To'))[1]subject = decode_header(msg.get('Subject'))subject = subject[0][0].decode(subject[0][1]) if subject[0][1] else subject[0][0]# 获取邮件的正文for part in msg.walk():if part.get_content_type() == 'text/plain' or part.get_content_type() == 'text/html':body = part.get_payload(decode=True).decode(part.get_content_charset() or 'utf-8')email_content = f"""发送方:{from_addr}接收方:{to_addr}主题:{subject}正文:{body}"""# 邮件主题关键词分类TARGET = [("展会", "展览", "广交会"),("咨询", "销售", "商品"),("简历", "招聘", "求职")]# 判断邮件类型,发送到对应群# 是否为市场部for key in TARGET[0]:if key in subject:send_msg_to_weixin(email_content,url=MARKET_ROBOT_URL)# 发送后可以返回return# 是否为销售部for key in TARGET[0]:if key in subject:send_msg_to_weixin(email_content, url=SALE_ROBOT_URL)return# 是否为人事部for key in TARGET[0]:if key in subject:send_msg_to_weixin(email_content, url=HR_ROBOT_URL)return# 如果都不是,默认发到行政部send_msg_to_weixin(email_content)

程序运行后,效果下图所示,左边是企业微信群的消息,右边是邮箱收到的消息。
在这里插入图片描述

定时任务

🕓 【Windows定时任务:让电脑自动工作】

想不想让你的电脑在特定时间自动做一些事情?比如,运行你的Python脚本?在Windows上,你可以通过“任务计划程序”来实现这个魔法。

1️⃣ 【开启任务计划程序】

在开始菜单里搜一搜“任务计划程序”,然后打开它。
点击“创建基本任务…”,给你的任务起个名字,再描述一下它是干什么的。

2️⃣ 【设置触发器】

决定什么时候开始这个任务:是电脑启动时,还是按照你的时间表?
设置好触发器,让电脑知道何时行动。
3️⃣ 【指定操作】

选择“启动程序”。
告诉电脑Python解释器在哪里,还有你的脚本在哪里。
把这些路径作为参数填进去。
4️⃣ 【额外设置】

如果需要,你可以设置一些条件,比如只有电脑空闲时才运行任务。
还可以设置任务结束的方式,比如任务可以运行一次就结束,或者重复进行。
5️⃣ 【完成创建】

检查一下任务摘要,确认一切设置正确。
点击“完成”,你的定时任务就设置好了!
6️⃣ 【管理任务】

如果你想立即运行任务,或者以后需要修改任务,可以在任务列表中找到它,进行相应的操作。
📅 【Linux定时任务:让终端自动执行】

在Linux上,设置定时任务就更简单了。只需要打开终端,输入下面的命令:

crontab -e

然后,在你的crontab文件里添加一个新的定时任务。每行代表一个任务,格式如下:

*/10 * * * * /usr/bin/python3 /path/to/your/script.py

这行的意思是,每10分钟执行一次你的脚本。每个星号代表一个时间单位:分钟、小时、日期、月份、星期几。设置好后,保存并退出,你的任务就会按计划执行了。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/9124.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Day3 | Java基础 | 4常见类

Day3 | Java基础 | 4 常见类 基础版Object类equalshashCode&#xff08;散列码&#xff09;hashCode和equals clone方法String类 问题回答版Object类Object类的常见方法有哪些&#xff1f;和equals()的区别是什么&#xff1f;为什么要有hashCode&#xff1f;hashCode和equals的…

FFmpeg常用命令详解与实战指南

下载地址&#xff1a;Releases BtbN/FFmpeg-Builds (github.com) 1. 获取视频信息 使用FFmpeg获取视频信息是最基本的操作之一。你可以使用-i选项指定输入文件&#xff0c;然后使用FFmpeg内置的分析器来获取视频的各种信息&#xff0c;包括视频编解码器、音频编解码器、分辨…

JAVA文件的简单操作

文件IO&#xff08;Input和Output&#xff09; 文件的输入和输出是人为规定的&#xff0c;那么什么是输入&#xff1f;什么是输出捏&#xff1f;在这里统一已CPU为基准 例如&#xff1a;将文件由内存写入硬盘就是输出&#xff0c;有硬盘写入内存就是输入。可以总结为&#xff…

OpenHarmony 3.2 Release版本实战开发——Codec HDI适配过程

简介 OpenHarmony Codec HDI&#xff08;Hardware Device Interface&#xff09;驱动框架基于 OpenMax 实现了视屏硬件编解码驱动&#xff0c;提供 Codec 基础能力接口供上层媒体服务调用&#xff0c;包括获取组件编解码能力、创建组件、参数设置、数据的轮转和控制、以及销毁…

C++反汇编,指针和内存分配细节,面试题05

文章目录 20. 指针 vs 引用21. new vs malloc 20. 指针 vs 引用 指针是实体&#xff0c;占用内存空间&#xff0c;逻辑上独立&#xff1b;引用是别名&#xff0c;与变量共享内存空间&#xff0c;逻辑上不独立。指针定义时可以不初始化&#xff1b;引用定义时必须初始化。指针的…

Cmake编译源代码生成库文件以及使用

在项目实战中&#xff0c;通过模块化设计能够使整个工程更加简洁明了。简单的示例如下&#xff1a; 1、项目结构 project_folder/├── CMakeLists.txt├── src/│ ├── my_library.cpp│ └── my_library.h└── app/└── main.cpp2、CMakeList文件 # CMake …

Python sqlite3库 实现 数据库基础及应用 输入地点,可输出该地点的爱国主义教育基地名称和批次的查询结果。

目录 【第11次课】实验十数据库基础及应用1-查询 要求: 提示: 运行结果&#xff1a; 【第11次课】实验十数据库基础及应用1-查询 声明&#xff1a;著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 1.简答题 数据库文件Edu_Base.db&#…

国内唯一!阿里云荣膺MongoDB“2024年度DBaaS认证合作伙伴奖”

近日&#xff0c;在MongoDB用户大会纽约站上&#xff0c;阿里云荣膺MongoDB“2024年度DBaaS认证合作伙伴奖”。这是阿里云连续第五年斩获MongoDB合作伙伴奖项&#xff0c;也是唯一获此殊荣的中国云厂商。 MongoDB是当今全球最受欢迎的非关系型数据库之一。凭借灵活的模式和丰富…

Unity 修复Sentinel key not found (h0007)错误

这个问题是第二次遇到了&#xff0c;上次稀里糊涂的解决了&#xff0c;也没当回事&#xff0c;这次又跑出来了&#xff0c;网上找的教程大部分都是出自一个人。 1.删除这个路径下的文件 C:\ProgramData\SafeNet Sentinel&#xff0c;注意ProgramData好像是隐藏文件 2.在Windows…

Redis(安装及配置)

1.什么是redis Redis 全称 Remote Dictionary Server&#xff08;即远程字典服务&#xff09;&#xff0c;它是一个基于内存实现的键值型非关系&#xff08;NoSQL&#xff09;数据库&#xff0c;由意大利人 Salvatore Sanfilippo 使用 C 语言编写。 2.优势 性能极高&#xff…

如何进行资产梳理

前言 为什么要进行资产梳理&#xff1f; 资产梳理方式一: 一、安全防护设备资产 二、对外开放服务项目资产 三、项目外包业务流程资产 资产梳理方式二: 一、业务资源梳理 二、设备资产梳理 三、第三方的服务信息梳理 风险梳理 风险有哪些&#xff1f; 一,账号权限风…

【VTKExamples::Rendering】第一期 TestAmbientSpheres(环境照明系数)

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享VTK样例TestAmbientShperes,介绍环境照明系数对Actor颜色的影响,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动…

《ESP8266通信指南》14-连接WIFI(基于Lua)

往期 《ESP8266通信指南》13-Lua 简单入门&#xff08;打印数据&#xff09;-CSDN博客 《ESP8266通信指南》12-Lua 固件烧录-CSDN博客 《ESP8266通信指南》11-Lua开发环境配置-CSDN博客 《ESP8266通信指南》10-MQTT通信&#xff08;Arduino开发&#xff09;-CSDN博客 《ES…

谷歌明年6月关闭 Google Fit 运动记录API,要求开发者迁移至Android Health平台 | 最新快讯

5 月 6 日消息&#xff0c;谷歌近日发布官方新闻稿&#xff0c;宣布将在明年 6 月使用 Android Health 平台取代 Google Fit 运动记录 API&#xff0c;开发人员应当尽早启动迁移计划。 谷歌自 2022 年起逐渐扩大对 Android Health 平台的投资&#xff0c;旨在减少平台碎片化&am…

Java17 --- SpringCloud之Zipkin链路追踪

目录 一、下载zipkin及运行 二、在父工程中引入pom依赖 三、在子工程8001引入相关pom依赖 3.1、修改yml配置文件 3.2、测试代码 四、在子工程80引入相关pom依赖 4.1、修改yml配置文件 4.2、测试代码 五、测试结果 一、下载zipkin及运行 运行控制台访问地址&#xff1…

Linux学习笔记1---Windows上运行Linux

在正点原子的教程中学习linux需要安装虚拟机或者在电脑上安装一个Ubuntu系统&#xff0c;但个人觉得太麻烦了&#xff0c;现在linux之父加入了微软&#xff0c;因此在Windows上也可以运行linux 了。具体方法如下&#xff1a; 一、 在Windows上的设置 在window的搜索框内&#…

【Java】还不会数组?一文万字全搞定

前言&#xff1a;前面两章我们详细讲解了Java基本程序设计结构中的基本知识&#xff0c;&#xff0c;包括&#xff1a;一个简单的Java应用&#xff0c;注释&#xff0c;数据类型&#xff0c;变量与常量&#xff0c;运算符&#xff0c;字符串&#xff0c;输入输出&#xff0c;控…

写爬虫代码抓取Asterank中小行星数据

2024年5月4日 问题来源 解决方案 回顾2023年7月14日自己写的爬虫代码 import requests import re import pandas as pd texts[] def getData(page):#每页评论的网址urlhttps://item.jd.com/51963318622.html#comment#添加headers&#xff0c;伪装成浏览器headers{User-Agent:…

即插即用 | YOLOv8热力图可视化方法详解,揭秘AI如何「看」世界!【附完整源码】

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

vivado 低级别 SVF JTAG 命令、多链 SVF 操作

多链 SVF 操作 以下示例显示了如何在 SVF 链上处理操作。 每个链中连接有 2 个器件 &#xff1a; xcku11 和 xcku9 。配置存储器连接到链中的第 2 个器件 (xcku9) 。为访问此配置存储器 &#xff0c; SVF 会使用 HIR 、 HDR 、 TIR 和 TDR 命令来生成命令。为刷写此…