def rcpt(cargo):
    stream = cargo[0]
    email_data = cargo[1]

    recipients = []
    client_error = False

    while 1:
        client_msg = with_stream_read(stream)

        if smtp_server_debug:
            print 'Debug:', cargo[1]['ip'], time.strftime(
                "%a, %d %b %Y %H:%M:%S +0000",
                time.gmtime()), client_msg.rstrip('\r\n')

        if client_is_idle(email_data['start']):
            client_error = True
            break
        elif rcpt_pattern.search(client_msg):
            recipient = get_email_address(client_msg)
            if recipient is None or not valid_email_address(recipient):
                client_error = True
                break
            else:
                if recipient not in recipients:
                    recipients.append(recipient)
                with_stream_write(stream, '250 Ok' + cr_lf)
        elif data_pattern.search(client_msg):
            break
        else:
            client_error = True
            break

    # get the list of email addresses specified in the 'RCPT TO:' portion of the message
    server_recipients = filter(
        lambda x: x.split('@')[1].lower() == recipient_domain, recipients)
    # find the inbox @smtp_server_domain which is valid (i.e., we have an action function or pass-through specified)
    inbox = domain_recipients_valid(
        map(lambda x: x.split('@')[0].lower(), server_recipients))
    if inbox is None:
        block_ip_address(email_data['ip'])
        client_error = True

    if client_error or len(server_recipients) == 0:
        # this email was not sent to an inbox that we can respond to
        # so stop the client with a bad request reply and close the connection
        with_stream_write(stream, bad_request + cr_lf)
        return ('done', cargo)
    else:
        email_data['inbox'] = inbox
        email_data['recipients'] = recipients
        return ('data', (stream, email_data))
def rcpt (cargo):
    stream = cargo[0]
    email_data = cargo[1]

    recipients = []
    client_error = False

    while 1:
        client_msg = with_stream_read (stream)

        if smtp_server_debug:
            print 'Debug:', cargo[1]['ip'], time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.gmtime()), client_msg.rstrip('\r\n')

        if client_is_idle(email_data['start']):
            client_error = True
            break
        elif rcpt_pattern.search(client_msg):
            recipient = get_email_address(client_msg)
            if recipient is None or not valid_email_address(recipient):
                client_error = True
                break
            else:
                if recipient not in recipients:
                    recipients.append(recipient)
                with_stream_write (stream, '250 Ok'+cr_lf)
        elif data_pattern.search(client_msg):
            break
        else:
            client_error = True
            break

    # get the list of email addresses specified in the 'RCPT TO:' portion of the message
    server_recipients = filter(lambda x: x.split('@')[1].lower() == recipient_domain, recipients)
    # find the inbox @smtp_server_domain which is valid (i.e., we have an action function or pass-through specified)
    inbox = domain_recipients_valid(map(lambda x: x.split('@')[0].lower(), server_recipients))
    if inbox is None:
        block_ip_address(email_data['ip'])
        client_error = True

    if client_error or len(server_recipients) == 0:
        # this email was not sent to an inbox that we can respond to
        # so stop the client with a bad request reply and close the connection 
        with_stream_write (stream, bad_request+cr_lf)
        return ('done', cargo)
    else:
        email_data['inbox'] = inbox
        email_data['recipients'] = recipients
        return ('data', (stream, email_data))
Beispiel #3
0
    def _mail ():
        stream = cargo[0]
        client_msg = with_stream_read (stream)

        log.debug("%s /%s/", cargo[1]['ip'], client_msg.strip())

        if mail_pattern.search(client_msg):
            sender = get_email_address(client_msg)
            if sender is None or not valid_email_address(sender):
                with_stream_write (stream, bad_request+cr_lf)
                return ('done', cargo)
            else:
                with_stream_write (stream, '250 Ok'+cr_lf)
                email_data = cargo[1]
                email_data['sender'] = sender
                return ('rcpt', (stream, email_data))
        else:
            with_stream_write (stream, bad_request+cr_lf)
            return ('done', cargo)
Beispiel #4
0
    def _mail():
        stream = cargo[0]
        client_msg = with_stream_read(stream)

        log.debug("%s /%s/", cargo[1]['ip'], client_msg.strip())

        if mail_pattern.search(client_msg):
            sender = get_email_address(client_msg)
            if sender is None or not valid_email_address(sender):
                with_stream_write(stream, bad_request + cr_lf)
                return ('done', cargo)
            else:
                with_stream_write(stream, '250 Ok' + cr_lf)
                email_data = cargo[1]
                email_data['sender'] = sender
                return ('rcpt', (stream, email_data))
        else:
            with_stream_write(stream, bad_request + cr_lf)
            return ('done', cargo)
    def _mail ():
        stream = cargo[0]
        client_msg = with_stream_read (stream)

        if smtp_server_debug:
            print 'Debug:', cargo[1]['ip'], time.strftime("%a, %d %b %Y %H:%M:%S +0000", time.gmtime()), client_msg.rstrip('\r\n')

        if mail_pattern.search(client_msg):
            sender = get_email_address(client_msg)
            if sender is None or not valid_email_address(sender):
                with_stream_write (stream, bad_request+cr_lf)
                return ('done', cargo)
            else:
                with_stream_write (stream, '250 Ok'+cr_lf)
                email_data = cargo[1]
                email_data['sender'] = sender
                return ('rcpt', (stream, email_data))
        else:
            with_stream_write (stream, bad_request+cr_lf)
            return ('done', cargo)
    def _mail():
        stream = cargo[0]
        client_msg = with_stream_read(stream)

        if smtp_server_debug:
            print 'Debug:', cargo[1]['ip'], time.strftime(
                "%a, %d %b %Y %H:%M:%S +0000",
                time.gmtime()), client_msg.rstrip('\r\n')

        if mail_pattern.search(client_msg):
            sender = get_email_address(client_msg)
            if sender is None or not valid_email_address(sender):
                with_stream_write(stream, bad_request + cr_lf)
                return ('done', cargo)
            else:
                with_stream_write(stream, '250 Ok' + cr_lf)
                email_data = cargo[1]
                email_data['sender'] = sender
                return ('rcpt', (stream, email_data))
        else:
            with_stream_write(stream, bad_request + cr_lf)
            return ('done', cargo)