如何使用Procmail配方解码base64编码的电子邮件主题字符串?

时间:2017-11-02 22:48:19

标签: perl email base64 procmail string-decoding

这是一个简单的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==?=

因此,需要首先解码此编码的主题内容,以便能够过滤上述食谱中的电子邮件。

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

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

1 个答案:

答案 0 :(得分:2)

通常是" base64"程序安装在Linux和MacOS机器上。要在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之外的东西; - )