如何在Mail.app中运行的applescript中使用钥匙串中的密码?

Posted

技术标签:

【中文标题】如何在Mail.app中运行的applescript中使用钥匙串中的密码?【英文标题】:How to use a password from the keychain within an applescript running within Mail.app? 【发布时间】:2012-05-21 09:49:11 【问题描述】:

我正在尝试设置一个applescript,它(通过python imaplib ...)对我的gmail帐户(未在Mail.app中配置IMAP,只有POP)执行某些操作。

为此,脚本需要使用我的密码登录。如果不是出于安全考虑,我可以简单地将我的密码硬编码到 python 脚本中......

有没有办法让 Mail.app 内部触发的这种 AppleScript(例如通过规则)可以使用我存储在钥匙串中的密码?

【问题讨论】:

【参考方案1】:

以下内容是从我的脚本库中的脚本中复制出来的...

-- 如果您需要在脚本中使用密码,您可以使用钥匙串来存储密码并让脚本检索它。这样您的密码就会受到保护,因为您不需要在脚本中以明文形式存储密码。

-- 创建密码项 - 打开 Keychain Access 应用程序并选择左侧栏中的钥匙串。然后单击文件>新密码项...,为其命名,将您的帐户短名称输入帐户,然后输入密码。在密码列表中突出显示它并获取相关信息。在 Attributes 按钮下输入它的种类作为通用键。之所以选择这个,是因为它们的数量不多,而且搜索速度要快得多。

-- 注意:苹果在 10.7 中删除了钥匙串脚本,因此我们现在使用安全命令行工具

getPW("name of keychain item")

on getPW(keychainItemName)
    do shell script "security 2>&1 >/dev/null find-generic-password -gl " & quoted form of keychainItemName & " | awk 'print $2'"
    return (text 2 thru -2 of result)
end getPW

【讨论】:

请注意,如果密码包含 ASCII 范围之外的字符,这将不会返回正确的密码 - 请参阅我在 my answer 中链接到的 TextMate 博客文章中的 this comment。 感谢您的提醒。我没有意识到,所以很高兴知道。【参考方案2】:

有一种方法,称为 Keychain Access Scripting,Apple 在 OS X 10.7 中弃用了它,从 AppleScript 中删除了必要的扩展。 但是,您可以使用 security shell 实用程序,例如 detailed on the TextMate blog(请务必阅读 cmets - 有一些问题),或者,我建议您使用Apple 组件的第三方替代品,Daniel Jalkut 的优秀 Usable Keychain Scripting 应用程序。安装后,AppleScript 将检索您的密码(假设帐户名称为“GMail”):

tell application "Usable Keychain Scripting" to get password of first generic item of current keychain whose account is "GMail"

【讨论】:

【参考方案3】:

我在用这个

# Replace %ACCOUNT_NAME% with account name of Keychain item
get_pw () 
  security 2>&1 >/dev/null find-generic-password -ga "%ACCOUNT_NAME%" \
  | sed 's/password: "\(.*\)"/\1/'

PASS=$(get_pw)

【讨论】:

【参考方案4】:

更新的答案,因为我认为以前没有。 security 现在有一个 -w 选项,它只输出密码而不需要解析输出。

这在 python 中为我们提供了这个解决方案:

pw = subprocess.check_output(["security", "find-generic-password", "-wl", "MY_KEYCHAIN_ID"])

这仍然会触发输入用户密码的提示,与其他解决方案相同。

【讨论】:

以上是关于如何在Mail.app中运行的applescript中使用钥匙串中的密码?的主要内容,如果未能解决你的问题,请参考以下文章

即使用户已卸载 Mail.app,如何在我的应用程序中添加电子邮件链接仍然有效?

在 iOS 8 中,如何通过 Mail.app 实现长滑动删除手势

如何通过 AppleScript 设置当前 Mail.app 外发消息的发件人?

AppleScript从Mail.app上的Imap文件夹中选择消息

无法调配类方法

使用 iOS 中的共享扩展从 Mail App 共享附件