【问题标题】:How to get unread messages and set message read flags over IMAP using Python?如何使用 Python 通过 IMAP 获取未读消息并设置消息读取标志?
【发布时间】:2014-05-16 09:03:38
【问题描述】:
import imaplib
def read():

    userName = "xxx@gmail.com"
    password = "xxxx" 
    name = 'xxx@gmail.com'
    email_ids = [userName]
    data = []
    imap_server = imaplib.IMAP4_SSL("imap.gmail.com",993)
    imap_server.login(userName, password)
    imap_server.select('INBOX')
    da = []
    status, response = imap_server.status('INBOX', "(UNSEEN)")
    unreadcount = int(response[0].split()[2].strip(').,]'))
    print unreadcount

    status, response = imap_server.search(None, '(FROM "xxx@gmail.com")')
    email_ids = [e_id for e_id in response[0].split()]
    for e_id in email_ids:
        _, response = imap_server.fetch(e_id, '(UID BODY[TEXT])')
        da.append(response[0][1])
    print da


read()

如何组织上面的代码,只读取未读邮件? 另外,一旦我们阅读了它们,如何使用 Python 将这些消息标记为已读邮件?

【问题讨论】:

    标签: python email imap


    【解决方案1】:
    import imaplib
    
    def read(username, password, sender_of_interest):
        # Login to INBOX
        imap = imaplib.IMAP4_SSL("imap.gmail.com", 993)
        imap.login(username, password)
        imap.select('INBOX')
    
        # Use search(), not status()
        status, response = imap.search(None, 'INBOX', '(UNSEEN)')
        unread_msg_nums = response[0].split()
    
        # Print the count of all unread messages
        print len(unread_msg_nums)
    
        # Print all unread messages from a certain sender of interest
        status, response = imap.search(None, '(UNSEEN)', '(FROM "%s")' % (sender_of_interest))
        unread_msg_nums = response[0].split()
        da = []
        for e_id in unread_msg_nums:
            _, response = imap.fetch(e_id, '(UID BODY[TEXT])')
            da.append(response[0][1])
        print da
    
        # Mark them as seen
        for e_id in unread_msg_nums:
            imap.store(e_id, '+FLAGS', '\Seen')
    

    【讨论】:

      【解决方案2】:
      def read(username, password, sender_of_interest=None):
          # Login to INBOX
          imap = imaplib.IMAP4_SSL("imap.gmail.com", 993)
          imap.login(username, password)
          imap.select('INBOX')
          # Use search(), not status()
          # Print all unread messages from a certain sender of interest
          if sender_of_interest:
              status, response = imap.uid('search', None, 'UNSEEN', 'FROM {0}'.format(sender_of_interest))
          else:
              status, response = imap.uid('search', None, 'UNSEEN')
          if status == 'OK':
              unread_msg_nums = response[0].split()
          else:
              unread_msg_nums = []
          data_list = []
          for e_id in unread_msg_nums:
              data_dict = {}
              e_id = e_id.decode('utf-8')
              _, response = imap.uid('fetch', e_id, '(RFC822)')
              html = response[0][1].decode('utf-8')
              email_message = email.message_from_string(html)
              data_dict['mail_to'] = email_message['To']
              data_dict['mail_subject'] = email_message['Subject']
              data_dict['mail_from'] = email.utils.parseaddr(email_message['From'])
              data_dict['body'] = email_message.get_payload()
              data_list.append(data_dict)
          print(data_list)
      

      【讨论】:

        【解决方案3】:

        您可以使用我的库 - imap_tools: https://pypi.org/project/imap-tools/

        from imap_tools import MailBox, A
        
        # get subjects of unseen emails from INBOX folder
        with MailBox('imap.mail.com').login('test@mail.com', 'pwd') as mailbox:
            subjects = [msg.subject for msg in mailbox.fetch(A(seen=False), mark_seen=True)]
        

        【讨论】:

          猜你喜欢
          • 2013-12-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-06-28
          • 1970-01-01
          • 1970-01-01
          • 2016-10-13
          相关资源
          最近更新 更多