def deliver (): config = Config.factory() set_source('deliver') set_level(config.get('logging_level')) try: recipient = sys.argv[1] except IndexError as e: error('No recipient specified.') return notice("Delivering mail for '%s'" % recipient) data = [] size = 0 while True: _data = sys.stdin.read(4096) if len(_data) == 0: break size += len(_data) if size > config.get('max_message_size'): error("Maximum message size exceeded.") sys.exit(-1) data.append(_data) data = ''.join(data) archive_dir = config.get('archive_dir') archive_file = False if not archive_dir == '': if not os.path.isdir(archive_dir): error("Archive dir not found") else: archive_file = os.path.join(archive_dir, hashlib.sha1('%f' % time.time()).hexdigest()) with open(archive_file, 'w') as fp: fp.write(data) parser = email.parser.FeedParser() parser.feed(data) message = parser.close() doc = dict([(a.lower(), b) for a, b in message.items()]) payload = [] for part in message.walk(): if part.get_content_type() in ['text/plain', 'text/html']: payload.append({'content-type': part.get_content_type(), 'payload': part.get_payload()}) doc['payload'] = payload doc['mailbox'] = 'inbox' doc['tags'] = [] try: server = couch.Server('http://%s:%d' % (config.get('couchdb_host'), config.get('couchdb_port'))) users_db = server[config.get('couchdb_users')] db = server[users_db[recipient]['couchdb']] db.save(doc) except couchdb.http.ResourceNotFound as e: print e
def handle (self): """Handles the actual request. At most 4096 bytes will be read. """ try: raw_data = self.request.recv(4096) except Exception as e: error("Error reading from socket '%s'" % e) return parts = [x.strip() for x in raw_data.split(' ')] if not parts[0] == 'get': notice("Geen get '%s'" % str(parts)) self.request.send('400 Not implemented.\n') return data = [] i = 0 # Postfix encoding. while i < len(parts[1]): if parts[1][i] == '%': try: code = int('0x%s' % parts[1][i+1:i+3], 0) data.append(chr(code)) i += 3 except ValueError as e: notice("Error parsing input '%s'" % str(parts)) self.request.send("500 Invalid escape sequence\n") return except IndexError as e: notice("Error parsing input '%s'" % str(parts)) self.request.send("500 Invalid escape sequence\n") return else: data.append(parts[1][i]) i += 1 data = ''.join(data) config = Config.factory() if data.find('@') < 0: if data == 'sigma.student.utwente.nl': self.request.send('200 sigma.student.utwente.nl\n') return try: server = couch.Server('http://%s:%s' % (config.get('couchdb_host'), config.get('couchdb_port'))) db = server[config.get('couchdb_users')] view = db.view('users/aliasses', key=data) if not len(view) == 1: self.request.send("500 Alias unknown\n") return else: self.request.send("200 %s\n" % view.rows[0].value) except couchdb.http.ResourceNotFound as e: print e