尝试在AppleScript中获取电子邮件的内容而不添加字符

时间:2013-06-19 04:45:39

标签: email applescript

好的,我需要根据特定条件自动为我的Daylite任务添加一些电子邮件,因此我设置了Mail.app规则和AppleScript来完成此任务。只有一个问题:当AppleScript获取消息的内容时,它会在末尾添加一个“a”(并发出一声嘟嘟声,让我知道它尝试了一些显然不允许的按键)。

以下是AppleScript的样子:

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中获得一个新任务,其中任务标题是电子邮件主题,并且显示正确,但附加的注释(即电子邮件的正文)未正确显示。

因此,如果我收到符合我规则的电子邮件,则电子邮件为:

  

来自:假设的妻子

     

主题:别忘了带走垃圾!

     

身体:如果你再忘记一次,我正在申请离婚。

最终会出现如下任务:

  

☐别忘了带走垃圾!

     

如果你再忘记一次,我正在申请离婚.a

...让我假设的妻子在这个场景中听起来像一个几乎没有文化的加拿大人。 (另外还有一个系统警报声,让我知道它显然试图键入某些是不允许的。)

如果正文有多行文字,那么它也会烦人地删除换行符。

我知道我可以把它设置为:

set the clipboard to this_body

然后替换

keystroke this_body

keystroke "v" using command down

...但这是一个非常不优雅的解决方案,每次规则运行时我都不想替换剪贴板中的任何内容。

我在这里做错了什么?我也在TextEdit中对此进行了测试,同样的问题也出现在那里,因此它不是Daylite问题。我还尝试在“set this_body ...”行的末尾添加“as Unicode text”或“as string”或“as«class UTF8»”,但这些都没有解决问题。

请向我解释,因为我是一个完全白痴,因为作为一个完全白痴,这是我理解你的唯一方式。感谢。

1 个答案:

答案 0 :(得分:1)

许多人犯的一个基本错误就是告诉应用程序执行应用程序不知道如何操作的事情。你应该只告诉一个应用程序做你可以在它的applescript字典中找到的东西,因为那真的是所有的应用程序都知道怎么做...除了一些基本的通用AppleScript之类的东西,比如执行重复循环。

你陷入了这个陷阱。您告诉Mail告诉Daylight和System Events执行操作,因为所有代码都在“tell application Mail”代码块中。这种类型的错误通常会导致难以追查的问题。

因此,我的第一个建议是停止告诉Mail做不必要的事情。以下是我编写代码以将不同的应用程序命令彼此分开的方法。

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线之间有类似的东西...

if this_body ends with "a" then set this_body to text 1 thru -2 of this_body
祝你好运!

编辑 :“按键”过程似乎不喜欢电子邮件中的返回字符。我相信这是造成噪音的原因......当它击中返回角色时会发出哔哔声。无论如何,你可以尝试这样的事情。只需打开一个空白的TextEdit文档,然后在Mail中选择一封电子邮件,然后在AppleScript编辑器中运行该代码。您可以将此想法合并到日光脚本中。

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