'邮件主体编码在Procmail处理后'

2024-09-26 22:49:33 发布

您现在位置:Python中文网/ 问答频道 /正文

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

BODY=`formail -I ""`

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

^{pr2}$

我也试过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",$_ )) '`

主题包含UTF8字符,一切看起来都很好。也许有办法对邮件正文使用类似的解决方案?在

好吧。 我终于把一切都安排好了。我是这样做的:

首先,.procmailrc文件:

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

现在来看看python_脚本.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等的许多选项。。。最后找到了最合适的。在

下一个有问题的步骤是在中直接解码$BODY部分。不过,我找到了解决方案,把所有的东西都移到Python脚本中。就像tripleee建议的那样。在


Tags: 文件message编码homegetbodytempfile
2条回答

它没有更改,但您正在对头进行变换,以使正确的Content-Type:头不再存在(您还应该保留Mime-Version:和任何其他标准的Content-*头)。在

通过检查邮件客户机中的消息源,您应该看到Procmail或Bash实际上没有改变任何东西。你收到的文本实际上是Administrator System=C3=B3w,但是MIME头会通知你的电子邮件客户端这是Content-Transfer-Encoding: quoted-printable和{},因此它知道如何正确解码和显示。在

如果只需要有效载荷,则需要自己对其进行解码,但是为了做到这一点,您需要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

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

就像在your previous question中一样,我建议您将更多或全部电子邮件操作移动到Python中,如果您打算使用它的话。Procmail没有明确的MIME支持,因此您必须在Procmail中重新设计所有这些,这既不简单也不特别有效。在

我认为可能是您的echo没有返回正确的unicode来写入文件,下面是许多解决方案中的2个可能会对您有所帮助:

要用转义符回音:

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

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

^{pr2}$

相关问题 更多 >

    热门问题