> $HOME/$FILENA-6ren">
gpt4 book ai didi

python - procmail处理后的邮件正文编码

转载 作者:太空宇宙 更新时间:2023-11-04 11:02:36 25 4
gpt4 key购买 nike

我在 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 脚本中。正如 tripleee 所建议的那样。

最佳答案

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

通过检查邮件客户端中的消息来源,您应该看到 Procmail 或 Bash 实际上没有改变任何东西。您收到的文本实际上是 Administrator System=C3=B3w 但 MIME header 会通知您的电子邮件客户端这是 Content-Transfer-Encoding: quoted-printable内容类型:文本/纯文本; charset="utf-8" 所以它知道如何正确解码和显示它。

如果您只需要有效载荷,则需要自己对其进行解码,但为此,您需要来自 MIME header 的信息,因此在处理消息之前不应该杀死它们(如果有的话) ).可能是这样的:

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 中重新发明所有这些,这既不简单也不特别有成效。

关于python - procmail处理后的邮件正文编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26403296/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com