Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 根据.procmailrc文件中的文本,将utf8解码为ISO-8859-1邮件_Perl_Email_Encoding_Utf8 Decode_Procmail - Fatal编程技术网

Perl 根据.procmailrc文件中的文本,将utf8解码为ISO-8859-1邮件

Perl 根据.procmailrc文件中的文本,将utf8解码为ISO-8859-1邮件,perl,email,encoding,utf8-decode,procmail,Perl,Email,Encoding,Utf8 Decode,Procmail,开始编写一个简单的procmail recipie,如果在主题中发现文本“ABC商店:新订单”,它将转发邮件 :0 * ^(To|From).*abc@cdefgh.com * ^Subject:.*ABC Store: New Order* { 不幸的是,来自邮件服务器的邮件消息中的主题字段是MIME编码的单词语法 主题:=?UTF-8?B?QUJDIFN0b3JlOiBOZXcgT3JkZXI== 上面的主题是utf-8 ISO-8859-1字符集,因此我想知道是

开始编写一个简单的procmail recipie,如果在主题中发现文本“ABC商店:新订单”,它将转发邮件

 :0
    * ^(To|From).*abc@cdefgh.com
    * ^Subject:.*ABC Store: New Order*
    {
不幸的是,来自邮件服务器的邮件消息中的主题字段是MIME编码的单词语法

主题:=?UTF-8?B?QUJDIFN0b3JlOiBOZXcgT3JkZXI==


上面的主题是utf-8 ISO-8859-1字符集,因此我想知道是否有任何机制/脚本/实用程序来解析它并转换为字符串格式,以便我可以应用procmail过滤器。

在分配到procmail变量之前,您可以使用perl one liner解码
主题:

# Store "may be encoded" Subject: into $SUBJECT after conversion to ISO-8859-1
:0 h
* ^Subject:.*=\?
SUBJECT=| formail -cXSubject: | perl -MEncode=from_to -pe 'from_to $_, "MIME-Header", "iso-8859-1"'

# Store all remaining cases of Subject: into $SUBJECT
:0 hE
SUBJECT=| formail -cXSubject:

# trigger recipe based also on $SUBJECT content
:0
* ^(To|From).*abc@cdefgh.com
* SUBJECT ?? ^Subject:.*ABC Store: New Order
{
....
}

注释(2020-03-07):最好转换为UTF-8字符集,而不是ISO-8859-*。

您应该使用

像这样

use strict;
use warnings;
use 5.010;

use MIME::EncWords 'decode_mimewords';

my $subject = '=?UTF-8?B?QUJDIFN0b3JlOiBOZXcgT3JkZXI=?=';
my $decoded = decode_mimewords($subject);
say $decoded;
输出

ABC Store: New Order

美好的我不知道
MIME Header
是一个可用的编码,非常感谢@Andrzej A。Filipt尽管regex
neworder*
中的
r*
有点傻,而且可以说是错误的。为什么用于“剩余案例”的命令是这样的:
SUBJECT=| formail-cXSubject
没有冒号,与第一种情况下的命令不同:
SUBJECT=|formail-cXSubject:|
?我在
man-formail
示例中固定了语法示例。“formail-cXSubject”的基本测试似乎也能产生正确的结果。您看到的是一个RFC2047编码的报头。就像它在字符集部分所说的,它是UTF-8,base64编码的。这里没有ISO-8859-1(这是一种不同的编码;如果是UTF-8,它就不能是ISO-8859-1又称拉丁语-1)。在一般情况下,UTF-8的曲目要比ISO-8859-1的曲目大得多,因此您不可能总是能够将UTF-8翻译成ISO-8859-1。如果您只关心展开RFC2047编码和恢复UTF-8文本,那么这总是可能的(也许是更好的做法);结果仍然是UTF-8。因为OP的正则表达式不包含ISO-8859-1和UTF-8之间编码不同的任何字符,所以这似乎无关紧要;但是,如果您想匹配非纯ASCII的文本,那么编码确实很重要,您应该知道使用的是哪种编码。(就像我在另一篇评论中所说的那样,我实际上会建议将所有内容保留在UTF-8中;但这可能不是OP所要求的。尽管这一部分的问题不清楚。)