Trying to get the contents of an email message in AppleScript without added characters
好的,我需要根据某些标准自动将一些电子邮件添加到我的 Daylite 任务中,因此我设置了 Mail.app 规则和 AppleScript 来完成此操作。只有一个问题:当 AppleScript 获取消息的内容时,它会在末尾添加一个 \\'a\\'(并且还会发出哔哔声,让我知道它尝试了一些显然不是允许)。
这是 AppleScript 的样子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | using terms from application"Mail" on perform mail action with messages theMessages for rule theRule tell application"Mail" repeat with eachMessage in theMessages try set this_subject to subject of eachMessage set this_body to content of eachMessage if this_subject is"" then error on error set this_subject to"No subject." end try activate application"Daylite" tell application"System Events" keystroke"t" using {command down, shift down} keystroke this_subject keystroke tab keystroke this_body keystroke"s" using command down end tell end repeat end tell end perform mail action with messages end using terms from |
这导致我在 Daylite 中获得了一个新任务,其中任务标题是电子邮件主题,并且显示正确,但作为电子邮件正文的附件注释未正确显示。
所以,如果我收到一封符合我的规则的电子邮件,并且该电子邮件是:
From: Hypothetical Wife
Subject: Don't forget to take out the trash!
Body: If you forget one more time, I'm filing for a divorce.
最后的任务如下所示:
a?? Don't forget to take out the trash!
If you forget one more time, I'm filing for a divorce.a
一个€|在这种情况下让我假想的妻子听起来像一个几乎没有文化的加拿大人。 (另外还有系统警报声,让我知道它显然试图输入不允许的内容。)
如果正文有多行文本,它也会烦人地删除换行符。
我知道我可以将其设置为:
1 | set the clipboard to this_body |
然后替换
1 | keystroke this_body |
与
1 | keystroke"v" using command down |
a€|但这是一个非常不雅的解决方案,我不想在每次运行规则时都替换剪贴板中的任何内容。
我在这里做错了什么?我也在 TextEdit 中测试过,同样的问题也出现在那里,所以这不是 Daylite 问题。我还尝试将 "as Unicode text" 或 "as string" 或 "as ??class UTF8??" 附加到 "set this_bodya€|" 行的末尾,但没有其中也解决了问题。
请像我是个彻头彻尾的白痴一样向我解释,因为作为一个彻头彻尾的白痴,这是我理解你的唯一方式。谢谢。
许多人犯的基本错误之一是告诉应用程序执行应用程序不知道如何执行的操作。你应该只告诉应用程序去做你可以在它的 applescript 字典中找到的事情,因为这实际上是应用程序知道如何做的所有事情......除了一些基本的通用 applescript 的东西,比如执行重复循环。
你掉进了这个陷阱。您是在告诉 Mail 告诉 Daylight 和 System Events 执行操作,因为所有这些代码都在"告诉应用程序 Mail"代码块中。这种类型的错误通常会导致难以追踪的问题。
因此,我的第一个建议是停止告诉 Mail 做不必要的事情。以下是我将如何编写代码以将不同的应用程序命令彼此分开。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | using terms from application"Mail" on perform mail action with messages theMessages for rule theRule repeat with eachMessage in theMessages tell application"Mail" set this_subject to subject of eachMessage set this_body to content of eachMessage end tell if this_subject is"" then set this_subject to"No subject." activate application"Daylite" delay 0.2 tell application"System Events" tell process"Daylite" keystroke"t" using {command down, shift down} delay 0.2 keystroke this_subject delay 0.2 keystroke tab delay 0.2 keystroke this_body delay 0.2 keystroke"s" using command down end tell end tell end repeat end perform mail action with messages end using terms from |
您还会注意到我在您的一些代码之间添加了一个小延迟。有时代码运行的速度比计算机界面可以处理的快,所以这也可能是你的错误的根源。如果需要,您还可以尝试增加延迟的长度(任何超过 1 秒的延迟都是多余的,不应该是必要的)。
如果这些更改和更长的延迟不起作用,那么一个简单的解决方案是检查文本是否以 "a" 结尾,然后将其删除。击键选项卡和击键 this_body 行之间的类似内容...
1 | if this_body ends with"a" then set this_body to text 1 thru -2 of this_body |
祝你好运!
编辑:"击键"过程似乎不喜欢电子邮件中的返回字符。我相信这是造成噪音的原因......当它击中返回字符时它会发出哔哔声。无论如何,你可以尝试这样的事情。只需打开一个空白的 TextEdit 文档并在 Mail 中选择一封电子邮件,然后在 AppleScript Editor 中运行代码。您可以将此想法融入您的 Daylight 脚本中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | tell application"Mail" set eachMessage to item 1 of (get selection) set this_subject to subject of eachMessage set this_body to content of eachMessage end tell set bodyList to paragraphs of this_body activate application"TextEdit" tell application"System Events" tell process"TextEdit" repeat with i from 1 to count of bodyList keystroke (item i of bodyList) keystroke return end repeat end tell end tell |