从Mail.app在撰写窗口中获取消息

时间:2011-03-23 05:46:50

标签: macos email applescript

我正在尝试创建一个脚本,该脚本将获取我在Mail中编写的电子邮件的内容,对数据执行某些操作,然后发送消息。我知道如何使用AppleScript从头开始创建和发送新消息,但我找不到一种方法来获取我已经写过的消息。我不在乎使用什么语言,我愿意尝试使用不同的电子邮件客户端。谢谢你的帮助!

5 个答案:

答案 0 :(得分:2)

Mail对Applescript有很大的限制,处理其内容区域是一个主要问题。最好的办法是使用GUI脚本来选项卡到内容区域,键入cmd-C,然后处理剪贴板中的数据。

可悲的是,从我所看到的内容中,在Lion中,Applescript根本没有得到改进。

答案 1 :(得分:0)

这是可能的,但很痛苦。痛苦到足以让我仍在努力找出如何在Safari中做类似的事情。我已经到了可以找到textarea的地步,但是我找到的用于获取内容的文档不起作用。 (不幸的是,这对于AppleScript的课程来说非常相似;每个程序与下一个程序的完全不同。)

编辑:好的,有一些可怕的邪恶,希望可以适应与Mail合作:http://www.ece.cmu.edu/~allbery/edit_textarea.script

答案 2 :(得分:0)

如果我们做出两个相当微弱的假设,这是非常明确的:你正在处理的信息是最重要的,并且所有草稿信息的主题都是唯一的。然后,在运行脚本之前,保存您正在处理的消息;这将把它放在草稿邮箱中。然后,由于消息的主题是窗口的名称,我们可以轻松访问它;由于我们可以轻松访问草稿邮箱,我们可以将两者结合起来。这给了我们:

tell application "Mail"
    set msgs to messages of drafts mailbox ¬
        whose subject is (name of window 1 as string)
    if (count of msgs) = 1 then
        -- Do whatever
    else
        -- Error, disambiguate, whatever
    end if
end tell

可能会让脚本保存到最前面的窗口,如果新保存的消息始终是草稿邮箱的第一项,我不会感到惊讶,但这些留给了读者: )

答案 3 :(得分:0)

实际上很容易做到你需要的东西。

  1. 如果您想运行某种内联处理(例如,分配给热键(在Mail中,例如Cmd + D未被占用),或“服务”菜单中列出的“仅”,可在以后访问选择一些东西),你可以简单地使用Automator。一个演示Automator脚本读取当前选择,进行一些更改(这里,将一些ASCII字符+数字组合转换为一些重音字符),最后返回修改后的文本如下:

    on run {input, parameters}
    
    set myText to replaceText("a1", "á", (input as text))
    
    set myText to replaceText("e1", "é", myText)
    
    set myText to replaceText("i1", "í", myText)
    
    return myText
    
    end run
    
    
    
    on replaceText(find, replace, someText)
    
    set prevTIDs to text item delimiters of AppleScript
    
    set text item delimiters of AppleScript to find
    
    set someText to text items of someText
    
    set text item delimiters of AppleScript to replace
    
    set someText to "" & someText
    
    set text item delimiters of AppleScript to prevTIDs
    
    return someText
    
    end replaceText
    

    如果您想使用返回的内容覆盖原始内容,请务必启用“替换所选文本”。

  2. 如果要编写未从本地“服务”菜单(或通过热键)调用的外部脚本,则还需要添加剪贴板处理。与上述类似的解决方案以及其他剪贴板复制/粘贴:

    on replaceText(find, replace, someText)
    
    set prevTIDs to text item delimiters of AppleScript
    
    set text item delimiters of AppleScript to find
    
    set someText to text items of someText
    
    set text item delimiters of AppleScript to replace
    
    set someText to "" & someText
    
    set text item delimiters of AppleScript to prevTIDs
    
    return someText
    
    end replaceText
    
    
    
    tell application "Mail"
    
    activate
    
    tell application "System Events"
    
    tell process "Mail"
    
    click menu item "Select All" of menu "Edit" of menu bar 1
    
    click menu item "Copy" of menu "Edit" of menu bar 1
    
    end tell
    
    end tell
    
    end tell
    
    
    
    tell application "Mail"
    
    set textclip to (the clipboard)
    
    end tell
    
    
    
    set myText to replaceText("a1", "á", textclip)
    
    set myText to replaceText("e1", "é", myText)
    
    set myText to replaceText("i1", "í", myText)
    
    
    
    set the clipboard to myText
    
    
    
    tell application "Mail"
    
    activate
    
    tell application "System Events"
    
    tell process "Mail"
    
    click menu item "Paste" of menu "Edit" of menu bar 1
    
    end tell
    
    end tell
    
    end tell
    
  3. 请注意,后一个脚本选择(然后覆盖)整个窗口内容。应该很容易只处理当前选择。

答案 4 :(得分:-1)

所以我在2020年遇到了这个问题,并且有了这个Apple Script,现在(现在?)是有可能的(因为我必须使用剪贴板,所以它还是有点怪癖):

activate application "Mail"

tell application "System Events"
    tell process "Mail"
        set initialClipboardContent to (the clipboard as text)
        set composeWindow to (first window whose title does not contain "Inbox")
        set value of attribute "AXFocused" of UI element 1 of scroll area 1 of composeWindow to true

        delay 0.05

        # CMD + A   
        key code 0 using command down
        delay 0.1

        # CMD + C
        key code 8 using command down
        delay 0.1

        set message to (the clipboard as text) as string

        log message

        set the clipboard to initialClipboardContent
    end tell
end tell

以下是概念证明:

proof of concept