6 from email.parser import BytesParser
7 from email.message import EmailMessage
8 from email.policy import default
10 from dateutil import parser
12 def process_mailbox(M):
13 rv, data = M.search(None, 'UNSEEN')
15 print('Failed to search for UNSEEN messages')
20 for num in data[0].split():
21 rv, data = M.fetch(num, '(RFC822)')
23 print('Error fetching message from server: {}'.format(num))
26 msg = BytesParser(policy=default).parsebytes(data[0][1])
29 'subject': msg['Subject']
32 return mails, n_failures
34 mailboxes = ['Notifications/NPPC/Updates', 'Notifications/NPPC/Uptime', 'Notifications/NPPC/Icinga']
35 credential_file = './account'
38 with open(credential_file) as f:
41 creds = [line.rstrip('\n') for line in creds]
43 M = imaplib.IMAP4_SSL(creds[2])
46 M.login(creds[0], creds[1])
47 except imaplib.IMAP4.error:
54 rv, data = M.select(box)
56 print('Failed to open {}'.format(box))
60 all_messages[box] = process_mailbox(M)
63 for box, messages in all_messages.items():
65 ms = sorted(messages[0],
66 key=lambda m: parser.parse(m['date']))
68 content = '{} failures to fetch messages in {}\n'.format(messages[1], box)
69 ms = ["{}: {}".format(m['date'], m['subject'])
71 content += '\n'.join(ms)
72 email_content.append(content)
74 email_content = '\n\n'.join(email_content)
76 summary = EmailMessage()
77 summary.set_content(email_content)
78 summary['Subject'] = datetime.datetime.now().strftime('Summary of emails on %c')
79 summary['From'] = 'maf54@aber.ac.uk'
80 summary['To'] = 'maf54@aber.ac.uk'
82 s = smtplib.SMTP('smtphost.aber.ac.uk')
83 s.sendmail('maf54@aber.ac.uk', 'maf54@aber.ac.uk', summary.as_string())