-
Notifications
You must be signed in to change notification settings - Fork 0
/
mail_retriever.py
59 lines (49 loc) · 2.03 KB
/
mail_retriever.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
import imaplib
import poplib
import email
from email.parser import BytesParser
from email.policy import default
import os
async def retrieve_emails(protocol, server, port, username, password, mailbox, use_ssl, display_emails, update_progress, save_directory):
try:
if protocol == "IMAP":
if use_ssl:
conn = imaplib.IMAP4_SSL(server, port)
else:
conn = imaplib.IMAP4(server, port)
conn.login(username, password)
conn.select(mailbox)
typ, data = conn.search(None, 'ALL')
email_ids = data[0].split()
total_emails = len(email_ids)
emails = []
for i, email_id in enumerate(email_ids):
typ, msg_data = conn.fetch(email_id, '(RFC822)')
msg = BytesParser(policy=default).parsebytes(msg_data[0][1])
emails.append(msg)
update_progress(i + 1, total_emails) # Update progress with current count and total
conn.logout()
elif protocol == "POP3":
if use_ssl:
conn = poplib.POP3_SSL(server, port)
else:
conn = poplib.POP3(server, port)
conn.user(username)
conn.pass_(password)
email_ids, _ = conn.stat()
emails = []
for i in range(email_ids):
typ, msg_data, octets = conn.retr(i + 1)
msg = BytesParser(policy=default).parsebytes(b'\n'.join(msg_data))
emails.append(msg)
update_progress(i / email_ids)
conn.quit()
if save_directory:
if not os.path.exists(save_directory):
os.makedirs(save_directory)
for i, email in enumerate(emails):
with open(os.path.join(save_directory, f'email_{i}.eml'), 'wb') as f:
f.write(email.as_bytes())
display_emails(emails)
except Exception as e:
display_emails([], error=str(e))