]> git.friedersdorff.com Git - max/email_syndication.git/blob - syndicate.py
Close Mbox and logout of server before quitting
[max/email_syndication.git] / syndicate.py
1 #!/usr/bin/env python
2
3 import imaplib
4 import smtplib
5 import datetime
6 from email.parser import BytesParser
7 from email.message import EmailMessage
8 from email.policy import default
9
10 from dateutil import parser
11
12 def process_mailbox(M):
13     rv, data = M.search(None, 'UNSEEN')
14     if rv != 'OK':
15         print('Failed to search for UNSEEN messages')
16         return [], -1
17
18     mails = []
19     n_failures = 0
20     for num in data[0].split():
21         rv, data = M.fetch(num, '(RFC822)')
22         if rv != 'OK':
23             print('Error fetching message from server: {}'.format(num))
24             n_failures += 1
25
26         msg = BytesParser(policy=default).parsebytes(data[0][1])
27         mails.append({
28             'date': msg['Date'],
29             'subject': msg['Subject']
30         })
31
32     return mails, n_failures
33
34 mailboxes = ['Notifications/NPPC/Updates', 'Notifications/NPPC/Uptime', 'Notifications/NPPC/Icinga']
35 credential_file = './account'
36
37 creds = None
38 with open(credential_file) as f:
39     creds = f.readlines()
40
41 creds = [line.rstrip('\n') for line in creds]
42
43 M = imaplib.IMAP4_SSL(creds[2])
44
45 try:
46     M.login(creds[0], creds[1]) 
47 except imaplib.IMAP4.error:
48     print('Login Failed')
49     exit(1)
50
51 all_messages = {}
52
53 for box in mailboxes:
54     rv, data = M.select(box)
55     if rv != 'OK':
56         print('Failed to open {}'.format(box)) 
57         exit(1)
58
59
60     all_messages[box] = process_mailbox(M)
61
62 email_content = [] 
63 for box, messages in all_messages.items():
64
65     ms = sorted(messages[0], 
66                 key=lambda m: parser.parse(m['date']))
67
68     content = '{} failures to fetch messages in {}\n'.format(messages[1], box)
69     ms = ["{}: {}".format(m['date'], m['subject'])
70           for m in ms]
71     content += '\n'.join(ms)
72     email_content.append(content)
73
74 email_content = '\n\n'.join(email_content)
75
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'
81
82 s = smtplib.SMTP('smtphost.aber.ac.uk')
83 s.sendmail('maf54@aber.ac.uk', 'maf54@aber.ac.uk', summary.as_string())
84 s.quit()
85
86 M.close()
87 M.logout()