Skip to content

srault95/fake-mail-client

Repository files navigation

Fake SMTP Client

Travis Build Status Coverage License Python Wheel Number of PyPI downloads Latest Version Requirements Status

Features

Requires

  • Python 3.4+

Backends for parallel sent

Usage

$ pip install https://github.com/srault95/fake-mail-client/archive/master.zip

# or with gevent
$ pip install https://github.com/srault95/fake-mail-client/archive/master.zip[gevent]

$ fake-mailer sendmail --help

With Docker

$ docker run -it --rm srault95/fake-mail-client --help

$ docker run -it --rm --entrypoint smtp-source srault95/fake-mail-client -h

Use API

# With default values
>>> from fake_mail_client.mailer import SMTPClient
>>> from fake_mail_client.message import MessageFaker
>>> client = SMTPClient()
>>> msg = MessageFaker().create_message()
>>> result = client.send(msg)
>>> print(result)

# With custom values
>>> from fake_mail_client.mailer import SMTPClient
>>> from fake_mail_client.message import MessageFaker
>>> client = SMTPClient(host="1.1.1.1", port=2500, source_address="192.168.1.1")
>>> domains = ["example.org"]
>>> mynetworks = ["1.1.1.1"]
>>> msg = MessageFaker(is_out=True, domains=domains, mynetworks=mynetworks).create_message()
>>> result = client.send(msg)
>>> print(result)

Example - YAML story

  • see sample file: fake-mail-tests.yml.sample
$ mv fake-mail-tests.yml.sample fake-mail-tests.yml

$ fake-mailer sendmail -C fake-mail-tests.yml

Example - One mail - json format

$ fake-mailer sendmail -H localhost -P 2500 -O json
{
    "datas": [
        {
            "rcpt": [
                {
                    "msg": "2.1.5 Recipient <[email protected]> Ok",
                    "code": 250,
                    "error": null,
                    "name": "rcpt",
                    "duration": 0.012861967086791992,
                    "value": "[email protected]"
                }
            ],
            "ehlo": {
                "msg": "Hello mx.hanson.com\nPIPELINING\nSMTPUTF8\n8BITMIME\nSTARTTLS\nENHANCEDSTATUSCODES",
                "code": 250,
                "error": null,
                "name": "ehlo",
                "duration": 0.011757135391235352,
                "value": "mx.hanson.com"
            },
            "success": true,
            "error": null,
            "id": "ebf099d2cb890e51f5cdcf3d07d38884ce4e19764a5dadc8777a0e9daa5be4fc",
            "duration": 0.10965204238891602,
            "quit": {
                "msg": "2.0.0 Bye",
                "code": 221,
                "error": null,
                "name": "quit",
                "duration": 0.014549016952514648,
                "value": null
            },
            "mail": {
                "msg": "2.1.0 Sender <[email protected]> Ok",
                "code": 250,
                "error": null,
                "name": "mail",
                "duration": 0.013148069381713867,
                "value": "[email protected]"
            },
            "data": {
                "msg": "2.6.0 Message accepted for delivery",
                "code": 250,
                "error": null,
                "name": "data",
                "duration": 0.030694007873535156,
                "value": "Content-Type: text/plain; charset=\"utf-8\"\nMIME-Version: 1.0\nContent-Transfer-Encoding: base64\nX-Mailer: MessageFaker\nX-FAKE-MAIL-ID: ebf099d2cb890e51f5cdcf3d07d38884ce4e19764a5dadc8777a0e9daa5be4fc\nMessage-ID: <147516098923.10936.10419544728895125460@DESKTOP-0ATQ5E6>\nFrom: <>\nTo: \"Rose Taylor\" <[email protected]>\nDate: Thu, 29 Sep 2016 14:56:29 UTC\nSubject: [UNCHECKED] Nemo nulla natus dicta dignissimos. Ducimus harum mollitia architecto eligendi labore aperiam sequi. Minima in consectetur hic consequuntur fuga voluptatibus. Explicabo ad dolore debitis earum amet dignissimos ad.\n\nU2FwaWVudGUgc2ltaWxpcXVlIHNpdCBhcmNoaXRlY3RvIHBlcmZlcmVuZGlzLiBDb25zZXF1dW50\ndXIgYmVhdGFlIG1pbmltYSBkdWNpbXVzIGFzc3VtZW5kYSBuZXF1ZSBhZGlwaXNjaS4gUmVpY2ll\nbmRpcyBwb3JybyBjb21tb2RpIHJhdGlvbmUgaWxsbyBpc3RlIGRvbG9yZSBvZGl0Lg==\n"
            },
            "connect": {
                "msg": "ESMTP server",
                "code": 220,
                "error": null,
                "name": "connect",
                "duration": 0.026641845703125,
                "value": {
                    "port": 2500,
                    "host": "localhost"
                }
            }
        }
    ],
    "metas": {
        "date": "2016-09-29T14:56:29.502504+00:00"
    }
}

