From afa152d8c5ac8a74945612255f78cb4acbf84450 Mon Sep 17 00:00:00 2001
From: Mole Shang <135e2@135e2.dev>
Date: Wed, 25 Jan 2023 04:10:29 +0800
Subject: refactor: rewrite for IMAP support

- Replaced POP3 with IMAP
- #TODO: custom server URL
- Polish user prompts
---
 utils/client.py | 51 +++++++++++++++++++++++++++------------------------
 1 file changed, 27 insertions(+), 24 deletions(-)

(limited to 'utils/client.py')

diff --git a/utils/client.py b/utils/client.py
index 1dc9205..884a922 100644
--- a/utils/client.py
+++ b/utils/client.py
@@ -1,63 +1,66 @@
 import logging
-import poplib
+from imapclient import IMAPClient
 from utils.mail import Email
 
 
 logger = logging.getLogger(__name__)
 
 
-
 class EmailClient(object):
     def __init__(self, email_account, passwd):
         self.email_account = email_account
         self.password = passwd
-        self.server = self.connect(self)
+        self.server, self.number = self.connect(self)
 
     @staticmethod
     def connect(self):
         # parse the server's hostname from email account
-        pop3_server = 'pop.'+self.email_account.split('@')[-1]
-        server = poplib.POP3_SSL(pop3_server)
+        imap4_server = "mx1." + self.email_account.split("@")[-1]
+        server = IMAPClient(host=imap4_server, use_uid=True)
         # display the welcome info received from server,
         # indicating the connection is set up properly
-        logger.info(server.getwelcome().decode('utf8'))
+        logger.info(server.welcome)
         # authenticating
-        server.user(self.email_account)
-        server.pass_(self.password)
-        return server
+        server.login(self.email_account, self.password)
+        return server, server.select_folder("INBOX")[b"EXISTS"]
 
     def get_mails_list(self):
-        _, mails, _ = self.server.list()
-        return mails
+        messages = self.server.search()
+        dict = self.server.fetch(messages, "RFC822")
+        return sorted(dict.items(), key=lambda e: e[0])  # Do resorts
 
     def get_mails_count(self):
-        mails = self.get_mails_list()
-        return len(mails)
+        return self.number
+
+    def get_mails_unseen_count(self):
+        unseen_messages = self.server.search("UNSEEN")
+        return len(unseen_messages)
 
     def get_mail_by_index(self, index):
-        resp_status, mail_lines, mail_octets = self.server.retr(index)
-        return Email(mail_lines)
+        list = self.get_mails_list()
+        msg_data = list[int(index)-1][1]
+        return Email(msg_data[b"RFC822"])
 
     def __enter__(self):
         return self
 
     def __exit__(self, exc_type, exc_val, exc_tb):
         if exc_type is None:
-            logger.info('exited normally\n')
-            self.server.quit()
+            logger.info("exited normally\n")
+            self.server.shutdown()
         else:
-            logger.error('raise an exception! ' + str(exc_type))
-            self.server.close()
-            return False # Propagate
+            logger.error("raise an exception! " + str(exc_type))
+            self.server.logout()
+            return False  # Propagate
 
 
-
-if __name__ == '__main__':
+if __name__ == "__main__":
     useraccount = "XXXXX"
     password = "XXXXXX"
 
     client = EmailClient(useraccount, password)
     num = client.get_mails_count()
     print(num)
-    for i in range(1, num):
-        print(client.get_mail_by_index(i))
\ No newline at end of file
+
+    for uid, msg_data in client.get_mails_list().items():
+        print(client.get_mail_by_index(uid))
-- 
cgit v1.2.3