示例#1
0
文件: deliver.py 项目: FarmerF/mymail
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
示例#2
0
文件: mapper.py 项目: FarmerF/mymail
    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