0

我在 SMTP 服务器上的.procmailrc中有以下行:

BODY=`formail -I ""`

后来我将此正文回显到本地文件:

echo "$BODY" >> $HOME/$FILENAME; \

我也试过prinf(但我得到了同样的效果):

printf "$BODY" >> $HOME/$FILENAME; \

当我阅读此文件时,我可以看到编码已更改。这是我得到的:

Administrator System=C3=B3w

虽然应该是(波兰语):

Administrator Systemów

如何直接在.procmailrc或更高版本(bash/python)中解码/编码正文以获得正确的字符串?

我的另一行.procmailrc正常工作,但它需要带有 perl 编码器的额外管道:

SUBJECT=`formail -xSubject: | tr -d '\n' | sed -e 's/^ //' | /usr/bin/perl -MEncode -ne 'print encode ("utf8",decode ("MIME-Header",$_ )) '`

SUBJECT 包含 UTF8 字符,一切正常。也许有一种方法可以对邮件正文使用类似的解决方案?

好的。我终于把一切都搞定了。这是我所做的:

首先是.procmailrc文件:

VERBOSE=yes
LOGFILE=$HOME/procmail.log
:0f
* ^From.*(some_address@somedomain.com)
| $HOME/python_script.py

现在到python_script.py

#!/usr/bin/python

from email.parser import Parser
import sys

temp_file = open("/home/(user)/file.txt","w")
temp_file.write("START\n")

if not message.is_multipart():
        temp_file.write(message.get_payload(decode=True))
else:
        for part in message.get_payload():
                if part.get_content_type() == 'text/plain':
                        temp_file.write(part.get_payload(decode=True))

temp_file.close()

调试最困难的部分是.procmailrc配方,我必须在其中测试 :0、:0f、:0fbW 等的许多选项……最后找到最适合的选项。

下一个有问题的步骤是直接在.procmailrc中解码的 $BODY 部分。不过,我通过摆脱所有东西并将所有内容移至 Python 脚本找到了解决方案。正如三人所建议的那样。

4

2 回答 2

1

它没有改变,但是您正在切换标题,以便Content-Type:不再存在正确的标题(您还应该保留Mime-Version:任何其他标准Content-*标题)。

通过检查邮件客户端中的消息来源,您应该看到 Procmail 或 Bash 实际上并没有改变任何东西。您收到的文本实际上是字面意思Administrator System=C3=B3w,但 MIME 标头会通知您的电子邮件客户端这是Content-Transfer-Encoding: quoted-printableContent-type: text/plain; charset="utf-8"因此它知道如何正确解码和显示它。

如果您只想要有效负载,则需要自己对其进行解码,但为了做到这一点,您需要来自 MIME 标头的此信息,因此您不应在处理消息之前将其杀死(如果有的话)。像这样的东西,也许:

from email.parser import Parser
import sys

message = Parser().parse(sys.stdin)
if message['content-type'].lower().startswith('text/'):
    print(message.get_payload(decode=True))
else:
    raise DieScreamingInAnguish('aaaargh!')  # pseudo-pseudocode

这是非常简单的,因为它假设(就像您当前的,甚至更破碎的解决方案一样)消息包含单个文本部分。将其扩展到多部分消息在技术上并不难,但具体如何做到这一点取决于您期望接收的多部分类型以及您想要对有效负载做什么。

就像在您之前的问题中一样,我建议您将更多或全部电子邮件操作转移到 Python 中,如果您仍然要使用它的话。Procmail 没有明确的 MIME 支持,因此您必须在 Procmail 中重新发明所有这些,这既不简单也没有特别的成果。

于 2014-10-20T09:51:57.023 回答
0

我认为这可能是您首先echo没有返回正确的 unicode 来写入您的文件,这里有两个可能对您有所帮助的解决方案:

用转义字符回显:

echo -e "$BODY" >> $HOME/$FILENAME; \

或者,使用iconv或类似方法将文件编码为 utf-8,假设您在 linux 中有 iconv

iconv -t UTF-8 original.txt > encoded_result.txt
于 2014-10-16T11:59:37.937 回答