예제 #1
0
def test_relay_smtp(client_mock):
    relay = server.Relay("localhost", port=0)
    relay.deliver(test_mail_response_plain_text())
    assert_equal(client_mock.return_value.sendmail.call_count, 1)
    assert_equal(client_mock.return_value.starttls.call_count, 0)

    client_mock.reset_mock()
    relay = server.Relay("localhost", port=0, starttls=True)
    relay.deliver(test_mail_response_plain_text())
    assert_equal(client_mock.return_value.sendmail.call_count, 1)
    assert_equal(client_mock.return_value.starttls.call_count, 1)
예제 #2
0
    def test_relay_smtp(self, client_mock):
        relay = server.Relay("localhost", port=0)
        relay.deliver(generate_mail(factory=mail.MailResponse, attachment=True))
        self.assertEqual(client_mock.return_value.sendmail.call_count, 1)
        self.assertEqual(client_mock.return_value.starttls.call_count, 0)

        client_mock.reset_mock()
        relay = server.Relay("localhost", port=0, starttls=True)
        relay.deliver(generate_mail(factory=mail.MailResponse, attachment=True))
        self.assertEqual(client_mock.return_value.sendmail.call_count, 1)
        self.assertEqual(client_mock.return_value.starttls.call_count, 1)
예제 #3
0
def test_Relay_asserts_ssl_options():
    """Relay raises an AssertionError if the ssl option is used in combination with starttls or lmtp"""
    with assert_raises(AssertionError):
        server.Relay("localhost", ssl=True, starttls=True)

    with assert_raises(AssertionError):
        server.Relay("localhost", ssl=True, lmtp=True)

    with assert_raises(AssertionError):
        server.Relay("localhost", ssl=True, starttls=True, lmtp=True)

    # no error
    server.Relay("localhost", starttls=True, lmtp=True)
예제 #4
0
    def command(port,
                host,
                username=None,
                password=None,
                ssl=None,
                starttls=None,
                lmtp=None,
                sender=None,
                to=None,
                subject=None,
                body=None,
                attach=None):
        message = mail.MailResponse(From=sender,
                                    To=to,
                                    Subject=subject,
                                    Body=body)
        if attach:
            message.attach(attach)

        relay = server.Relay(host,
                             port=port,
                             username=username,
                             password=password,
                             ssl=ssl,
                             starttls=starttls,
                             lmtp=lmtp,
                             debug=False)
        relay.deliver(message)
예제 #5
0
def send(port,
         host,
         username=None,
         password=None,
         ssl=None,
         starttls=None,
         lmtp=None,
         sender=None,
         to=None,
         subject=None,
         body=None,
         attach=None):
    """
    Sends an email to someone as a test message.
    See the sendmail command for a sendmail replacement.
    """
    message = mail.MailResponse(From=sender, To=to, Subject=subject, Body=body)
    if attach:
        message.attach(attach)

    relay = server.Relay(host,
                         port=port,
                         username=username,
                         password=password,
                         ssl=ssl,
                         starttls=starttls,
                         lmtp=lmtp,
                         debug=False)
    relay.deliver(message)
예제 #6
0
def blast(inbox, host, port, lmtp, debug):
    """
    Given a Maildir, this command will go through each email
    and blast it at your server.  It does nothing to the message, so
    it will be real messages hitting your server, not cleansed ones.
    """
    try:
        inbox = mailbox.mbox(inbox, create=False)
    except (mailbox.Error, IOError):
        try:
            inbox = mailbox.Maildir(inbox, factory=None, create=False)
        except (mailbox.Error, IOError):
            raise click.ClickException(
                "{} does not exist or is not a valid MBox or Maildir".format(
                    inbox))

    relay = server.Relay(host, port=port, lmtp=lmtp, debug=debug)

    for key in inbox.keys():
        msgfile = inbox.get_file(key)
        msg = encoding.from_file(msgfile)
        try:
            relay.deliver(msg)
        except socket.error as exp:
            raise click.ClickException(str(exp))
        finally:
            msgfile.close()
예제 #7
0
def test_relay_deliver():
    relay = server.Relay("localhost", port=8899)

    relay.deliver(test_mail_response_plain_text())
    relay.deliver(test_mail_response_html())
    relay.deliver(test_mail_response_html_and_plain_text())
    relay.deliver(test_mail_response_attachments())
예제 #8
0
def test_relay_deliver_mx_hosts(DNS_mxlookup):
    DNS_mxlookup.return_value = [[100, "localhost"]]
    relay = server.Relay(None, port=8899)

    msg = test_mail_response_plain_text()
    msg['to'] = 'zedshaw@localhost'
    relay.deliver(msg)
    assert DNS_mxlookup.called
