在Mac OSX上创建mailto处理程序应用程序

时间:2014-04-03 20:23:31

标签: macos emacs mailto

我在Emacs中使用mu4e作为我的邮件客户端,但我无法弄清楚如何创建一个可以将mailto url传递给以下shell脚本的脚本:

#!/bin/sh
# emacs-mailto-handler

mailto=$1
mailto="mailto:${mailto#mailto:}"
mailto=$(printf '%s\n' "$mailto" | sed -e 's/[\"]/\\&/g')
elisp_expr="(mu4e~compose-browse-url-mail \"$mailto\")"

emacsclient -a \"\" --create-frame -n --eval "$elisp_expr" \
        '(set-window-dedicated-p (selected-window) t)'

当我在命令行上调用此脚本时,它会在Emacs中打开一个具有正确地址和主题的新框架:

$ emacs-mailto-handler "mailto:webmonkey@wired.com?subject=I-love-cats-too%21"

问题是我需要创建一个可以配置为Mac OSX中默认邮件客户端的应用程序。 我曾尝试使用Automator和Platypus来调用我的shell脚本,但我无法让他们将他们收到的参数传递给shell脚本。 (我已经看到了这个问题:OS X: how to make command-line script appear as helper application to handle mailto?,但这对我来说不起作用。)

在一天结束时,我必须能够让应用程序执行此脚本调用:      emacs-mailto-handler" mailto:webmonkey@wired.com?subject = I-love-cats-too%21" mailto链接是来自浏览器的内容。

任何关于此的线索都是最受欢迎的!

提前致谢, 托本

2 个答案:

答案 0 :(得分:5)

这将需要某种捆绑的应用程序。

当应用处理URL时,它不会在其命令行参数(argv的{​​{1}}参数数组)中接收它们。实际上,应用程序可以在运行期间随时接收打开URL的请求,而不仅仅是在启动时。因此,它肯定需要一个除命令行参数之外的机制来接收它们。这使得脚本无法在其参数中接收URL。

相反,它会收到打开或获取URL作为类main()和ID kInternetEventClass的Apple事件的请求。该应用程序为该Apple事件设置处理程序,并由框架调用该处理程序。为了使框架能够接收和发送Apple事件,应用程序必须a)使用这些框架,以及b)为框架提供机会,以监视它们在内部使用的进程间通信机制来传递事件。同样,这不是shell脚本可以做的事情。

在Cocoa应用程序中,这需要在应用程序的早期启动代码中添加如下代码,例如app delegate的kAEGetURL方法:

-applicationWillFinishLaunching:

然后会添加一个名称与上面传递的选择器匹配的方法;在这种情况下 NSAppleEventManager* appleEventManager = [NSAppleEventManager sharedAppleEventManager]; [appleEventManager setEventHandler:self andSelector:@selector(handleGetURLEvent:withReplyEvent:) forEventClass:kInternetEventClass andEventID:kAEGetURL];

-handleGetURLEvent:withReplyEvent:

除了该代码之外,应用程序还必须声明其能够在- (BOOL)handleGetURLEvent:(NSAppleEventDescriptor*)event withReplyEvent:(NSAppleEventDescriptor*)replyEvent { NSAppleEventDescriptor* directObjectDescriptor = [event paramDescriptorForKeyword:keyDirectObject]; NSString* urlString = [directObjectDescriptor stringValue]; NSURL* url = [NSURL URLWithString:urlString]; // ... do something with url ... } 密钥下的Info.plist文件中处理特定方案的URL。如下所示的条目将声明处理CFBundleURLTypes URL的能力:

mailto:

可以想象,由Platypus或Automator生成的应用程序可以在其中包含上述URL支持代码。这很多是通用的。声明支持特定的URL方案是他们必须让您配置的东西。一般都没有办法宣布对任何/所有计划的支持。

我攻击了Automator生成的应用的Info.plist文件,看看我是否可以让它处理URL。它没用。但是,我正在测试Automator从OS X 10.6生成的应用程序。新版本的Automator可能会增加支持。这可以解释你引用的其他问题中报告的成功。

我没有和Platypus核实过。

答案 1 :(得分:0)

对于Emacs,我设法使用AppleScript使其对我有效:

on open location mailtostr
    do shell script "/usr/local/Cellar/emacs/26.1_1/bin/emacsclient -c --eval '(browse-url-mail \"" & mailtostr & "\")' > /dev/null 2>&1 &"
    tell application "Emacs" to activate
end open location