【问题标题】:Trying to get the contents of an email message in AppleScript without added characters试图在不添加字符的情况下在 AppleScript 中获取电子邮件的内容
【发布时间】:2013-06-19 04:45:39
【问题描述】:

好的,我需要根据某些标准自动将一些电子邮件添加到我的 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 中获得了一个新任务,其中任务标题是电子邮件主题,并且显示正确,但作为电子邮件正文的附件注释未正确显示。

所以,如果我收到一封符合我的规则的电子邮件,并且该电子邮件是:

来自:假想的妻子

主题:别忘了倒垃圾!

Body:如果你再忘记一次,我提出离婚。

最后的任务如下所示:

☐ 别忘了倒垃圾!

如果你再忘记一次,我提出离婚。a

...在这种情况下让我假想的妻子听起来像一个几乎没有文化的加拿大人。 (另外还有一个系统警报声,让我知道它显然试图输入不允许的 something。)

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

我知道我可以将其设置为:

set the clipboard to this_body

然后替换

keystroke this_body

keystroke "v" using command down

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

我在这里做错了什么?我也在 TextEdit 中对此进行了测试,同样的问题也出现在那里,所以这不是 Daylite 问题。我还尝试将“作为 Unicode 文本”或“作为字符串”或“作为«class UTF8»”附加到“设置 this_body...”行的末尾,但这些都没有解决问题。

请像我是个彻头彻尾的白痴一样向我解释,因为作为一个彻头彻尾的白痴,这是我理解你的唯一方式。谢谢。

【问题讨论】:

    标签: email applescript


    【解决方案1】:

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

    你掉进了这个陷阱。您是在告诉 Mail 告诉 Daylight 和 System Events 执行操作,因为所有这些代码都在“告诉应用程序 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 Editor 中运行代码。您可以将这个想法融入您的 Daylight 脚本中。

    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
    

    【讨论】:

    • 谢谢,但文字还是有问题。它也摆脱了换行符,所以假想妻子的信息变成了这样: >昨晚下班回家时,我忍不住注意到了你衣领上的口红印。这封电子邮件需要两段,这让我非常愤怒。现在我们有了两段,我实际上感觉好多了。
    • 哈,我忘了 StackOverflow 也不允许在 cmets 中换行。无论如何,只是为了提请注意换行符之间缺少空间。这尤其使签名变得一团糟。有没有办法将它设置为只使用 this_body 的第一段?我对AppleScript了解不多,我只是在学习。
    • 好的,我想出了如何只取第一段set this_body to (paragraph 1 of content of eachMessage),但它仍然会在最后发出系统警报声,这意味着 something 不太正确.. . (如果您通过更改脚本来自己测试它以在 TextEdit 中输出文本,它会做同样的事情)。当然,我更喜欢输出整封电子邮件,而不是只输出第一段,因为它们有时需要电子邮件中的列表。
    • 请参阅我帖子中的“编辑”部分,了解您的 cmets 的可能解决方案。
    • 哦,太棒了!非常感谢,这非常有效。你让我开心。
    猜你喜欢
    • 2017-12-26
    • 2015-06-20
    • 1970-01-01
    • 1970-01-01
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    相关资源
    最近更新 更多