如何用AppleScript获取Mac「信息」应用中所有未送达iMessage?
用AppleScript收集「信息」应用中的未送达消息
之前尝试通过分析UI元素来实现确实容易踩坑——系统版本更新、界面布局调整都可能让这类脚本直接失效。更可靠的方法是利用「信息」本身开放的AppleScript接口,直接访问消息的属性,完全不用碰UI元素,稳定性高很多。
核心思路
「信息」的AppleScript字典里,每个message(消息)对象都自带delivered(是否已送达)和error message(错误信息)属性,我们可以遍历所有对话和消息,筛选出未送达的条目并收集关键信息。
完整脚本示例
tell application "Messages" set undeliveredMessages to {} -- 遍历所有对话(包括iMessage和短信) repeat with aChat in chats -- 遍历当前对话下的所有消息 repeat with aMessage in messages of aChat -- 筛选条件:未送达 或者 存在发送错误信息 if (delivered of aMessage is false) or (error message of aMessage is not missing value) then -- 收集消息关键信息,可按需调整字段 set messageDetails to {¬ chatName:name of aChat, ¬ recipient:id of aChat, ¬ sendDate:date sent of aMessage, ¬ content:content of aMessage, ¬ errorInfo:error message of aMessage ¬ } copy messageDetails to end of undeliveredMessages end if end repeat end repeat -- 处理收集到的结果:弹窗提示或保存到文件 if length of undeliveredMessages > 0 then -- 这里可以替换成保存到文件的逻辑,下面会给出示例 display dialog "找到" & (length of undeliveredMessages) & "条未送达消息:" & return & return & ¬ (join undeliveredMessages using return) buttons {"确定"} default button 1 else display dialog "未找到未送达消息" buttons {"确定"} default button 1 end if end tell
脚本关键说明
chats:获取「信息」里的所有对话,不管是iMessage还是短信对话都能覆盖delivered of aMessage:布尔值,true代表已送达,false代表未送达error message of aMessage:如果消息发送失败,会返回具体的错误提示(比如“无法发送信息”),可以作为补充筛选条件messageDetails:我这里收集了对话名称、收件人ID、发送时间、消息内容和错误信息,你可以根据自己的需求增减字段
进阶:把结果保存到文件
如果需要把未送达消息导出成文本文件,替换脚本里的弹窗部分为以下代码即可(默认保存到桌面):
set outputFile to (path to desktop folder as string) & "未送达消息.txt" set fileHandle to open for access outputFile with write permission write "未送达消息列表:" & return & return to fileHandle repeat with msg in undeliveredMessages write "对话:" & chatName of msg & return to fileHandle write "收件人:" & recipient of msg & return to fileHandle write "发送时间:" & sendDate of msg & return to fileHandle write "内容:" & content of msg & return to fileHandle if errorInfo of msg is not missing value then write "错误信息:" & errorInfo of msg & return to fileHandle end if write "------------------------" & return to fileHandle end repeat close access fileHandle display dialog "未送达消息已保存到桌面的「未送达消息.txt」" buttons {"确定"} default button 1
注意事项
- 首先要确保「信息」授权AppleScript访问:打开「系统设置」→「隐私与安全性」→「自动化」,找到对应的脚本工具(比如Script Editor),勾选允许它访问「信息」
- 这个方法依赖「信息」的AppleScript接口,只要苹果不修改这个接口,脚本就能一直正常工作,比UI操作稳定太多
内容的提问来源于stack exchange,提问作者郑相悦




