8

私のアプリケーションは python で書かれています。私がやっていることは、postfix によって受信された各電子メールでスクリプトを実行し、電子メールの内容で何かを行うことです。Procmail は、電子メールを入力として受け取るスクリプトの実行を担当します。入力メッセージ(テキストの可能性があります)をemail_messageオブジェクトに変換していたときに問題が発生しました(後者が便利なため)。私は email.message_from_string を使用しています (email はデフォルトのメールモジュールで、python に付属しています)。

import email message = email.message_from_string(original_mail_content) message_body = message.get_payload()

この message_body は、リスト [email.message.Message インスタンス、email.message.Message インスタンス] を返すこともあれば、文字列 (受信メールの実際の本文の内容) を返すこともあります。それはなぜです。そして、私はもう1つの観察結果を見つけました。email.message.Message.get_payload() docstring を参照していたときに、これを見つけました..
""" ペイロードはリスト オブジェクトまたは文字列のいずれかになります。リスト オブジェクトを変更する場合は、メッセージのペイロードを変更します場所....."""

では、Python を介して電子メールの本文を取得する一般的な方法をどのように使用すればよいでしょうか? 私を助けてください。

4

4 に答える 4

10

クレイジーに見えるかもしれませんが、時々文字列、時々リストセマンティクスの理由はドキュメントに記載されています。基本的に、マルチパート メッセージはリストとして返されます。

于 2009-02-27T12:31:24.373 に答える
10

単純にサブパートを探すのではなく、 walk() を使用してメッセージの内容を反復処理します

def walkMsg(msg):
  for part in msg.walk():
    if part.get_content_type() == "multipart/alternative":
      continue
    yield part.get_payload(decode=1)

walk() メソッドは、ループできるイテレータを返します (つまり、ジェネレータです)。メッセージがパーツのコンテナでない場合 (つまり、添付ファイルや代替物がない場合)、walk() メソッドは単一の要素 (メッセージ自体) を持つ反復子を返します。

「マルチパート」パーツは単なる接着剤であるため、スキップする必要があります。

上記のメソッドは、読み取り可能なすべての部分を返します。これを拡張して、探している情報がテキスト部分に含まれている場合は、単にテキスト部分を返すことができます。

Python 2.5 の時点で、メソッド get_type()、get_main_type()、および get_subtype() が削除されていることに注意してください -> http://docs.python.org/library/email.message.html#email.message.Message.walk .

于 2010-08-22T23:04:49.570 に答える
0

MIMEマルチパートかもしれません

http://docs.python.org/library/email.parser.html#additional-notesを参照してください

于 2009-02-27T12:30:42.550 に答える