Example #1
0
	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()
Example #2
0
	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]))
Example #3
0
	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)
Example #4
0
 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
Example #5
0
	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')
Example #6
0
	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()
Example #7
0
	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
Example #8
0
	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
Example #9
0
	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()
Example #10
0
	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))
Example #11
0
	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()
Example #12
0
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()

Example #13
0
	def messageFailure(self, args):
		id, message, queueId = args
		console.log('ZOMG FAAAAIL: from %s to %s' % (message._from, message._to))
Example #14
0
	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()
Example #15
0
		def ebTransfer(err):
			console.log( 'Oh Dear')
Example #16
0
	def no_connection(self, resp):
		console.log( 'Server issud a bad connection response')
Example #17
0
	def lineReceived(self, line):
		self.fulldata.append(line)  
		console.log( self.peer+ ' (C): ' + line)
		func = getattr(self, 'state_%s' % (self.mode), None)
		func(line)
Example #18
0
	def closeConnection(self):
		console.log('Closing Connection')
		self.transport.loseConnection()		
Example #19
0
	def connectionFailed(self):
		console.log('Couldn\'t Connect to Server')
Example #20
0
	def sendLine(self, msg):
		if not self._stopLog:
			console.log('Me(C): %s' % msg)
		self.transport.write(msg + '\r\n')