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-printable正しくContent-type: text/plain; charset="utf-8"デコードして表示する方法を知っています。

ペイロードだけが必要な場合は、自分でデコードする必要がありますが、そのためには MIME ヘッダーからのこの情報が必要なので、メッセージを処理する前に (もしあったとしても) それらを kill しないでください。おそらく、次のようなものです。

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 を使用する場合は、電子メール操作の多くまたはすべてを Python に移行することをお勧めします。Procmail は MIME を明示的にサポートしていないため、Procmail でそれらすべてを作り直す必要があります。これは単純でもなく、特に実り多いものでもありません。

于 2014-10-20T09:51:57.023 に答える
0

echoそもそもファイルに書き込むための正しいユニコードを返さない可能性があると思います。ここに役立つ可能性のある多くのソリューションのうちの2つがあります。

エスケープ文字でエコーするには:

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

または、iconvLinux に iconv があると仮定して、または同様の方法でファイルを utf-8 にエンコードします。

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