예제 #9
0
    def test_relay_deliver_mx_hosts(self, client_mock, query):
        query.return_value = [Mock()]
        query.return_value[0].exchange = "localhost"
        relay = server.Relay(None, port=0)

        msg = generate_mail(factory=mail.MailResponse, attachment=True)
        msg['to'] = 'user@localhost'
        relay.deliver(msg)
        self.assertEqual(query.call_count, 1)
예제 #10
0
def test_relay_deliver_mx_hosts(client_mock, query):
    query.return_value = [Mock()]
    query.return_value[0].exchange = "localhost"
    relay = server.Relay(None, port=0)

    msg = test_mail_response_plain_text()
    msg['to'] = 'user@localhost'
    relay.deliver(msg)
    assert_equal(query.call_count, 1)
예제 #11
0
def test_relay_deliver_mx_hosts(query):
    query.return_value = [Mock()]
    query.return_value[0].exchange = "localhost"
    relay = server.Relay(None, port=8899)

    msg = test_mail_response_plain_text()
    msg['to'] = 'user@localhost'
    relay.deliver(msg)
    assert query.called
예제 #12
0
def sendmail(port, host, recipients, debug=False, lmtp=False):
    """
    Used as a testing sendmail replacement for use in programs
    like mutt as an MTA.  It reads the email to send on the stdin
    and then delivers it based on the port and host settings.
    """
    relay = server.Relay(host, port=port, debug=debug, lmtp=lmtp)
    data = sys.stdin.read()
    msg = mail.MailRequest(None, recipients, None, data)
    relay.deliver(msg)
예제 #13
0
def test_relay_resolve_relay_host(DNS_mxlookup):
    DNS_mxlookup.return_value = []
    relay = server.Relay(None, port=8899)
    host = relay.resolve_relay_host('zedshaw@localhost')
    assert_equal(host, 'localhost')
    assert DNS_mxlookup.called

    DNS_mxlookup.reset_mock()
    DNS_mxlookup.return_value = [[100, "mail.zedshaw.com"]]
    host = relay.resolve_relay_host('*****@*****.**')
    assert_equal(host, 'mail.zedshaw.com')
    assert DNS_mxlookup.called
예제 #14
0
def sendmail_command(port=8825, host='127.0.0.1', debug=0, TRAILING=None):
    """
    Used as a testing sendmail replacement for use in programs
    like mutt as an MTA.  It reads the email to send on the stdin
    and then delivers it based on the port and host settings.

    salmon sendmail -port 8825 -host 127.0.0.1 -debug 0 -- [recipients]
    """
    relay = server.Relay(host, port=port, debug=debug)
    data = sys.stdin.read()
    msg = mail.MailRequest(None, TRAILING, None, data)
    relay.deliver(msg)
예제 #15
0
    def command(input, host, port, lmtp=None, debug=False):
        try:
            inbox = mailbox.mbox(input)
        except IOError:
            inbox = mailbox.Maildir(input, factory=None)

        relay = server.Relay(host, port=port, lmtp=lmtp, debug=debug)

        for key in inbox.keys():
            msgfile = inbox.get_file(key)
            msg = email.message_from_file(msgfile)
            relay.deliver(msg)
예제 #16
0
def blast_command(input=None, host='127.0.0.1', port=8823, debug=0):
    """
    Given a maildir, this command will go through each email
    and blast it at your server.  It does nothing to the message, so
    it will be real messages hitting your server, not cleansed ones.
    """
    inbox = mailbox.Maildir(input)
    relay = server.Relay(host, port=port, debug=debug)

    for key in inbox.keys():
        msgfile = inbox.get_file(key)
        msg = email.message_from_file(msgfile)
        relay.deliver(msg)
예제 #17
0
def test_relay_deliver(client_mock):
    # test that relay will actually call smtplib.SMTP
    relay = server.Relay("localhost", port=0)

    relay.deliver(test_mail_response_plain_text())
    assert_equal(client_mock.return_value.sendmail.call_count, 1)

    relay.deliver(test_mail_response_html())
    assert_equal(client_mock.return_value.sendmail.call_count, 2)

    relay.deliver(test_mail_response_html_and_plain_text())
    assert_equal(client_mock.return_value.sendmail.call_count, 3)

    relay.deliver(test_mail_response_attachments())
    assert_equal(client_mock.return_value.sendmail.call_count, 4)
예제 #18
0
def test_relay_resolve_relay_host(query):
    from dns import resolver
    query.side_effect = resolver.NoAnswer
    relay = server.Relay(None, port=0)
    host = relay.resolve_relay_host('user@localhost')
    assert_equal(host, 'localhost')
    assert_equal(query.call_count, 1)

    query.reset_mock()
    query.side_effect = None  # reset_mock doens't clear return_value or side_effect
    query.return_value = [Mock()]
    query.return_value[0].exchange = "mx.example.com"
    host = relay.resolve_relay_host('*****@*****.**')
    assert_equal(host, 'mx.example.com')
    assert_equal(query.call_count, 1)
