控制飞书客户端自动发邮件

自动化飞书邮箱网页版应该有不少例子,可以使用Clicknium、Selenium,Playwright这些工具实现。这次使用[Clicknium](https://www.clicknium.com/)来介绍一下桌面客户端的自动化,进一步讲解如果利用Python实现桌面端自动化。想要写一个能稳定运行的自动化脚本,并不容易,过程中需要不停修正定位数据。很多时候,我们看到脚本的结果,但很少有教程描述,脚本是怎么一步一步写出来的。
首先,我们要明确自动化的需求。举一个最简单的场景:群发邮件。与过年群发祝福消息类似,想要别人不知道这则消息是群发的,就需要在消息中带上对方独特的属性,比如名字等。现在不少提供模板方式群发邮件的服务都是收费的。其实我们使用Python+Clicknium的方式可以很快实现一个根据模板群发邮件的程序。
有了需求,我们需要理清楚实现自动化的基本步骤:
1. 材料:邮件模板
2. 材料:邮箱列表和模板填充数据
3. 操作:将模板填充数据,填入邮件模板中
4. 操作:用飞书客户端将填充数据后的模板,根据邮箱地址发送出去
下面是简单的样例:

邮件模板(sample.txt):

Hi {name},
Welcome! Do you like our product?Regards,
Kay  

其中{name}就是一个占位符(placeholder),在实际邮件中会被详细信息中的userName替换掉。 
邮箱列表(user.csv):

emailuserName
xxx@gmail.comJack
xxx@qq.comHuaHua Wong


准备环境:
- Windows 7 SP1+ 
- VS Code
- Clicknium: 参考 quick start , 不在此详述
- 飞书
下面我们详细描述怎么把这个sample一步一步做出:
1. Python启动飞书:
 

import subprocessdef main():process = subprocess.Popen("C:\\Users\\kay\\AppData\\Local\\Feishu\\Feishu.exe")  #replace with your feishu.exe path这里我们利用subprocess将飞书启动起来。 

2. 点击邮箱按钮,进入飞书邮箱,新建邮件:

在这一步,为了方便我将邮箱从更多列表中拖入左侧任务栏中,并放置在第五个。

利用抓取按钮,点击上图的邮箱图标,抓取按键。

抓取后我们可以在locator store中看到刚抓取的UI元素

从上图中可以看到,Clicknium利用上面的属性来定位元素。大概看一下,其中最重要的应该是第九行。 index=6 最终定位了这个按钮的位置。还可以得到的信息是,获取元素位置采用了UIA技术,按钮的name属性为空,意味着飞书团队并没有给改按钮命名,我们无法通过name标识这个按钮。index并不是固定的,随意拖动邮箱图标都会导致index位置变化。但是这个方式比较高效,如果该脚本需要给别人使用,我们可以采用图像识别的方式。可以通过上图的Validation确定能不能定位到元素,通过Action尝试点击操作是否能成功。
补充上面的代码:

from clicknium import clicknium as cc, locator
import subprocessdef main():process = subprocess.Popen("C:\\Users\\kay\\AppData\\Local\\Feishu\\Feishu.exe")  #replace with your feishu.exe pathcc.find_element(locator.feishu.mailbutton).click()if __name__ == "__main__":main()


这部分代码中,引入了clicknium库,通过locator.feishu.mailbutton可以定位到邮箱图标,对其点击操作。clicknium通过将locator传入find_element()函数就找到对应的UI元素,然后直接对其进行操作。通过F5运行,看是否能够成功执行。运行成功飞书会打开一个新的窗口,如下图:

第一步,抓取收件人输入框。Recorder在auto配置下得到下图的locator:

在auto档捕获技术下使用的是UIA技术,点击validation可以找到元素,点击action-->set_text失败。看来UIA技术还需要调优,我们点击Recapture尝试使用IA技术。

切换IA技术后得到上图的locator,确认Validate和Action都能成功运行。同样的方式,我们抓取下图的主题\正文发送按钮


文本处理
邮件模板放在项目根目录中的sample.txt文件中,简单用Python直接读取数据即可。

f = open(r".\sample.txt")mailtxt = f.read()


然后读取csv文件中的邮箱和用户名信息:

with open('user.csv') as f:f_csv = csv.DictReader(f)


定一个发送邮件的函数,接受模板内容、邮箱和用户名:

from clicknium import clicknium as cc, locator,UiElement
import subprocess
import csvdef main():process = subprocess.Popen("C:\\Users\\kay\\AppData\\Local\\Feishu\\Feishu.exe")  #replace with your feishu.exe pathcc.find_element(locator.feishu.mailbutton).click()f = open(r".\sample.txt")mailtxt = f.read()with open('user.csv') as f:f_csv = csv.DictReader(f)for u in f_csv:#sendMai(u['email'],u['username'],mailtxt)print("email:",u['email'],"username:",u['username'])if __name__ == "__main__":main()


实现sendMail方法
发送有邮件的函数步骤:
1. 用户名替换模板placeholder(文本处理)
2. 点击写新邮件的按钮(click)
3. 填写收件人邮箱地址(click)
4. 填写邮件主题(set_text)
5. 填写邮件内容(set_text)
6. 点击发送按钮(click)

实现:

def sendMai(mail, name, text):username = getName(name)mailcontent = text.replace("{name}",username)cc.find_element(locator.feishu.newmailbutton).click()cc.find_element(locator.feishu.recipient).set_text(mail, by='sendkey-after-click')cc.find_element(locator.feishu.title_text).set_text("Welcome to Clicknium", by='sendkey-after-click')   paste_text(cc.find_element(locator.feishu.content_ia),mailcontent)cc.find_element(locator.feishu.send_button).click()
def sendMai(mail, name, text):username = getName(name)mailcontent = text.replace("{name}",username)cc.find_element(locator.feishu.newmailbutton).click()cc.find_element(locator.feishu.recipient).set_text(mail, by='sendkey-after-click')cc.find_element(locator.feishu.title_text).set_text("Welcome to Clicknium", by='sendkey-after-click')   paste_text(cc.find_element(locator.feishu.content_ia),mailcontent)cc.find_element(locator.feishu.send_button).click()


第一行对用户名做一个简单的处理,去掉特殊字符,首字母大写等。第二行用文本替换,处理模板占位符。
之后点击飞书客户端写新邮件的按钮 之后我们填写收件人:

cc.find_element(locator.feishu.recipient).set_text(mail, by='sendkey-after-click')


点击查看set_text函数,或者查函数文档

从描述中可知,clicknium提供三种输入文本的方法。set-text是系统调用,性能是最好的,直接将一段文本设置上去,但不是所有场景都可用。sendkey-after-click和sendkey-after-focus是采用模拟键盘输入的方法,主要解决的就是点击或设置关注后才激活的问题,简单说来就是模拟鼠标和键盘,所以字母也是一个一个敲进去的,消耗的实际就比较长。这里我们采用sendkey-after-click。

在设置完邮件主题后,发现邮件这个弹框上的文本会根据主题变化,会对定位弹框有影响,我们检查locator store中的locator对其进行一定的泛化处理。

打开邮件文本的locator:

通过locator中的配置信息, 可以看到发件人, 邮件主题,收件人这些信息都用来帮助定位元素了。这就意味着,其中任何一项信息发生变化,很可能就无法定位元素了。邮件主题,发件人, 收件人发生变化就无法使用的话,泛化能力就太差了,自动化脚本的可用性和稳定性都会大大降低。Clicknium Locator中的配置信息是可以直接修的,也提供了一些方式解决泛化的能力:

  • 每一项配置前都有一个check box。取消勾选,这项配置就不参与定位。对于特殊元素,如果在定位中不起决定性作用,可以尝试取消勾选,使用validation和action测试是否依然有效。

  • 如果配置中只有部分内容参与定位,尤其是位于配置的头尾,我们可以直接选中,在右侧修改配置信息。删除特殊内容,测试是否有效。

  • 通配符:可在配置中使用通配符

  • 正则表达式:可在配置中使用正则表达式

  • 变量 :可在配置中使用变量 可以在文档中查看parametric locator章节

去掉与邮件主题,发件人,收件人相关的配置,就能提高泛化能力,使用不同账号给不同的人发送邮件了。 邮件主题可以采用变量的方式配置。

在邮件正文locator的配置中,我们发现其定位到的是一个group,并不是edit,我们模拟鼠标键盘输入的方式,一个按键一个按键点击的速度是比较慢的 所以我们采用复制张贴的方式,将文本内容写入剪贴板,然后利用粘贴功能写入文本。这里需要利用pyperclip库,使用pip install pyperclip安装利用下面的函数使用张贴功能:

def paste_text(webEle:UiElement,text:str):webEle.send_hotkey('^a',preaction="click")webEle.send_hotkey('^x',preaction="click")pyperclip.copy(text)webEle.send_hotkey('^v',preaction="click")

最后点击发送按钮即可。

下面是完整代码:

Github: Feishu Mail

from clicknium import clicknium as cc, locator,UiElement
import subprocess
import csv
import pyperclipdef main():process = subprocess.Popen("C:\\Users\\kay\\AppData\\Local\\Feishu\\Feishu.exe")  #replace with your feishu.exe pathcc.find_element(locator.feishu.mailbutton).click()f = open(r".\sample.txt")mailtxt = f.read()with open('user.csv') as f:f_csv = csv.DictReader(f)for u in f_csv:sendMai(u['email'],u['username'],mailtxt)def sendMai(mail, name, text):username = getName(name)mailcontent = text.replace("{name}",username)print("email:",mail," name:",username)cc.find_element(locator.feishu.newmailbutton).click()cc.find_element(locator.feishu.edit_ia).set_text(mail, by='sendkey-after-click')cc.find_element(locator.feishu.title_text).set_text("Welcome to Clicknium", by='sendkey-after-click')   paste_text(cc.find_element(locator.feishu.content_ia),mailcontent)cc.find_element(locator.feishu.send_button).click()def getName(userName):return userName.split(",")[0].split("@")[0].split(" ")[0].split(".")[0].capitalize()def paste_text(webEle:UiElement,text:str):webEle.send_hotkey('^a',preaction="click")webEle.send_hotkey('^x',preaction="click")pyperclip.copy(text)webEle.send_hotkey('^v',preaction="click")if __name__ == "__main__":main()

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

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

相关文章

利用Python自动发送邮件

自动发送邮件 我们把报表做出来以后一般都是需要发给别人查看,对于一些每天需要发的报表或者是需要一次发送多份的报表,这个时候可以考虑借助Python来自动发送邮件。 使用邮箱的第一步 一般我们在使用QQ邮箱、163邮箱、126邮箱等这些比较常用的邮箱时…

Python实现自动写邮件

Python实现自动写邮件 上星期接到任务要完成一个自动写邮件的脚本,基本功能是每两小时执行一次程序跑出统计表格,并将统计表格的summary发送到领导的邮箱。由于公司是做数字货币的,每两小时实时监测策略交易情况较为必要。下面来实现自动写邮…

day06 代码实现邮件自动发送

目录 一. 邮件发送基本流程二. 添加文件附件三. 发送富文本四. 发送图片五. 认识前端HTML ————————— 获取邮箱授权码————————— 一. 邮件发送基本流程 生活中发送邮件的步骤: 注册邮箱信息 —> 打开登录邮箱的网址 —> 输入账号密码完成登录…

Python实现自动发送邮件 - 自动抓取Blog中留言的邮箱并发送邮件

Python实现自动发送邮件 - 自动抓取博客/网站中留言的邮箱并发送邮件 背景脚本要解决的问题:实现方法代码及解析1. AutoSendEmailByBlogComments.py2. FileOperation.py3. SendEmail.py 备注:邮箱SMTP设置其它好玩的Python脚本 博主热门文章推荐&#xf…

python自动发送邮件实现

目录 1 前言2 准备工作2.1 电子邮件的基础知识。2.2 python邮件库2.3 邮箱设置 3 python实现邮件自动发送3.1 SMTP()和send()方法介绍3.2 python实现实例 参考信息 1 前言 python功能强大,可以实现我们日常办公的很多任务。诸如批量处理word,excel,pdf等等文件&…

VBA使用Outlook自动发送邮件

↓↓↓欢迎关注我的公众号,在这里有数据相关技术经验的优质原创文章↓↓↓ 基础版本–能自动发送就是成功 利用VBA使用Outlook自动发送邮件,代码及注释如下: Sub send_mail()Dim ObjOL As Object Dim itmNewMail As Outlook.MailItem Dim…

Python实现自动发送邮件

最近比较闲的慌,在自己学习Python爬虫,学到了用Python发送邮件,觉得这个可能以后比较实用。以下项目用QQ邮箱为例。 需要用到的模块: smtplib,email 提醒!QQ 邮箱一般默认关闭SMTP服务,我们得…

chatgpt赋能python:Python写模拟器脚本

Python写模拟器脚本 Python是一种强大的编程语言,适用于各种任务,包括模拟器编写。模拟器是一种软件程序,能够模拟硬件或软件系统的行为。这篇文章将介绍Python编写模拟器脚本时需要关注的一些关键点。 为什么选择Python编写模拟器脚本 Py…

chatgpt赋能python:Python在线模拟器:让编程变得更加轻松

Python 在线模拟器:让编程变得更加轻松 介绍 Python 在线模拟器是一个非常实用的工具,它可以帮助用户直接在浏览器中测试和运行 Python 代码。在线模拟器的出现简化了编程过程,不需要安装 Python IDE 等软件,只需要有一台连接互…

老子简介(函谷关道德经)

老子简介 老子(约前580~前500年之后),姓李名耳。字聃,春秋时期楚国人,道家学派创始人。曾在东周国都洛邑(今河南洛阳)任守藏史(相当于国家图书馆馆长)。他博学多才,晚年乘青牛西去,在函谷关前写成《道德经》。 老子主…

【天天读书】《道德经》第十六章

《道德经》第十六章 [原文] 致虚极,守静笃①; 万物并作②,吾以观复③。 夫物芸芸④,各复归其根。 归根⑤曰静,静曰⑥复命⑦。 复命曰常⑧,知常曰明⑨。 不知常,妄作凶。 知常容⑩,容乃公, 公乃全⑾,全乃天⑿, 天乃道,道乃久, 没身不殆。 [译文] 尽力…

论文学习——VideoGPT

论文学习——VideoGPT: Video Generation using VQ-VAE and Transformers 原文链接:https://arxiv.org/abs/2104.10157 1. 设计思路 不同种类的生成模型在一下多个维度各有权衡:采样速度、样本多样性、样本质量、优化稳定性、计算需求、评估难易程度等…

拥抱变化 | SAM发布后,大模型时代的算法研发如何发展?

作者 | 刀刀宁 编辑 | 汽车人 原文链接:https://zhuanlan.zhihu.com/p/619797754 点击下方卡片,关注“自动驾驶之心”公众号 ADAS巨卷干货,即可获取 点击进入→自动驾驶之心【AIGC】技术交流群 大模型时代,是危机时代。 但危机&a…

【Midjourney实操】逼真到颤抖!保姆级教程教生成效果炸裂的图片

最近,许多由Midjourney V5创作的画作在网络上引起了热议,许多人惊呼:人类画师, 插画师, 设计师统统活不下去了! 比如下面这张中国情侣的画作: 因为前段时间这个很火, 我跟着同样的p…

DDR5市场迎来拐点 Rambus再次先发制人

在数字化时代,行业用户对于算力的追求是无止境的。除了像CPU这样的核心部件以外,内存的容量与带宽也是提升算力不可忽视的重要一环。近日,Rambus率先推出6400MT/s DDR5寄存时钟驱动器,旨在进一步提升服务器内存性能。 算力驱动创新…

高质量WordPress下载站模板5play主题源码

介绍: 5play下载站是由国外站长开发的一款WordPress主题,主题简约大方,为v1.8版本, 该主题模板中包含了上千个应用,登录后台以后只需要简单的三个步骤就可以轻松发布apk文章, 我们只需要在WordPress后台…

当月薪3000变成万元进账,ChatGPT成就前女友视野中的闪耀新星

在生活的曲折丛林中,每个人都渴望抓住那一抹光明。突然,你发现了一个隐藏的秘密武器,它能让你趟过迷雾,瞥见成功的彼岸。ChatGPT,这个神秘的力量,将领导你跃过层层障碍,找到属于你的辉煌篇章。马…

【前端】vue学习5 : vue + ElementUI

vueelementUI 项目搭建 命令行需要管理员权限。 根据之前创建vue-cli项目一样再来一遍 创建项目。 1、创建一个名为 hello-vue 的工程 vue init webpack vue-element D:\IdeaProjects\vue>vue init webpack vue-element ‘git’ ���&…

理解Window和WindowManager(一)

理解Window和WindowManager(一) Window是一个抽象类,它的具体实现是PhoneWindow,创建一个WindowManager就可以创建一个Window, Window的具体实现位于WindowManagerService中,WindowManager和WindowManagerService是一个IPC过程 为什么使用Window 首先就是Window…

最牛最全的 Postman 实现 API 自动化测试教程

【 文章末尾给大家留下了大量的福利】 背景介绍 相信大部分开发人员和测试人员对 postman 都十分熟悉,对于开发人员和测试人员而言,使用 postman 来编写和保存测试用例会是一种比较方便和熟悉的方式。但 postman 本身是一个图形化软件,相对较…