3

ジソンの使用

メールにさまざまな添付ファイルが添付されている状況があります。私が処理する特定のファイルタイプは、無視してファイルに書き込みません。添付ファイルとして電子メールを送信することがあり、その添付電子メールには法的な添付ファイルが含まれているため、私はかなり厄介な状況に陥っています。

私がやりたいことは、添付された電子メールとそのすべての添付ファイルをスキップすることです。

python/jythons std email libを使用してこれを行うにはどうすればよいですか?


明確にするために

電子メール (ROOT 電子メールという名前) を解析する必要があります。jython を使用して、この電子メールから添付ファイルを取得したいと考えています。次に、.pdf .doc などの特定の添付ファイルがサポートされるようになりました。クライアントは、添付ファイルとして別の電子メール メッセージ (CHILD 電子メール) を含む電子メール (ROOT 電子メール) を送信し、CHILD 電子メールには .pdf 添付ファイルなどがあります。お気に入り。

私が必要としているのは、ROOT メールに添付された CHILD メールと CHILD メールの添付ファイルを削除することです。何が起こるかというと、電子メール全体を調べて、ROOT 添付ファイルであるかのように、すべての添付ファイル、ROOT 添付ファイルと CHILD 添付ファイルの両方を解析するだけです。

私はこれを持つことができません。.pdf .doc などの合法的な ROOT 添付ファイルのみに関心があります。xls .rtf .tif .tiff

バスに間に合うように走らなきゃ!ありがとう!

4

4 に答える 4

1

既存の提案の問題は walk メソッドです。これは再帰的に、深さ優先で、子を含むツリー全体をウォークします。

walk メソッドのソースを見て、再帰部分をスキップするように調整します。大まかに読むと、次のことが示唆されます。

if msg.is_multipart():
    for part in msg.get_payload():
          """ Process message, but do not recurse """
          filename = part.get_filename()

pydocs を読むと、get_payload は再帰せずに最上位メッセージのリストを返す必要があります。

于 2008-11-26T15:38:34.353 に答える
0

「上記のようなMIMEメッセージをファイルのディレクトリに解凍する方法の例は次のとおりです」という名前の例はどうですか?それはあなたが望むものから近く見えます。

import email
...
msg = email.message_from_file(fp)
...
for part in msg.walk():
    # multipart/* are just containers
    if part.get_content_maintype() == 'multipart':
        continue
    # Applications should really sanitize the given filename so that an
    # email message can't be used to overwrite important files
    filename = part.get_filename()
    if not filename:
        ext = mimetypes.guess_extension(part.get_content_type())
    ...
于 2008-11-26T08:58:31.557 に答える
0

「メールの添付ファイルをすべてチェックしなければならないが、添付ファイルがメールである場合は無視したい」という質問の意味は理解しています。いずれにせよ、この答えはあなたを正しい道に導くはずです。

あなたが欲しいと思うのはmimetypes.guess_type(). この方法を使用すると、拡張子のリストをチェックするよりもはるかに優れています。

def check(self, msg):
    import mimetypes

    for part in msg.walk():
        if part.get_filename() is not None:
            filenames = [n for n in part.getaltnames() if n]
            for filename in filenames:
                type, enc = mimetypes.guess_type(filename)
                if type.startswith('message'):
                    print "This is an email and I want to ignore it."
                else:
                    print "I want to keep looking at this file."

これでも添付された電子メールを参照する場合は、次のように変更してください。

def check(self, msg):
    import mimetypes

    for part in msg.walk():
        filename = part.get_filename()
        if filename is not None:
            type, enc = mimetypes.guess_type(filename)
            if type.startswith('message'):
                print "This is an email and I want to ignore it."
            else:
                part_filenames = [n for n in part.getaltnames() if n]
                for part_filename in part_filenames:
                    print "I want to keep looking at this file."

MIME タイプのドキュメント

于 2008-11-26T10:59:27.193 に答える
0

get_payload( [i[, decode]]) メソッドを試しましたか? walk とは異なり、添付ファイルを再帰的に開くことは文書化されていません。

于 2008-11-26T10:52:21.827 に答える