aboutsummaryrefslogtreecommitdiff
path: root/utils
diff options
context:
space:
mode:
Diffstat (limited to 'utils')
-rw-r--r--utils/client.py51
-rw-r--r--utils/mail.py16
2 files changed, 36 insertions, 31 deletions
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))
diff --git a/utils/mail.py b/utils/mail.py
index 491faa8..3df068b 100644
--- a/utils/mail.py
+++ b/utils/mail.py
@@ -1,18 +1,20 @@
from pyzmail import PyzMessage, decode_text
+
class Email(object):
def __init__(self, raw_mail_lines):
- msg_content = b'\r\n'.join(raw_mail_lines)
- msg = PyzMessage.factory(msg_content)
+ msg = PyzMessage.factory(raw_mail_lines)
self.subject = msg.get_subject()
- self.sender = msg.get_address('from')
- self.date = msg.get_decoded_header('date', '')
- self.id = msg.get_decoded_header('message-id', '')
+ self.sender = msg.get_address("from")
+ self.date = msg.get_decoded_header("date", "")
+ self.id = msg.get_decoded_header("message-id", "")
for mailpart in msg.mailparts:
- if mailpart.is_body=='text/plain':
- payload, used_charset=decode_text(mailpart.get_payload(), mailpart.charset, None)
+ if mailpart.is_body == "text/plain":
+ payload, used_charset = decode_text(
+ mailpart.get_payload(), mailpart.charset, None
+ )
self.charset = used_charset
self.text = payload
return