使用 procmail 解密收到的 pgp 邮件

使用 procmail 解密收到的 pgp 邮件

目前我有一个正在运行的 Postfix 服务器,它通过 procmail 传递传入邮件。它工作正常,但现在我想自动解密任何使用 pgp 加密的传入邮件。因此我创建了一个 procmail 规则来触发 gnupg。

这是我当前的.procmailrc:

:0 fw
* ^Subject: encryptme
| /usr/bin/gpg --decrypt | mail -s "ENCRYPTED: $subject" [email protected]

现在邮件已成功解密并发送至[电子邮件保护]但邮件主题为空(邮件仅显示“已加密:”),发件人为服务器的电子邮件地址。当然,解密的邮件包含部分邮件头。

Content-Type: multipart/mixed; boundary="713bkotRlnRGA7FAhJANoI0IsDpX3ws8N"

--713bkotRlnRGA7FAhJANoI0IsDpX3ws8N
Content-Type: text/plain; charset=ISO-8859-15
Content-Transfer-Encoding: quoted-printable

Just a test.

--713bkotRlnRGA7FAhJANoI0IsDpX3ws8N--

有没有可能以这种方式自动解密收到的邮件并“清理”(仅解密邮件)而无需 GNU Anubis 等其他软件? procmail 触发程序(而不是主题)的良好规则是什么?

我希望这些信息足以帮助别人。

答案1

简而言之,gpg --decrypt想要一个文件,而不是电子邮件消息。电子邮件消息通常由多个 MIME 部分组成(您的示例显示multipart/mixed只有一个正文部分,但概念仍然成立),这些部分不是文件。您只需将加密的有效负载(而不是 MIME 容器)传递给,gpg或者找到有助于gpg解析 MIME 包装器的包装器或选项。

通过快速谷歌搜索找到了一个简单的 Perl MIME 包装器,它可以执行以下操作:

如果链接出现问题,重新发明同样的轮子应该不是什么大问题;您基本上需要识别包含加密有效负载的 MIME 部分,对其进行解码(base64除非使用gpg自己的“ASCII 装甲”,否则它可能已被编码),然后将其传递给gpg。加密有效负载的存在可能是一个很好的触发器,但也许包装器应该简单地传递任何不包含加密有效负载的内容,然后您将所有内容都提供给包装器。

$subject顺便说一下, Procmail 或规则中没有任何定义。您可以执行以下操作:

:0
* ^Subject:[    ]\/[^   ].*
{ subject=$MATCH }

...方括号之间的空白应该是一个空格和一个制表符。

相关内容