7

Gmailメールボックスで選択した受信メールから有用な情報を抽出するためのソリューションを見つけました。

この例の目的は、石油の月額料金を提供するニュースレターから送信されたすべてのメールを取得することです。このようなニュースレターは、EIAのWebサイトで自由に購読できます。このようなニュースレターはすべて、Gmailメールボックスの同じフォルダーに届き、「$」で始まります。

メールの内容はそのようなものです

ここに画像の説明を入力してください

私の目的は、このような最後の10通の電子メール(過去10か月)を取得し、米国のさまざまな地域の石油価格を時間でプロットするスクリプトを作成することです。

4

1 に答える 1

25

Pythonemailライブラリが役立ちます。

import email, getpass, imaplib, os, re
import matplotlib.pyplot as plt

このディレクトリは、添付ファイルを保存する場所です

 detach_dir = "F:\OTHERS\CS\PYTHONPROJECTS"  

次に、スクリプトはユーザー(または自分自身)にアカウント機能を要求します

user = raw_input("Enter your GMail username --> ")
pwd = getpass.getpass("Enter your password --> ")

次に、Gmailimapサーバーに接続してログインします

m = imaplib.IMAP4_SSL("imap.gmail.com")
m.login(user, pwd)

1つのフォルダを選択すると、代わりにINBOX全体を使用できます

m.select("BUSINESS/PETROLEUM")    

m.list()すべてのメールボックスを取得するために使用する必要があります。指定された送信者からのすべての電子メールを検索し、メールIDを選択します。

resp, items = m.search(None, '(FROM "EIA_eLists@eia.gov")')
items = items[0].split()  

my_msg = [] # store relevant msgs here in please
msg_cnt = 0
break_ = False

最後のメールが欲しいので、使っていますitems[::-1]

for emailid in items[::-1]:

    resp, data = m.fetch(emailid, "(RFC822)")

    if ( break_ ):
        break

    for response_part in data:

      if isinstance(response_part, tuple):
          msg = email.message_from_string(str(response_part[1]))
          varSubject = msg['subject']
          varDate = msg['date']

で始まるものだけが欲しい$

          if varSubject[0] == '$':
              r, d = m.fetch(emailid, "(UID BODY[TEXT])")

              ymd = email.utils.parsedate(varDate)[0:3]
              my_msg.append([ email.message_from_string(d[0][1]) , ymd ])

              msg_cnt += 1

N=100の最後のメッセージだけが欲しい

              if ( msg_cnt == 100 ):
                  break_ = True

l = len(my_msg)
US, EastCst, NewEng, CenAtl, LwrAtl, Midwst, GulfCst, RkyMt, WCst, CA = 
[0]*l, [0]*l, [0]*l, [0]*l, [0]*l, [0]*l, [0]*l, [0]*l, [0]*l, [0]*l 
absc = [k for k in range(len(my_msg))]
dates = [str(msg[1][2])+'-'+str(msg[1][3])+'-'+str(msg[1][0]) for msg in my_msg]
cnt = -1

for msg in my_msg:

    data = str(msg[0]).split("\n")
    cnt+=1
    for c in [k.split("\r")[0] for k in data[2:-2]]: 

正規表現を使用して関連情報を取得する

        m = re.match( r"(.+)(=3D\$)(.+)" , c )  
        if( m == None ):
            continue 

        country, na, price = m.groups()

        if ( country == "US" or country == "USA" ) :
            US[cnt] = float(price)
        elif( country == "NewEng" ) :
            EastCst[cnt] = float(price)    
        elif( country == "EastCst" ) :
            NewEng[cnt] = float(price)  
        elif( country == "EastCst" ) :
            CenAtl[cnt] = float(price) 
        elif( country == "EastCst" ) :
            LwrAtl[cnt] = float(price)
        elif( country == "EastCst" ) :
            Midwst[cnt] = float(price)
        elif( country == "EastCst" ) :
            GulfCst[cnt] = float(price)
        elif( country == "EastCst" ) :
            RkyMt[cnt] = float(price)
        elif( country == "EastCst" ) :
            WCst[cnt] = float(price)
        elif( country == "EastCst" ) :
            CA[cnt] = float(price)

これらすべての曲線を米国の価格でプロットします

plt.plot( absc, US )

plt.plot( absc, EastCst )    
plt.plot( absc, NewEng, '#251BE0' )    
plt.plot( absc, EastCst, '#1BE0BF' )
plt.plot( absc, CenAtl, '#E0771B' )
plt.plot( absc, LwrAtl, '#CC1BE0' )
plt.plot( absc, Midwst, '#E01B8B' ) 
plt.plot( absc, GulfCst, '#E01B3F' )
plt.plot( absc, RkyMt )
plt.plot( absc, WCst )
plt.plot( absc, CA )

plt.legend( ('US', 'EastCst', 'NewEng' , 'EastCst', 'CenAtl', 'LwrAtl', 'Midwst', 'GulfCst', 'RkyMt', 'WCst', 'CA')  )
plt.title('Diesel price')
locs,labels = plt.xticks(absc, dates)
plt.show()

いくつかの関連する興味深いトピックはここにあります

新しいメールのみを取得する

メール本文を取得する

添付ファイル付きのメールを転送する

Gmailで本文のメールを取得する

結果は3つの領域についてのみここにあります

私たちの価格

于 2013-01-12T14:04:10.897 に答える