gulag/app/GulagMailbox.py

90 lines
2.7 KiB
Python

import imaplib
import email
import email.header
class IMAPmailboxException(Exception):
message = None
def __init__(self,message):
self.message = str(message)
class IMAPmailbox:
imap_server = None
imap_user = None
imap_pass = None
imap_mailbox = None
mailbox = None
def __init__(self, imap_server, imap_user, imap_pass, imap_mailbox):
self.imap_server = imap_server
self.imap_user = imap_user
self.imap_pass = imap_pass
self.imap_mailbox = imap_mailbox
try:
self.mailbox = imaplib.IMAP4(self.imap_server)
rv, data = self.mailbox.login(self.imap_user, self.imap_pass)
except imaplib.IMAP4.error as e:
raise IMAPmailboxException(
"LOGIN FAILED FOR " + self.imap_user + '@' + self.imap_server
) from e
except ConnectionRefusedError as e:
raise IMAPmailboxException(
self.imap_user + ": IMAP server " + self.imap_server + " refused connection"
) from e
rv, data = self.mailbox.select(self.imap_mailbox)
if rv != 'OK':
raise IMAPmailboxException(
"ERROR: Unable to select mailbox: " + self.imap_mailbox
)
def close(self):
self.mailbox.close()
self.mailbox.logout()
def get_unseen_messages(self):
results = []
rv, data = self.mailbox.uid('SEARCH', 'UNSEEN')
if rv != 'OK':
return
for uid in data[0].split():
rv, data = self.mailbox.uid('FETCH', uid, '(RFC822)')
if rv != 'OK':
print("ERROR getting message", str(uid))
continue
results.append({
'imap_uid': uid,
'msg': email.message_from_bytes(data[0][1])
})
return results
def get_message(self,imap_uid):
rv, data = self.mailbox.uid('FETCH', imap_uid, '(RFC822)')
if rv != 'OK':
raise IMAPmailboxException("ERROR getting message: %s", str(imap_uid))
return email.message_from_bytes(data[0][1])
def get_attachments(self,imap_uid):
results = []
rv, data = self.mailbox.uid('FETCH', imap_uid, '(RFC822)')
if rv != 'OK':
raise IMAPmailboxException("ERROR getting message: %s", str(imap_uid))
msg = email.message_from_bytes(data[0][1])
for part in msg.walk():
if part.get_filename():
# ist ein Attachment
filename = email.header.decode_header(part.get_filename())
if filename[0][1]:
# Encoded
filename = filename[0][0].decode(filename[0][1])
else:
# Nicht encoded
filename = filename[0][0]
results.append({
'filename': filename,
'content-type': part.get_content_type(), # Ist das wirklich wahr?
'content': part.get_payload(decode=True)
})
# Ende if part.get_filename()
return results