1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 __doc__='''zenmail
17
18 Turn email messages into events.
19
20 '''
21
22 from EventServer import EventServer
23
24 from twisted.mail import smtp
25 from twisted.internet import reactor, protocol, defer
26 from zope.interface import implements
27
28 from email.Header import Header
29 import email
30
31 from MailProcessor import MailProcessor
32
33 import logging
34 log = logging.getLogger("zen.mail")
35
36
37 -class ZenossEventPoster(object):
38 implements(smtp.IMessage)
39
40 - def __init__(self, processor):
41 self.lines = []
42 self.processor = processor
43
44
45 - def lineReceived(self, line):
46 self.lines.append(line)
47
48
49 - def postEvent(self, messageStr):
50 email.message_from_string(messageStr)
51 self.processor.process(messageStr)
52
53
54 - def eomReceived(self):
55 log.info('message data completed.')
56 self.lines.append('')
57 messageData = '\n'.join(self.lines)
58
59 self.postEvent(messageData)
60
61 if True:
62 return defer.succeed(None)
63 else:
64 return defer.failure(None)
65
66
67 - def connectionLost(self):
68 log.info('connection lost unexpectedly')
69 del(self.lines)
70
71
73 implements(smtp.IMessageDelivery)
74
76 self.processor = processor
77
78
80 myHostname, self.clientIP = helo
81 date = smtp.rfc822date()
82
83 headerValue = 'by %s from %s with ESMTP ; %s' % (
84 myHostname, self.clientIP, date)
85
86 log.info('relayed (or sent directly) from: %s' % self.clientIP)
87
88 header = 'Received: %s' % Header(headerValue)
89 return header
90
91
95
96
97 - def makePoster(self):
98 return ZenossEventPoster(self.processor)
99
100
102 log.info("from: %s" % originAddress)
103 return originAddress
104
105
108 self.processor = processor
109
111 delivery = ZenossDelivery(self.processor)
112 smtpProtocol = smtp.SMTP(delivery)
113 smtpProtocol.factory = self
114 return smtpProtocol
115
116
118 name = 'zenmail'
119
121 EventServer.__init__(self)
122 if (self.options.useFileDescriptor < 0 and \
123 self.options.listenPort < 1024):
124 self.openPrivilegedPort('--listen',
125 '--proto=tcp',
126 '--port=%d' % self.options.listenPort)
127
128 self.changeUser()
129 self.processor = MailProcessor(self, self.options.eventseverity)
130
131 self.factory = SMTPFactory(self.processor)
132
133 if self.options.useFileDescriptor != -1:
134 self.useTcpFileDescriptor(int(self.options.useFileDescriptor),
135 self.factory)
136 else:
137 log.info("listening on port: %d" % self.options.listenPort)
138 reactor.listenTCP(self.options.listenPort, self.factory)
139
140
146
147
150
151
153 EventServer.buildOptions(self)
154 self.parser.add_option('--useFileDescriptor',
155 dest='useFileDescriptor',
156 default=-1,
157 type="int",
158 help="File descriptor to use for listening")
159 self.parser.add_option('--listenPort',
160 dest='listenPort',
161 default="25",
162 type="int",
163 help="Alternative listen port to use")
164 self.parser.add_option('--eventseverity',
165 dest='eventseverity',
166 default="2",
167 type="int",
168 help="Severity for events created")
169
170
171 if __name__ == '__main__':
172 ZenMail().run()
173