【问题标题】:Getting n most recent emails using IMAP and Python使用 IMAP 和 Python 获取最近的 n 封电子邮件
【发布时间】:2011-08-03 17:07:24
【问题描述】:

我希望使用 IMAP 从电子邮件帐户收件箱返回 n(很可能是 10)封最近的电子邮件。

到目前为止,我已经拼凑起来:

import imaplib
from email.parser import HeaderParser

M = imaplib.IMAP4_SSL('my.server')
user = 'username'
password = 'password'
M.login(user, password)
M.search(None, 'ALL')
for i in range (1,10):
    data = M.fetch(i, '(BODY[HEADER])')
    header_data = data[1][0][1]
    parser = HeaderParser()
    msg = parser.parsestr(header_data)
    print msg['subject']

这可以很好地返回电子邮件标题,但它似乎是它收到的电子邮件的半随机集合,而不是最近的 10 封。

如果有帮助,我将连接到 Exchange 2010 服务器。也欢迎其他方法,IMAP 似乎是最合适的,因为我只想阅读电子邮件而不发送任何电子邮件。

【问题讨论】:

    标签: python email imap


    【解决方案1】:

    Gmail 的解决方法。由于 IMAP.sort('DATE','UTF-8','ALL') 不适用于 gmail,我们可以将值和日期插入到列表中,并按日期的相反顺序对列表进行排序。可以使用计数器检查前 n 封邮件。如果有数百封邮件,此方法将花费几分钟的时间。

        M.login(user,password)
        rv,data= M.search(None,'ALL')
        if rv=='OK':
            msg_list=[]
            for num in date[0].split():
                rv,data=M.fetch(num,'(RFC822)')
                if rv=='OK':
                    msg_object={}
                    msg_object_copy={}
                    msg=email.message_from_bytes(data[0][1])
                    msg_date=""
                    for val in msg['Date'].split(' '):
                        if(len(val)==1):
                            val="0"+val
                        # to pad the single date with 0
                        msg_date=msg_date+val+" "
                    msg_date=msg_date[:-1]
                  # to remove the last space
                    msg_object['date']= datetime.datetime.strptime(msg_date,"%a, %d %b %Y %H:%M:%S %z")
                # to convert string to date time object for sorting the list
                    msg_object['msg']=msg
                    msg_object_copy=msg_object.copy()
                    msg_list.append(msg_object_copy)
            msg_list.sort(reverse=True,key=lambda r:r['date'])
    # sorts by datetime so latest mails are parsed first
            count=0
            for msg_obj in msg_list:
                count=count+1
                if count==n:
                    break
                msg=msg_obj['msg']
            # do things with the message
    

    【讨论】:

      【解决方案2】:
      # get recent one email
      from imap_tools import MailBox
      with MailBox('imap.mail.com').login('test@mail.com', 'password', 'INBOX') as mailbox:
         for message in mailbox.fetch(limit=1, reverse=True):
             print(msg.date_str, msg.subject)
      

      https://github.com/ikvk/imap_tools

      【讨论】:

        【解决方案3】:

        这是获取 emailFrom、emailSubject、emailDate、emailContent 等的代码。

        import imaplib, email, os
        user = "your@email.com"
        password = "pass"
        imap_url = "imap.gmail.com"
        connection = imaplib.IMAP4_SSL(imap_url)
        connection.login(user, password)
        result, data = connection.uid('search', None, "ALL")
        if result == 'OK':
            for num in data[0].split():
                result, data = connection.uid('fetch', num, '(RFC822)')
                if result == 'OK':
                    email_message = email.message_from_bytes(data[0][1])
                    print('From:' + email_message['From'])
                    print('To:' + email_message['To'])
                    print('Date:' + email_message['Date'])
                    print('Subject:' + str(email_message['Subject']))
                    print('Content:' + str(email_message.get_payload()[0]))
        connection.close()
        connection.logout()        
        

        【讨论】:

          【解决方案4】:

          这对我有用~

          import imaplib
          from email.parser import HeaderParser
          M = imaplib.IMAP4_SSL('my.server')
          user = 'username'
          password = 'password'
          M.login(user, password)
          (retcode, messages) =M.search(None, 'ALL')
           news_mail = get_mostnew_email(messages)
          for i in news_mail :
              data = M.fetch(i, '(BODY[HEADER])')
              header_data = data[1][0][1]
              parser = HeaderParser()
              msg = parser.parsestr(header_data)
              print msg['subject']
          

          这是获取更新的电子邮件功能:

          def get_mostnew_email(messages):
              """
              Getting in most recent emails using IMAP and Python
              :param messages:
              :return:
              """
              ids = messages[0]  # data is a list.
              id_list = ids.split()  # ids is a space separated string
              #latest_ten_email_id = id_list  # get all
              latest_ten_email_id = id_list[-10:]  # get the latest 10
              keys = map(int, latest_ten_email_id)
              news_keys = sorted(keys, reverse=True)
              str_keys = [str(e) for e in news_keys]
              return  str_keys
          

          【讨论】:

          • 代码墙,没有解释。能否请您添加一些解释代码是如何工作的,以便初学者可以更好地理解。
          【解决方案5】:

          排序命令可用,但不保证 IMAP 服务器支持。例如,Gmail 不支持 SORT 命令。

          要尝试排序命令,您可以替换:
          M.search(None, 'ALL')

          M.sort(search_critera, 'UTF-8', 'ALL')

          然后search_criteria 将是一个字符串,如:

          search_criteria = 'DATE' #Ascending, most recent email last
          search_criteria = 'REVERSE DATE' #Descending, most recent email first
          
          search_criteria = '[REVERSE] sort-key' #format for sorting
          

          根据RFC5256,这些是有效的sort-key的:
          "ARRIVAL" / "CC" / "DATE" / "FROM" / "SIZE" / "SUBJECT" / "TO"

          注意事项:
          1.需要charset,试试US-ASCII或者UTF-8其他的都不需要IMAP服务器支持
          2. 还需要搜索条件。 ALL 命令是有效的,但有很多。更多信息请访问http://www.networksorcery.com/enp/rfc/rfc3501.txt

          IMAP 的世界是狂野而疯狂的。祝你好运

          【讨论】:

          • 使用带有任何排序键的排序方法返回:imaplib.error: SORT command error: BAD ['Command Error. 12'],我无法确定这是因为 Outlook 不支持 SORT 调用/方法/参数,还是因为我以错误的方式使用 IMAPlibs 排序方法。
          • 使用第三方库IMAPClient,尝试排序方法引发异常,告诉我服务器不支持排序方法。
          • 是的,很抱歉听到这个消息。就像我说的那样,根据规范,排序方法不是必需的。我无法访问 Exchange,否则我会为您尝试。
          • GMAIL imap 例如不支持排序命令...我就是这种情况,看来您需要获取每封电子邮件,并自行排序。
          猜你喜欢
          • 2011-10-31
          • 2021-01-09
          • 2013-04-30
          • 1970-01-01
          • 2013-02-16
          • 2011-11-13
          • 2018-01-30
          • 1970-01-01
          • 2015-11-16
          相关资源
          最近更新 更多