首页 > 解决方案 > AppleScript 电子邮件附件在处理程序中不起作用

问题描述

我们有一个有效的 AppleScript,它可以创建带有附件的电子邮件,并且在脚本编辑器中运行良好。但是,我们无法让附件在我们的 macOS 应用程序中使用的处理程序中工作。很难找到文档并弄清楚激活和发送命令之间的区别。感谢您的任何帮助,您可以提供。

这是AppleScript

set recipientAddress to "joe@joe.com"
set recipientName to "Joe"
set theSubject to "Estimate"
set theContent to "This is your Estimate. Please call with any questions."
set theAttachment to "/Users/iMac/Library/Containers/com.jzmobile.JZMac/Data/Documents/PDF1"

tell application "Mail"
    set outgoingMessage to make new outgoing message with properties {subject:theSubject, content:theContent, visible:true}
    tell outgoingMessage
        make new to recipient with properties {name:recipientName, address:recipientAddress}
        tell content of outgoingMessage
            make new attachment with properties {file name:theAttachment}
        end tell
    end tell
    activate
end tell

这是处理程序:

var script: NSAppleScript = { 
        let script = NSAppleScript(source: """

    -- This is our handler definition
    on sendMyEmail(theSubject, theContent, recipientName, recipientAddress, attachment)
        tell application "Mail"

            -- Create an email
            set outgoingMessage to make new outgoing message ¬
            with properties {subject:theSubject, content:theContent, visible:true}

            -- Set the recipient
            tell outgoingMessage
                make new to recipient ¬
                with properties {name:recipientName, address:recipientAddress}
            tell content of outgoingMessage
                make new attachment with properties {file name:attachment}

            #activate
            end tell
               -- Send the message
            send 
            end tell

        end tell
        #activate

    end sendMyEmail
    """  
            )!  
        let success = script.compileAndReturnError(nil)  
        assert(success)  
        return script  
    }() 

@objc func runScript() {

    let parameters = NSAppleEventDescriptor.list()  
    parameters.insert(NSAppleEventDescriptor(string: subject), at: 0)  
    parameters.insert(NSAppleEventDescriptor(string: "Some content of the email"), at: 0)  
    parameters.insert(NSAppleEventDescriptor(string: "John Smith"), at: 0)  
    parameters.insert(NSAppleEventDescriptor(string: "john@email.com"), at: 0)  
    parameters.insert(NSAppleEventDescriptor(string: attachmentFileURL), at: 0)

    let event = NSAppleEventDescriptor(  
        eventClass: AEEventClass(kASAppleScriptSuite),  
        eventID: AEEventID(kASSubroutineEvent),  
        targetDescriptor: nil,  
        returnID: AEReturnID(kAutoGenerateReturnID),  
        transactionID: AETransactionID(kAnyTransactionID)  
    )  

    // this line sets the name of the target handler
    event.setDescriptor(NSAppleEventDescriptor(string: "sendMyEmail"), forKeyword: AEKeyword(keyASSubroutineName))

    // this line adds the parameter list we constructed above  
    event.setDescriptor(parameters, forKeyword: AEKeyword(keyDirectObject))  

    var error: NSDictionary? = nil  
    _ = self.script.executeAppleEvent(event, error: &error) as NSAppleEventDescriptor?  

    print ("runScript",self.script)

}

标签: swiftmacosapplescriptappleevents

解决方案


传递路径字符串将不起作用;沙箱会阻止它。您必须传递一个文件对象(别名/POSIX 文件)。

沙盒还将限制您自己的应用程序访问任意文件系统位置的能力。


推荐阅读