
5 changed files with 221 additions and 48 deletions
@ -0,0 +1,100 @@ |
|||
import imaplib |
|||
import pathlib |
|||
import time |
|||
import os |
|||
from secrets import token_urlsafe |
|||
|
|||
try: |
|||
import imap_settings as settings |
|||
except: |
|||
raise ValueError("Imap settings file not found, please check the readme - miniimap") |
|||
|
|||
|
|||
def connect(): |
|||
"connect to the IMAP server Inbox" |
|||
server = imaplib.IMAP4_SSL(settings.IMAP_HOST) |
|||
server.login(settings.IMAP_USER, settings.IMAP_PWD) |
|||
tmp, data = server.select('Inbox') |
|||
|
|||
#When you connect to the inbox one of the parameters returned is the current |
|||
#number of messages in it |
|||
if os.environ.get('NUMMESSAGES') is None: |
|||
os.environ["NUMMESSAGES"] = data[0].decode("UTF-8") |
|||
|
|||
return server |
|||
|
|||
def bytesmessage_to_string(msg): |
|||
"converts bytes-like message to string" |
|||
if type(msg) is bytes: |
|||
msg = msg.decode("UTF-8").rstrip() |
|||
return msg |
|||
else: |
|||
return str(msg) |
|||
|
|||
def send(inbox, msg): |
|||
"send msg to inbox in MIME format" |
|||
|
|||
server = connect() |
|||
tmp, data = server.append(inbox, flags='', date_time=time.time(), message=str(msg).encode("UTF-8")) |
|||
server.close() |
|||
|
|||
|
|||
def recv_all(): |
|||
"""receive a list of all MIME messages from inbox newer than the last message when first connected""" |
|||
|
|||
server = connect() |
|||
r = [] |
|||
|
|||
tmp, data = server.search(None, 'ALL') |
|||
|
|||
oldermsgid = os.environ.get('NUMMESSAGES') |
|||
|
|||
for num in data[0].split(): |
|||
if int(num) >= int(oldermsgid): |
|||
tmp, data = server.fetch(num, '(RFC822)') |
|||
msg = bytesmessage_to_string(data[0][1]) |
|||
r.append((num, msg)) |
|||
os.environ["NUMMESSAGES"] = num.decode("UTF-8") |
|||
|
|||
server.close() |
|||
|
|||
return r |
|||
|
|||
|
|||
def clean_inbox(): |
|||
"""clean all messsages from IMAP inbox""" |
|||
print('cleaning IMAP...') |
|||
server = connect() |
|||
tmp, data = server.search(None, 'ALL') |
|||
for num in data[0].split(): |
|||
server.store(num, '+FLAGS', '\\Deleted') |
|||
server.expunge() |
|||
server.close() |
|||
print('IMAP inbox empty.') |
|||
|
|||
|
|||
def backup_inbox(): |
|||
"""copy all messsages from IMAP to local backup folder""" |
|||
server = connect() |
|||
tmp, data = server.search(None, 'ALL') |
|||
for num in data[0].split(): |
|||
tmp, data = server.fetch(num, '(RFC822 BODY[HEADER])') |
|||
device = str(data[0][1]).split('From: "')[1].split(' of')[0] |
|||
name = device + "_" + token_urlsafe(16) + ".eml" |
|||
msg = bytesmessage_to_string(data[0][1]) |
|||
with open(os.path.join('Backup/TestInbox',name), "wb") as f: |
|||
f.write(str(msg).encode()) |
|||
|
|||
server.close() |
|||
|
|||
def restore_inbox(): |
|||
"""copy all the messages from the Backup folder to the IMAP inbox""" |
|||
server = connect() |
|||
backups = pathlib.Path("./Backup/TestInbox") |
|||
emails = backups.glob("*.eml") |
|||
l = [ path for path in emails ] |
|||
for p in l: |
|||
with open(p, "rb") as f: |
|||
tmp, data = server.append("Inbox", flags='', date_time=p.stat().st_ctime, message=f.read(-1)) |
|||
|
|||
server.close() |
Loading…
Reference in new issue