0

私は最近、Pythonのimaplibとemailモジュールで遊んでいます。imaplib / emailモジュールを使用して、大きな電子メール(ほとんどのデータが添付ファイルではなく電子メールの本文に含まれている)を送受信してみました。

ただし、電子メールサーバーから大きな電子メール(8MB程度を超えるサイズ)をダウンロードし、「email.message_from_string()」メソッドを使用してフォーマットすると、問題が発生することに気付きました。その方法にかかる時間は非常に長い時間のようです(16 MBの電子メールの場合は平均で約300〜310秒)。注:このような大きなメールの送信には、それほど時間はかかりません。約40秒です。繰り返しになりますが、すべてのデータは電子メールの本文にあり、添付ファイルにはありません。すべてのデータを添付ファイルとして同じメールをダウンロードすると、操作全体が30〜40秒で終了します。これは私がしていることです:

buf = []
t, d = mailacct.search(None, 'SUBJECT', subj)
for num in d:
    t, msg = mailacct.fetch(num, '(RFC822)')

    for resp in msg:
        if isinstance(resp, tuple):
            buf.append(email.message_from_string(resp[1])

コードの各部分のタイミングを個別に設定しました。mailacct.searchとmailacct.fetchはどちらも、16 MBの電子メールで約30〜40秒で終了します。email.message_from_string(resp [1])の行は、約280〜300秒かかります。

私はPythonの初心者です。それで、私は上記のコードで本当に非効率的なことをしていますか?または、問題はemail.message_from_string()メソッドにありますか、おそらく非効率的な実装ですか?それとも、電子メールの本文に大量のデータが含まれることを意図しておらず、パフォーマンスが低下している可能性がありますか?

*編集*:追加情報:IMAP接続の作成にimaplib.IMAP4_SSLを使用しました。最初にimaplib.append()を使用してメッセージをメールアカウントにアップロードしました。ペイロードにはランダムに生成されたバイナリデータを使用しました。

4

1 に答える 1

1

さて、私は電子メールモジュールのソースコードを調べて自分で掘り下げました。email / parser.pyの解析関数(parse())は、email.message_from_string()が呼び出されたときに実際に電子メールメッセージを処理する関数です。文字列を8192バイトのブロックで解析しているように見えるため、大きなデータの場合は非常に時間がかかります。文字列全体を一度に読み取って処理するようにコードを変更し、大きな電子メールメッセージの処理にかかる時間が大幅に改善されました。

本当に大きな文字列を処理するために、最初は8192のブロックで文字列を処理するように設定されていたと思いますか?電子メールモジュールのソースコードを変更するよりも、これを行うためのより良い方法はありますか?

于 2010-08-23T04:32:57.473 に答える