예제 #19
0
def blast(input, host, port, lmtp=None, debug=False):
    """
    Given a Maildir, this command will go through each email
    and blast it at your server.  It does nothing to the message, so
    it will be real messages hitting your server, not cleansed ones.
    """
    try:
        inbox = mailbox.mbox(input)
    except IOError:
        inbox = mailbox.Maildir(input, factory=None)

    relay = server.Relay(host, port=port, lmtp=lmtp, debug=debug)

    for key in inbox.keys():
        msgfile = inbox.get_file(key)
        msg = email.message_from_file(msgfile)
        relay.deliver(msg)
예제 #20
0
    def test_relay_deliver(self, client_mock):
        # test that relay will actually call smtplib.SMTP
        relay = server.Relay("localhost", port=0)

        msg = generate_mail(factory=mail.MailResponse, attachment=True)
        relay.deliver(msg)
        self.assertEqual(client_mock.return_value.sendmail.call_count, 1)

        msg = generate_mail(factory=mail.MailResponse, attachment=True)
        relay.deliver(msg)
        self.assertEqual(client_mock.return_value.sendmail.call_count, 2)

        msg = generate_mail(factory=mail.MailResponse, attachment=True)
        relay.deliver(msg)
        self.assertEqual(client_mock.return_value.sendmail.call_count, 3)

        msg = generate_mail(factory=mail.MailResponse, attachment=True)
        relay.deliver(msg)
        self.assertEqual(client_mock.return_value.sendmail.call_count, 4)
예제 #21
0
def send_command(port=8825,
                 host='127.0.0.1',
                 username=False,
                 password=False,
                 ssl=False,
                 starttls=False,
                 debug=1,
                 sender=None,
                 to=None,
                 subject=None,
                 body=None,
                 attach=False):
    """
    Sends an email to someone as a test message.
    See the sendmail command for a sendmail replacement.
    
    salmon send -port 8825 -host 127.0.0.1 -debug 1 \\
            -sender EMAIL -to EMAIL -subject STR -body STR -attach False'

    There is also a username, password, and starttls option for those 
    who need it.
    """
    message = mail.MailResponse(From=sender, To=to, Subject=subject, Body=body)
    if attach:
        message.attach(attach)

    if username == False:
        username = None
    if password == False:
        password = None

    relay = server.Relay(host,
                         port=port,
                         username=username,
                         password=password,
                         ssl=ssl,
                         starttls=starttls,
                         debug=debug)
    relay.deliver(message)
예제 #22
0
    def test_relay_reply(self, client_mock):
        relay = server.Relay("localhost", port=0)
        print("Relay: %r" % relay)

        relay.reply(generate_mail(), 'from@localhost', 'Test subject', 'Body')
        self.assertEqual(client_mock.return_value.sendmail.call_count, 1)
예제 #23
0
def test_relay_reply():
    relay = server.Relay("localhost", port=8899)
    print "Relay: %r" % relay

    relay.reply(test_mail_request(), 'from@localhost', 'Test subject', 'Body')
예제 #24
0
 def command(port, host, recipients, debug=False, lmtp=False):
     relay = server.Relay(host, port=port, debug=debug, lmtp=lmtp)
     data = sys.stdin.read()
     msg = mail.MailRequest(None, recipients, None, data)
     relay.deliver(msg)
예제 #25
0
def test_relay_raises_exception(create_mock):
    # previously, salmon would eat up socket errors and just log something. Not cool!
    create_mock.side_effect = socket.error
    relay = server.Relay("example.com", port=0)
    with assert_raises(socket.error):
        relay.deliver(test_mail_response_plain_text())
예제 #26
0
def test_relay_reply(client_mock):
    relay = server.Relay("localhost", port=0)
    print("Relay: %r" % relay)

    relay.reply(test_mail_request(), 'from@localhost', 'Test subject', 'Body')
    assert_equal(client_mock.return_value.sendmail.call_count, 1)
예제 #27
0
 def test_relay_raises_exception(self, create_mock):
     # previously, salmon would eat up socket errors and just log something. Not cool!
     create_mock.side_effect = socket.error
     relay = server.Relay("example.com", port=0)
     with self.assertRaises(socket.error):
         relay.deliver(generate_mail(factory=mail.MailResponse))
예제 #28
0
def relay(hostname="127.0.0.1", port=8824):
    """Wires up a default relay on port 8824 (the default salmon log port)."""
    return server.Relay(hostname, port, debug=0)
예제 #29
0
def test_relay_smtp_ssl(client_mock):
    relay = server.Relay("localhost", port=8899, ssl=True)
    relay.deliver(test_mail_response_plain_text())
    assert_equal(client_mock.return_value.sendmail.call_count, 1)