如何通过bash脚本结合Thunderbird与xdotool实现自动发送邮件
问题根因说明
你原来组合命令失效的核心原因有两个:
thunderbird -compose启动撰写窗口的命令是非阻塞运行的,命令执行完立刻把终端控制权交回,根本不会等撰写窗口完全加载、获得X Server输入焦点就往下跑后续命令- 你用的全局绝对坐标点击逻辑,完全没有做窗口绑定:只要撰写窗口没被激活到最前台,X Server会把鼠标点击事件路由到当前最上层的窗口(也就是你敲命令的终端),点击动作根本打不到Thunderbird的发送按钮上
单独开两个终端操作能成功,本质是你手动点了Thunderbird窗口把它拉到了前台,自然点击坐标是生效的。之前网友给的参考命令里的xdotool getactivewindow写法也有问题——刚启动Thunderbird时,当前活动窗口还是你敲命令的终端,拿这个窗口ID做激活操作,永远也点不到发送按钮。
可直接复用的稳定实现方案
完全不用依赖固定像素坐标触发点击,兼顾窗口位置变化、不同语言版本的兼容性:
- 优先用Thunderbird原生的发送快捷键替代坐标点击:所有版本默认的发送快捷键是
Ctrl+Return,只要把输入事件绑定到撰写窗口,不管窗口挪到屏幕哪个位置,都能准确触发发送 - 用窗口ID做精准绑定,不靠全局焦点判断
- 加同步等待逻辑,避开窗口加载慢的空窗期
# 1. 后台启动Thunderbird撰写窗口,避免阻塞终端流程 thunderbird -compose "subject='test',to='someaddress@mail.com',body='this and that'" & # 2. 轮询等待撰写窗口加载完成,最长等待10秒 COMPOSE_WIN="" for wait_sec in {1..10}; do # 匹配Thunderbird类名下的撰写窗口,英文版本匹配窗口名里的"Compose",中文版本匹配"撰写"即可 COMPOSE_WIN=$(xdotool search --class "Thunderbird" --name "Compose" | head -n 1) if [ -n "$COMPOSE_WIN" ]; then break fi sleep 1 done # 3. 同步激活目标窗口,等窗口真正拿到输入焦点再执行后续操作 xdotool windowactivate --sync $COMPOSE_WIN # 留1秒余量等界面控件完全渲染 sleep 1 # 4. 直接向绑定的窗口发送发送快捷键,不用计算像素坐标 xdotool key --window $COMPOSE_WIN "ctrl+Return"
常见踩坑提示
- 如果是在后台脚本、SSH会话里跑这个命令,记得先指定X Server的显示地址:一般本地图形会话的环境变量是
export DISPLAY=:0,不然xdotool找不到任何图形窗口 - 不要用死等固定sleep时长的写法,不同机器Thunderbird启动速度差异很大,轮询等窗口加载的方式兼容性更好
- 如果实在需要用坐标点击发送按钮,一定要在
windowactivate --sync之后,配合xdotool mousemove --window $COMPOSE_WIN <窗口内相对x坐标> <窗口内相对y坐标>用窗口内相对位置计算,不要用屏幕全局绝对坐标,窗口位置一变就会点偏
内容的提问来源于stack exchange,提问作者crag hack
相关产品推荐
相关产品推荐

