【问题标题】:How to decode a base64-encoded email subject string using a Procmail recipe?如何使用 Procmail 配方解码 base64 编码的电子邮件主题字符串?
【发布时间】:2018-04-15 14:21:25
【问题描述】:

这是一个简单的 Procmail 配方,用于根据主题过滤电子邮件:

:0
* ^Subject: .*Content to filter
$HOME/Maildir/.INBOX.My_filtered_folder/

上面非常简单的 Procmail 配方可以正常工作。但是有些电子邮件具有 Base64 编码的主题内容,例如以下示例:

Subject: =?UTF-8?B?VmlldGFsaXMgUG9sZXBl?=
 =?UTF-8?B?bGwaY29tbWVudPVkIG9u?=
 =?UTF-8?B?IGAgbGlubyBCYWPrcGFj?=
 =?UTF-8?B?a2Vw4oDZcyBGZWxpY3l0eSA=?=
 =?UTF-8?B?c3hjckVkLg==?=

因此需要首先解码此编码的主题内容,以便能够像上面的配方中那样过滤电子邮件。

在过滤主题内容之前,如何在 Procmail 配方中解码此类 base64 编码的电子邮件主题字符串(在 Debian 7 上)?

这个问题与关于“Sendmail/procmail - 获取邮件发件人和邮件主题,utf8 编码问题 [关闭]”的问题不是重复的——这是一个完全不同的问题。

【问题讨论】:

  • 你为什么把它标记为 Perl?你能在那些过滤器中运行 Perl 代码,还是 Procmail 是用 Perl 编写的,还是 PCRE 风格的正则表达式?只有第一个选项与 Perl 标记相关。
  • 是的,您可以在 Procmail 中运行 Perl 代码。也许有一个使用 Perl 脚本的解决方案。
  • 它不是 Sendmail/procmail 的副本 - 获取邮件发件人和邮件主题,utf8 编码问题。有一些相似之处,但这个问题没有答案。
  • 这有什么不同?该问题的公认答案向您展示了如何解码您的示例。

标签: perl email base64 procmail string-decoding


【解决方案1】:

Linux 和 MacOS 机器上通常会安装“base64”程序。要在 Perl 中做同样的事情,像这样的命令行调用会起作用:

$ perl -MMIME::Base64 -e  'print decode_base64("QWxhZGRpbjpvcGVuIHNlc2FtZQ==");'

其中 QWxhZGRpbjpvcGVuIHNlc2FtZQ== 是您的 base64 字符串。

在我的 .procmailrc 中,我做了这样的事情:

SUBJECT=`formail -x Subject:`

:0
{
# You would use 'fbw' to scan the body
:0 fw 
# presumably any base64 message will have this content header
* ^Content-Transfer-Encoding: base64
| some-external-app
}

其中“some-external-app”可以是 base64 程序,或者是合适的 perl 调用:

formail -i "Subject: `perl -MMIME::Base64 -e 'print decode_base64($SUBJECT)' `"

什么的。

在我的机器上(AMD 上的 netBSD 7.1)base64 的工作方式如下:

base64 -d

但 YMMV 从平台到平台。

此外,现实情况是,电子邮件在野外经常出现格式错误,您可能需要调整上述方法以匹配现实。但希望你能明白。

最好在 .procmailrc 中设置 LOGFILE 变量,这样您就可以跟踪意外后果。更好的是,使用除 procmail 之外的其他东西 ;-)

【讨论】:

  • 谢谢。你能详细说明一下吗? 1. “如果主题行匹配 $PATTERN”是什么意思? 2.“更好的是,使用除 procmail 之外的其他东西”——不幸的是,我无法在这个系统上将其更改为例如筛子——但 Procmail 真的很棒。
  • 另一个复杂的问题是RFC2047 在单一编码中提供的不仅仅是一个 base64 标记。在当今世界,您可能应该将 canonicalized representation 中的所有内容标准化为 UTF-8(我猜是 NFD,尽管这也取决于您的特定应用程序;如果您的需求是普通人,NFKC 实际上可能是最简单和最强大的)
猜你喜欢
  • 1970-01-01
  • 2020-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-31
  • 2011-09-02
  • 2021-10-27
相关资源
最近更新 更多