【问题标题】:Extract information from Gmail with Python使用 Python 从 Gmail 中提取信息
【发布时间】:2012-12-26 23:21:39
【问题描述】:

我已经通过解决方案从 Gmail 邮箱中选定的已接收电子邮件中提取有用信息

本示例的目标是获取从提供石油月度价格的时事通讯发送的所有邮件。您可以在 EIA 网站上免费订阅此类通讯。所有此类时事通讯都到达我的 gmail 邮箱的同一个文件夹中,并以“$”开头。

电子邮件的内容是这样的

我的目标是编写一个脚本,获取最后 10 封此类电子邮件(过去 10 个月)并绘制美国不同地区的石油价格随时间变化的图。

【问题讨论】:

    标签: python gmail extract imaplib


    【解决方案1】:

    Python email 库会有所帮助。

    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 --> ")
    

    然后连接到 gmail imap 服务器并登录

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

    选择一个文件夹,你可以使用整个收件箱来代替

    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()
    

    这里有一些相关的有趣话题

    Get only new emails

    Fetch mail body

    Forward emails with attachment

    Fetch body emails in gmail

    结果仅针对三个区域

    【讨论】:

    • 我在 msg = email.message_from_string(response_part[1])TypeError: initial_value must be str or None, not bytes 的行中遇到错误
    • @DebdutGoswami 尝试改用 email.message_from_bytes() 方法(因为来自responses_part的数据属于字节类型)。
    • mmwahhhhh,这很有用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-30
    • 2017-01-11
    • 2020-09-23
    相关资源
    最近更新 更多