forked from spladug/harold
-
Notifications
You must be signed in to change notification settings - Fork 0
/
smtp.py
69 lines (54 loc) · 1.65 KB
/
smtp.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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import cStringIO
from twisted.internet import reactor, ssl
from twisted.internet.defer import Deferred
from twisted.mail import smtp
from plugin import Plugin
from conf import PluginConfig, Option
class SmtpConfig(PluginConfig):
host = Option(str)
port = Option(int)
use_ssl = Option(bool, default=True)
username = Option(str)
password = Option(str)
class SmtpSender(object):
def __init__(self, config):
self.config = config
self.context = ssl.ClientContextFactory()
def _on_error(self, result):
print "failed to send email: %r" % result
def __call__(self, sender, recipients, msg):
print "Hello!"
deferred = Deferred()
msg['From'] = sender
msg['To'] = ', '.join(recipients)
factory = smtp.ESMTPSenderFactory(
self.config.username,
self.config.password,
sender,
recipients,
cStringIO.StringIO(msg.as_string()),
deferred,
contextFactory=self.context,
requireTransportSecurity=False,
retries=0,
)
deferred.addErrback(self._on_error)
if self.config.use_ssl:
reactor.connectSSL(
self.config.host,
self.config.port,
factory,
self.context
)
else:
reactor.connectTCP(
self.config.host,
self.config.port,
factory
)
def make_plugin(config):
smtp_config = SmtpConfig(config)
p = Plugin()
p.username = smtp_config.username
p.sendmail = SmtpSender(smtp_config)
return p