Example - parallel with Gevent - pprint format

$ fake-mailer sendmail -H localhost -P 2500 -B gevent --count 2 --concurrency 2 -O pprint
 {
   'metas': {
    'date': '2016-09-29T14:52:13.412302+00:00'
   }
   'datas': [{'connect': {'code': 220,
                         'duration': 0.026053905487060547,
                         'error': None,
                         'msg': 'ESMTP server',
                         'name': 'connect',
                         'value': {'host': 'localhost', 'port': 2500}},
             'data': {'code': 250,
                      'duration': 0.03162503242492676,
                      'error': None,
                      'msg': '2.6.0 Message accepted for delivery',
                      'name': 'data',
                      'value': 'Content-Type: text/plain; charset="utf-8"\n'
                               'MIME-Version: 1.0\n'
                               'Content-Transfer-Encoding: base64\n'
                               'X-Mailer: MessageFaker\n'
                               'X-FAKE-MAIL-ID: 12250e218814b17e3f660badf547803b5514357a0699ad57d92387cb8ff3d499\n'
                               'Message-ID: <147516073311.6076.16938656496648635806@DESKTOP-0ATQ5E6>\n'
                               'From: "David Mason" <[email protected]>\n'
                               'To: "Amy Parker" <[email protected]>\n'
                               'Date: Thu, 29 Sep 2016 14:52:13 UTC\n'
                               'Subject: [UNCHECKED] Sint animi eligendi tenetur. Commodi rerum aliquid voluptate '
                               'quod corrupti tempore eaque. Iusto accusantium necessitatibus fugiat quasi '
                               'consequuntur culpa. Maxime animi consequatur eos.\n'
                               '\n'
                               'UXVhZSBoYXJ1bSBudWxsYSBxdWFzaSBkaWN0YS4gQ29ycG9yaXMgc2ludCBhc3BlcmlvcmVzIGlw\n'
                               'c2EgcXVpc3F1YW0gYXV0IHRlbXBvcmEgcXVvcy4gRHVjaW11cyBkb2xvcmVtIGNvbnNlY3RldHVy\n'
                               'IHRlbmV0dXIgZWxpZ2VuZGkuIFF1aWJ1c2RhbSBmYWNlcmUgZWxpZ2VuZGkgc2l0Lg==\n'},
             'duration': 0.11256074905395508,
             'ehlo': {'code': 250,
                      'duration': 0.013978958129882812,
                      'error': None,
                      'msg': 'Hello mx.fox-gonzales.com\n'
                             'PIPELINING\n'
                             'SMTPUTF8\n'
                             '8BITMIME\n'
                             'STARTTLS\n'
                             'ENHANCEDSTATUSCODES',
                      'name': 'ehlo',
                      'value': 'mx.fox-gonzales.com'},
             'error': None,
             'id': '12250e218814b17e3f660badf547803b5514357a0699ad57d92387cb8ff3d499',
             'mail': {'code': 250,
                      'duration': 0.01382303237915039,
                      'error': None,
                      'msg': '2.1.0 Sender <[email protected]> Ok',
                      'name': 'mail',
                      'value': '[email protected]'},
             'quit': {'code': 221,
                      'duration': 0.014036893844604492,
                      'error': None,
                      'msg': '2.0.0 Bye',
                      'name': 'quit',
                      'value': None},
             'rcpt': [{'code': 250,
                       'duration': 0.013042926788330078,
                       'error': None,
                       'msg': '2.1.5 Recipient <[email protected]> Ok',
                       'name': 'rcpt',
                       'value': '[email protected]'}],
             'success': True},
            {'connect': {'code': 220,
                         'duration': 0.02614879608154297,
                         'error': None,
                         'msg': 'ESMTP server',
                         'name': 'connect',
                         'value': {'host': 'localhost', 'port': 2500}},
             'data': {'code': 250,
                      'duration': 0.034635066986083984,
                      'error': None,
                      'msg': '2.6.0 Message accepted for delivery',
                      'name': 'data',
                      'value': 'Content-Type: text/plain; charset="utf-8"\n'
                               'MIME-Version: 1.0\n'
                               'Content-Transfer-Encoding: base64\n'
                               'X-Mailer: MessageFaker\n'
                               'X-FAKE-MAIL-ID: 65618590a752207cf4371132835f51992dc056ad25c80f74aa5e5765c301f16c\n'
                               'Message-ID: <147516073314.6076.460766315749624068@DESKTOP-0ATQ5E6>\n'
                               'From: <>\n'
                               'To: "Jason Hawkins" <[email protected]>\n'
                               'Date: Thu, 29 Sep 2016 14:52:13 UTC\n'
                               'X-Amavis-Alert: BANNED\n'
                               'Subject: Atque nemo adipisci repellendus aliquid aliquam numquam porro. Sint '
                               'molestiae incidunt incidunt odit rem in. Occaecati error deserunt distinctio eius '
                               'facilis provident. Facilis neque porro et officia neque rem quibusdam corporis. '
                               'Vitae nesciunt quis perferendis atque.\n'
                               '\n'
                               'TGFib3JlIGVzc2Ugc2l0IGVhcnVtIGNvcnJ1cHRpIGVycm9yLiBNaW51cyBhZCBhdXRlbSBzZXF1\n'
                               'aS4gUmF0aW9uZSBlYXJ1bSB2ZWwgbmF0dXMgcXVpIGF0cXVlIGluIGN1cGlkaXRhdGUuIEFyY2hp\n'
                               'dGVjdG8gcXVpZGVtIGhpYyBkb2xvcmVtIGFwZXJpYW0gYWRpcGlzY2ku\n'},
             'duration': 0.1162109375,
             'ehlo': {'code': 250,
                      'duration': 0.01388406753540039,
                      'error': None,
                      'msg': 'Hello mx.hull.org\nPIPELINING\nSMTPUTF8\n8BITMIME\nSTARTTLS\nENHANCEDSTATUSCODES',
                      'name': 'ehlo',
                      'value': 'mx.hull.org'},
             'error': None,
             'id': '65618590a752207cf4371132835f51992dc056ad25c80f74aa5e5765c301f16c',
             'mail': {'code': 250,
                      'duration': 0.01448202133178711,
                      'error': None,
                      'msg': '2.1.0 Sender <[email protected]> Ok',
                      'name': 'mail',
                      'value': '[email protected]'},
             'quit': {'code': 221,
                      'duration': 0.014039039611816406,
                      'error': None,
                      'msg': '2.0.0 Bye',
                      'name': 'quit',
                      'value': None},
             'rcpt': [{'code': 250,
                       'duration': 0.01302194595336914,
                       'error': None,
                       'msg': '2.1.5 Recipient <[email protected]> Ok',
                       'name': 'rcpt',
                       'value': '[email protected]'}],
             'success': True}],
}

Postfix smtp-source

smtp-source -s 1 -l 1024 -m 1 -c -f root@localhost -t postmaster@localhost -4 127.0.0.1:25

TODO

  • Improve report formats
  • Add attachment files
  • Add eicar file for infected mail
  • Add gtube file for spam mail
  • TLS
  • Login
  • XCLIENT / XFORWARD tests
  • Python 3.5 new async
  • Fake SMTP Server (ESMTP, WEB, Rest API)

About

Client SMTP for servers testing

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages