2

Django に電子メール クライアントがあります。現在、imaplib を使用して GMail アカウントをサポートしています。

私の問題は、電子メール全体をダウンロードせずに添付ファイル名を取得したいということです。現在、添付ファイル名またはメール本文を取得するには、パラメーター (RFC822) を指定したフェッチ関数を使用してメール全体をダウンロードする必要があります。

たとえば、cc などから件名の HEADER.FIELDS を使用してのみ、特定のフィールドを取得できることを知っています。しかし、電子メール全体をダウンロードせずに添付ファイル名または電子メール本文を取得する方法はありますか?

具体的には、本文に 1 行のテキストと 15Mb の添付ファイルが 2 つある 30Mb のメールがあるとします。30Mb の本文全体をダウンロードせずに、添付ファイル名とそのテキスト行を取得したいと考えています。

ありがとうございました

4

2 に答える 2

3

[編集]

さて、ここに行きます=)

>>> import imaplib, email
>>> mail = imaplib.IMAP4_SSL('imap.gmail.com')
>>> mail.login('emailaddr@gmail.com', 'password')
('OK', ['emailaddr@gmail.com Inget Namn authenticated (Success)'])
>>> mail.select('inbox')
('OK', ['14'])
>>> result, data = mail.uid('search', None, 'ALL')
>>> uids=data[0].split()
>>> result, data = mail.uid('fetch', uids[-1], 'BODYSTRUCTURE')
>>> print data
['14 (UID 340 BODYSTRUCTURE ((("TEXT" "PLAIN" ("CHARSET" "ISO-8859-1") NIL NIL "7BIT" 17 1 NIL NIL NIL)("TEXT" "HTML" ("CHARSET" "ISO-8859-1") NIL NIL "7BIT" 17 1 NIL NIL NIL) "ALTERNATIVE" ("BOUNDARY" "20cf3071d16a5a877b04d0adcc43") NIL NIL)("APPLICATION" "PDF" ("NAME" "attiny40.pdf") NIL NIL "BASE64" 8429956 NIL ("ATTACHMENT" ("FILENAME" "attiny40.pdf")) NIL) "MIXED" ("BOUNDARY" "20cf3071d16a5a878104d0adcc45") NIL NIL))']
>>>

このメッセージの添付ファイルは「attiny40.pdf」と呼ばれ、BODYSTRUCTUREでその名前をはっきりと確認できます。残っているのは、そのBODYSTRUCTUREを解析することだけです。

コードは、以下の最後のリンクからほとんど直接引用されています。

[/編集]

フェッチのパラメータをRFC822からBODYSTRUCTUREに変更する必要があります。

そして、例えばここで説明されているように。

たとえば、テキストとBASE64でエンコードされたテキスト添付ファイルで構成される2つの部分からなるメッセージは、次の本文構造を持つことができます:(( "TEXT" "PLAIN"( "CHARSET" "US-ASCII")NIL NIL "7BIT" 1152 23 )( "TEXT" "PLAIN"( "CHARSET" "US-ASCII" "NAME" "cc.diff") "960723163407.20117h@cac.washington.edu" "Compiler diff" "BASE64" 4554 73) "MIXED")

この投稿これも参照してください。最後のリンクは、あなたがやろうとしていることとほとんど同じように見えます。

于 2012-12-12T20:33:08.773 に答える
3

あなたが私があなたが求めていると思うことを求めていると仮定して、これが何をすべきかです:

まず、をフェッチしBODYSTRUCTUREます。GmailのIMAPサーバーがこれをサポートしていると仮定すると、次のようなものが返されます。

(("TEXT" "PLAIN" ("CHARSET" "UTF-8") NIL NIL "QUOTED-PRINTABLE" 56 1 NIL NIL NIL NIL)
 ("TEXT" "HTML" ("CHARSET" "UTF-8") (NAME "") NIL NIL "BASE64" 12345 NIL 
  ("attachment" ("FILENAME" "")) NIL NIL) 
 ("IMG" "JPEG" (NAME "funny picture") NIL NIL "BASE64" 56789 NIL
  ("attachment" ("FILENAME" "image.jpg")) NIL NIL))
 "MIXED" ("BOUNDARY" "----_=_NextPart_001_1234ABCD.56789EF0") NIL NIL NIL)

そして(BODY ENVELOPE)、構造が1つあることをフェッチします。

RFC3501 7.4.2を見ると、これらの処理方法が説明されています。

(BODY[1])(BODY[2])がメインコンテンツのプレーンテキストバージョンとHTMLバージョンであり(BODY[3])、最初の実際の添付ファイルであると判断したら(BODY[1])、をフェッチしてプレーンテキストの本文をダウンロードし、から添付ファイルの名前を取得します。構造。

申し訳ありませんが、ここにコードはありません。imaplibstdlib MIMEおよびメール関連のモジュールのいずれかまたはいずれも(構造の解釈)あなたにとって難しい部分を行うとは思いませんが、実際にはチェックしていないので、最初にそこを調べます。そうではなく、PyPIにアクセスして、他の誰かがすでにコードを記述していないかどうかを確認してください。

ええと、実際には、最初にフェッチしBODYSTRUCTURE、特定のメッセージについては、コード全体を書く前にGmailが完全にサポートされていることを確認します…</ p> (BODY ENVELOPE)(BODY[3])

PS、最悪の事態が発生した場合、ユースケースが説明したように単純で厳格な場合は、いつでもフェッチBODYSTRUCTUREして失敗した場合(BODY[1])にフォールバックしRFC822、構造でハッキーな正規表現を実行する代わりに添付ファイル名を取得できます実際の解析。私はこれを、Gmailについて学ぶためのワンショットスクリプトまたはクイック&ダーティプロトタイプ以外には書きませんが、そのような場合は、おそらく書きます。

于 2012-12-12T20:25:25.117 に答える