summaryrefslogtreecommitdiff
path: root/service/app/adapter/mail_service.py
blob: 94612d82d43e09e62cb2ee08653dfe294ca57e0c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
import traceback
import sys
import os
from app.bitmask_libraries.config import LeapConfig
from app.bitmask_libraries.provider import LeapProvider
from app.bitmask_libraries.session import LeapSessionFactory
from app.bitmask_libraries.auth import LeapCredentials
from app.adapter.pixelated_mail import PixelatedMail
from app.tags import Tags

import logging

logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
                    datefmt='%m-%d %H:%M',
                    filename='/tmp/leap.log',
                    filemode='w')

# define a Handler which writes INFO messages or higher to the sys.stderr
console = logging.StreamHandler()
console.setLevel(logging.DEBUG)
# set a format which is simpler for console use
formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
# tell the handler to use this format
console.setFormatter(formatter)
# add the handler to the root logger
logging.getLogger('').addHandler(console)


class MailService:

    SPECIAL_BOXES = ['inbox', 'sent', 'drafts', 'trash']

    def __init__(self):
        try:
            self.username = 'testuser_a003'
            self.password = 'testpassword'
            self.server_name = 'example.wazokazi.is'
            self.mailbox_name = 'INBOX'
            self.leapdir = os.path.join(os.path.abspath("."), "leap")
            self.tags = Tags()
            self._open_leap_session()
        except:
            traceback.print_exc(file=sys.stdout)
            raise

    def _open_leap_session(self):
        self.leap_config = LeapConfig(leap_home=self.leapdir)
        self.provider = LeapProvider(self.server_name, self.leap_config)
        self.leap_session = LeapSessionFactory(self.provider).create(LeapCredentials(self.username, self.password))
        self.account = self.leap_session.account
        self.mailbox = self.account.getMailbox(self.mailbox_name)

    def mails(self, query):
        return self.mailbox.messages or []

    def update_mail(self, dict_mail):
        # Iterating over messages because messages.getUID() is not trustworthy
        mail = None
        for message in self.mailbox.messages:
            if message.getUID() == dict_mail['ident']:
                mail = PixelatedMail(message)

        new_tags = mail.update_tags(dict_mail['tags'])

        self._update_tag_list(new_tags)

        return mail

    def _update_tag_list(self, tags):
        for tag in tags:
            self.tags.add(tag)

    def _switch_mailbox(self, name):
        mailbox = None
        if name in self.SPECIAL_BOXES:
            self._create_mailbox(name)
        try:
            mailbox = self.account.getMailbox(name)
        except Exception, e:
            if not 'MailboxException' == e.__class__.__name__:
                raise e
        return mailbox

    def _create_mailbox(self, name):
        created = False
        try:
            created = self.account.addMailbox(name)
        except Exception, e:
            if not 'MailboxCollision' == e.__class__.__name__:
                raise e
        return created

    def drafts(self):
        return []

    def mail(self, mail_id):
        for message in self.mailbox.messages:
            if message.getUID() == int(mail_id):
                return PixelatedMail(message)

    def thread(self, thread_id):
        raise NotImplementedError()

    def mark_as_read(self, mail_id):
        raise NotImplementedError()

    def tags_for_thread(self, thread):
        raise NotImplementedError()

    def add_tag_to_thread(self, thread_id, tag):
        raise NotImplementedError()

    def remove_tag_from_thread(self, thread_id, tag):
        raise NotImplementedError()

    def delete_mail(self, mail_id):
        raise NotImplementedError()

    def save_draft(self, draft):
        raise NotImplementedError()

    def send_draft(self, draft):
        raise NotImplementedError()

    def draft_reply_for(self, mail_id):
        raise NotImplementedError()

    def all_tags(self):
        return self.tags

    def all_contacts(self, query):
        raise NotImplementedError()

if __name__ == '__main__':
    print('Running Standalone')
    client = Client()