|
|
|
import email.header
|
|
|
|
|
|
|
|
import imapclient
|
|
|
|
|
|
|
|
from bureau import Bureau, add_command, add_api
|
|
|
|
|
|
|
|
|
|
|
|
class MailRoom(Bureau):
|
|
|
|
"""
|
|
|
|
The Mail Room handles (electronic) post for the other Bureaus of
|
|
|
|
the Screenless Office.
|
|
|
|
"""
|
|
|
|
|
|
|
|
name = "Mail Room"
|
|
|
|
prefix = "PO"
|
|
|
|
version = 0
|
|
|
|
|
|
|
|
def __init__(self):
|
|
|
|
Bureau.__init__(self)
|
|
|
|
# TODO: multiple accounts / folders
|
|
|
|
if "user" in self.config:
|
|
|
|
self.login = self.config["user"]["login"]
|
|
|
|
self.password = self.config["user"]["password"]
|
|
|
|
self.host = self.config["user"]["host"]
|
|
|
|
self.imapserv = imapclient.IMAPClient(self.host, use_uid=True, ssl=True)
|
|
|
|
self.imapserv.login(self.login, self.password)
|
|
|
|
self.imapserv.select_folder("INBOX")
|
|
|
|
else:
|
|
|
|
print("you need to configure an IMAP account!")
|
|
|
|
print("add a [user] section to PO.ini with:")
|
|
|
|
print(" login = mylogin")
|
|
|
|
print(" password = mypassword")
|
|
|
|
print(" host = my.imap.server.address.com")
|
|
|
|
|
|
|
|
@add_command("fax", "Send a Document Camera Image via Email")
|
|
|
|
def fax(self, data):
|
|
|
|
"""
|
|
|
|
Takes a photograph using the document camera and sends it in an E-mail.
|
|
|
|
"""
|
|
|
|
photo = self.send("PXphoto.")
|
|
|
|
|
|
|
|
@add_command("rd", "Print full email")
|
|
|
|
def read(self, data):
|
|
|
|
"""
|
|
|
|
Prints out the full detailed version of an email.
|
|
|
|
"""
|
|
|
|
pass
|
|
|
|
|
|
|
|
@add_command("d", "Delete email")
|
|
|
|
def delete(self, data):
|
|
|
|
"""
|
|
|
|
Deletes an email and moves it to the trash folder.
|
|
|
|
"""
|
|
|
|
self.imapserv.delete_messages((data))
|
|
|
|
pass
|
|
|
|
|
|
|
|
@add_command("s", "Mark as spam")
|
|
|
|
def mark_spam(self, data):
|
|
|
|
"""
|
|
|
|
Flags an email as spam, mark as read and move it to the configured SPAM
|
|
|
|
folder.
|
|
|
|
"""
|
|
|
|
self.imapserv.copy((data), self.spamfolder)
|
|
|
|
# TODO: mark as read? with self.imapserv.add_flags?
|
|
|
|
self.delete(data)
|
|
|
|
pass
|
|
|
|
|
|
|
|
@add_command("re", "Reply with scan")
|
|
|
|
def reply_scan(self, data):
|
|
|
|
"""
|
|
|
|
Reply to the sender of a mail with the PDF currently queued in the
|
|
|
|
document scanner.
|
|
|
|
"""
|
|
|
|
# look up short code to get IMAP ID
|
|
|
|
# extract the sender and title
|
|
|
|
# put together the reply
|
|
|
|
pass
|
|
|
|
|
|
|
|
@add_api("unread", "Get unread mails")
|
|
|
|
def unread(self):
|
|
|
|
"""
|
|
|
|
Polls the currently configured IMAP server and returns a dict
|
|
|
|
containing unread emails.
|
|
|
|
"""
|
|
|
|
messages = self.imapserv.sort("ARRIVAL", ["UNSEEN"])
|
|
|
|
print("%d unread messages in INBOX" % len(messages))
|
|
|
|
return self.imapserv.fetch(messages, ['FLAGS', 'INTERNALDATE',
|
|
|
|
'ENVELOPE', 'RFC822.SIZE'])
|
|
|
|
|
|
|
|
|
|
|
|
def main():
|
|
|
|
mr = MailRoom()
|
|
|
|
mr.run()
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
main()
|