-
Notifications
You must be signed in to change notification settings - Fork 62
/
imap.py
52 lines (35 loc) · 1.68 KB
/
imap.py
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
# encoding: utf-8
import imaplib
from datetime import datetime
from marrow.mailer.exc import MailConfigurationException, TransportException, MessageFailedException
__all__ = ['IMAPTransport']
log = __import__('logging').getLogger(__name__)
class IMAPTransport(object): # pragma: no cover
__slots__ = ('ephemeral', 'host', 'ssl', 'port', 'username', 'password', 'folder', 'connection')
def __init__(self, config):
if not 'host' in config:
raise MailConfigurationException('No server configured for IMAP.')
self.host = config.get('host', None)
self.ssl = config.get('ssl', False)
self.port = config.get('port', 993 if self.ssl else 143)
self.username = config.get('username', None)
self.password = config.get('password', None)
self.folder = config.get('folder', "INBOX")
def startup(self):
Protocol = imaplib.IMAP4_SSL if self.ssl else imaplib.IMAP4
self.connection = Protocol(self.host, self.port)
if self.username:
result = self.connection.login(self.username, self.password)
if result[0] != b'OK':
raise TransportException("Unable to authenticate with IMAP server.")
def deliver(self, message):
result = self.connection.append(
self.folder,
'', # TODO: Set message urgency / flagged state.
message.date.timetuple() if message.date else datetime.now(),
bytes(message)
)
if result[0] != b'OK':
raise MessageFailedException("\n".join(result[1]))
def shutdown(self):
self.connection.logout()