def lineReceived(self, line): code = int(line[0:3]) console.log('%s(S): %s' % (self.peer, line)) if(line[3] == '-'): self._continuation.append(line) return True if ( code in self._expected): result = self._goodResponse(code, line[4:]) if isinstance(result, tuple): msg = result[1] result = result[0] self._continuation = [] else: result, msg = self._badResponse(code, line[4:]) if result: return True else: console.log( 'something buggered up, dropping connection') self.factory.messageFailed(msg) self.closeConnection()
def sendCode(self, code, message, cont=False): if cont: resp = '%s%s\n' % (code, message) else: resp = '%s %s\n' % (code, message) self.transport.write(resp) console.log('Me(S): %s' % (resp[:-1]))
def connectionMade(self): self._continuation = [] self._stopLog = False self._expected = [220] self._goodResponse = self.do_helo self._badResponse = self.no_connection self.peer = self.transport.getPeer().host console.log('has connection to %s' % self.peer)
def instance(): s = database if s.conn is None or s.db is None: console.log('I just recconected to the DB') s.conn = Connection() s.db = s.conn.pymail return s.db
def connectionMade(self): self.fulldata = [] self._body = [] self.user = None self.mode = 'COMMAND' self.peer = self.transport.getPeer().host console.log('Connection Received from: %s on Port %s' % (self.peer, self.transport.getPeer().port)) self.sendCode(220, 'mail.dev.com ESMTP pyMail')
def restore(self): for m in self.db.find().sort([['added', pymongo.ASCENDING], ['attempt.time', pymongo.ASCENDING]]): m['message'] = cPickle.loads( str(m['message']) ) m['reAttempt'] = 0 self.queue.append(m) console.log( 'Restored Queue from db state') console.log( '%s Total Queued Items ' % len(self.queue)) self.startLoop()
def RCPT_or_DATA(self, code, resp): if self._lastAddress is not None: if ( code != 250 ): self._rejectedRCPT.append(self._lastAddress) console.log('%s: RCPT TO Address Rejected - %s' % (self.peer, self._lastAddress)) else: self._acceptedRCPT.append(self._lastAddress) try: self._lastAddress = self.addresses.next() except StopIteration: if ( len(self._acceptedRCPT) == 0 ): return False, 'All given RCPTs were rejected' #start data command we're out of addresses self.start_data(code, resp) else: self.sendLine('RCPT TO: %s' % self._lastAddress.fullAddress) return True
def send(self): d = defer.Deferred() factory = ESMTPSender(d) factory.mailFrom = self._from factory.rcpt = self._to factory.data = self.data host = None records = dns.resolver.query(self._to[0].domain, 'MX') current = 100 for rec in records: if host is None or rec.preference < current: current = rec.preference host = str(rec.exchange) console.log('Initiating client connetion to: %s' % host) reactor.connectTCP(host, 25, factory, 3) return d
def add(self, msg=None): if msg is None: raise('Add blank email to queue!?') elif not isinstance(msg, messageTransport): try: msg = messageTransport(msg) except: raise('Dunno what you want me to add to the queue here?') self.queue.append({ 'message': msg, 'added': time.time(), 'attmepts':[], 'reAttempt': 0 }) self.saveState() console.log( 'New Item in Queue: From %s To %s' % (msg._from, msg._to) ) self.startLoop()
def __init__(self, addr, domain=None, preLoad=None): conf = config.instance self.authd = False if preLoad is not None: self.data = preLoad else: pass #pull data from db if isinstance(addr, Address) == False: addr = Address(addr) elif isinstance(addr, int): pass #it's an id, grab from db based on if domain is None: domain = conf.ResolveDomain(addr.domain) if domain.hasUser(addr): console.log('Retrived User: %s@%s' % (addr.user, addr.domain))
def deliverQueue(self): i = 0 for q in self.queue: console.log( 'Processing: Queue Item %s from %s to %s' % (i, q['message']._from, q['message']._to) ) if ( q['reAttempt'] < time.time() and q['reAttempt'] != 0 ): continue try: res = self.delivery.attempt(q['message'], i) res.addCallback(self.messageSuccess) res.addErrback(self.messageFailure) except: import sys, traceback inf = sys.exc_info() console.log('Exception in delivery thread: \n%s' % inf[0]) console.log('Trace: \n' + '\n'.join(traceback.format_tb(inf[2]))) i = i + 1 self.saveState()
from twisted.internet import reactor import sys from pyMail.database import database from pyMail.logging import console from pyMail.config import config db = database.instance() config = config(db) if ( config.services['smtp']['on'] ): from pyMail.smtp import queue, delivery, protocol console.log('Starting SMTP on port %s' % (config.services['smtp']['port'])) deliv = delivery.deliveryAgent(db.messages) queue = queue.queue(db.queue, deliv) queue.restore() reactor.listenTCP(config.services['smtp']['port'], protocol.serverFactory(config.services['smtp'], queue)) if ( config.services['smtps']['on'] ): reactor.listenSSL(config.services['smtps']['port'], protocol.serverFactory(config.services['smtps'], queue)) if ( config.services['imap']['on'] ): from pyMail.imap import protocol console.log('Starting IMAP on port %s' % config.services['imap']['port']) reactor.listenTCP(config.services['imap']['port'], protocol.serverFactory(config.services['imap'])) reactor.run()
def messageFailure(self, args): id, message, queueId = args console.log('ZOMG FAAAAIL: from %s to %s' % (message._from, message._to))
def messageSuccess(self, args): id, message, queueId = args self.queue.pop(queueId) console.log('WIIIIIIN : from %s to %s \nMessage ID: %s' % (message._from.fullAddress, message._to.fullAddress, id)) self.saveState()
def ebTransfer(err): console.log( 'Oh Dear')
def no_connection(self, resp): console.log( 'Server issud a bad connection response')
def lineReceived(self, line): self.fulldata.append(line) console.log( self.peer+ ' (C): ' + line) func = getattr(self, 'state_%s' % (self.mode), None) func(line)
def closeConnection(self): console.log('Closing Connection') self.transport.loseConnection()
def connectionFailed(self): console.log('Couldn\'t Connect to Server')
def sendLine(self, msg): if not self._stopLog: console.log('Me(C): %s' % msg) self.transport.write(msg + '\r\n')