imap.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. from imap_tools import MailBox, AND
  2. import re
  3. import json
  4. import os
  5. import plac
  6. from datetime import datetime, date
  7. class Imap:
  8. commands = ['cleanup', 'move']
  9. whitelist = {}
  10. def __init__(self):
  11. self.whitelist = json.load(open(os.path.dirname(__file__) + '/whitelist.json', 'r'))
  12. def cleanup(self):
  13. date_now = datetime.now()
  14. date_criteria = date(date_now.year, date_now.month - 1, 1)
  15. msg_limit = 100
  16. with MailBox('mail.global-cube.com').login('archiv', 'Gc01am64!') as mb:
  17. folder_list = [f.name for f in mb.folder.list() if 'Archive.' in f.name]
  18. for folder in folder_list:
  19. msg_count = mb.folder.status(folder)['MESSAGES']
  20. if msg_count < msg_limit:
  21. continue
  22. mb.folder.set(folder)
  23. messages = mb.fetch(criteria=AND(date_lt=date_criteria), mark_seen=True, headers_only=True)
  24. uids = [msg.uid for msg in messages]
  25. mb.delete(uids[0:(msg_count - msg_limit)])
  26. def move(self):
  27. with MailBox('mail.global-cube.com').login('archiv', 'Gc01am64!') as mb:
  28. messages = mb.fetch(criteria=AND(from_="@global-cube.com"), mark_seen=True, bulk=True, limit=1000, headers_only=True)
  29. for msg in messages:
  30. match = re.findall(r'\+(.*)@', msg.from_)
  31. if not match:
  32. print(msg.from_, msg.to, msg.subject)
  33. else:
  34. domain = '@' + match[0]
  35. subfolder = 'Archive.' + domain.replace('@', '').replace('.', '_')
  36. if not mb.folder.exists(subfolder):
  37. mb.folder.create(subfolder)
  38. if self.is_valid_message(msg, domain):
  39. mb.move(msg.uid, subfolder)
  40. else:
  41. print(domain, ', '.join(msg.to), msg.subject)
  42. # print(msg.text)
  43. # print([att.filename for att in msg.attachments if att.filename.endswith('.pdf')])
  44. def is_valid_message(self, msg, domain):
  45. for to in msg.to:
  46. if domain in to or '@global-cube.de' in to or msg.from_ == to:
  47. continue
  48. if domain not in self.whitelist:
  49. return False
  50. valid_domain = [entry in to for entry in self.whitelist[domain]]
  51. if not any(valid_domain):
  52. return False
  53. return True
  54. if __name__ == '__main__':
  55. plac.Interpreter.call(Imap)