%global _empty_manifest_terminate_build 0 Name: python-smtpdfix Version: 0.5.0 Release: 1 Summary: A SMTP server for use as a pytest fixture that implements encryption and authentication for testing. License: MIT URL: https://github.com/bebleo/smtpdfix Source0: https://mirrors.nju.edu.cn/pypi/web/packages/5d/53/ae0e6f30af8d8d6beb196e6d5a2234eb48804be2b8afbc4c2670025fb6c4/smtpdfix-0.5.0.tar.gz BuildArch: noarch Requires: python3-aiosmtpd Requires: python3-portpicker Requires: python3-pytest Requires: python3-cryptography Requires: python3-cryptography Requires: python3-flake8 Requires: python3-isort Requires: python3-pytest-asyncio Requires: python3-pytest-cov Requires: python3-pytest-timeout Requires: python3-tox Requires: python3-mypy %description `host` | `SMTPD_HOST` | `127.0.0.1` or `::1` | The hostname that the fixture will listen on. `port` | `SMTPD_PORT` | `a random free port` | The port that the fixture will listen on. `ready_timeout` | `SMTPD_READY_TIMEOUT` | `10.0` | The seconds the server will wait to start before raising a `TimeoutError`. `login_username` | `SMTPD_LOGIN_NAME` | `user` | Username for default authentication. `login_password` | `SMTPD_LOGIN_PASSWORD` | `password` | Password for default authentication. `use_ssl` | `SMTPD_USE_SSL` | `False` | Whether the fixture should use fixed TLS/SSL for transactions. If using smtplib requires that `SMTP_SSL` be used instead of `SMTP`. `use_starttls` | `SMTPD_USE_STARTTLS` | `False` | Whether the fixture should use StartTLS to encrypt the connections. If using `smtplib` requires that `SMTP.starttls()` is called before other commands are issued. Overrides `use_tls` as the preferred method for securing communications with the client. `enforce_auth` | `SMTPD_ENFORCE_AUTH` | `False` | If set to true then the fixture refuses MAIL, RCPT, DATA commands until authentication is completed. `ssl_cert_path` | `SMTPD_SSL_CERTS_PATH` | `./certs/` | The path to the key and certificate in PEM format for encryption with SSL/TLS or StartTLS. `ssl_cert_files` | `SMTPD_SSL_CERT_FILE` and `SMTPD_SSL_KEY_FILE` | `("cert.pem", None)` | A tuple of the path for the certificate file and key file in PEM format. See [Resolving certificate and key paths](#resolving-certificate-and-key-paths) for more details. ### Resolving certificate and key paths In order to resolve the certificate and key paths for the SSL/TLS context SMTPDFix does the following: 1. On initialization of a `smtpdfix.Config` the `ssl_cert_path` is set by the `SMTPD_SSL_CERTS_PATH` environment variable and the `ssl_cert_files` is set to a tuple of `(SMTPD_SSL_CERT_FILE and SMTPD_SSL_KEY_FILE)`. If the environment variables are not set the deafults are used. 2. If an SSL Context is needed, when the `smptdfix.AuthController` is initialized it will attempt to find the files in the following sequence for both the certificate file and the key file: 1. If the value in `ssl_cert_files` is `None` then `None` is returned. Setting the key file to be none assumes that it has been included in the certificate file. 2. If the value in `ssl_cert_files` is a valid path to a file then this is returned. 3. `ssl_cert_path` and the value from `ssl_cert_files` are joined and returned if it a valid path to a file. 4. A `FileNotFoundError` is raised. An example, assuming that the certificate and key are written in a single PEM file located at `./certificates/localhost.cert.pem` would be: ```python from smtplib import STMP_SSL def test_custom_certificate(smtpd): smtpd.config.ssl_cert_files = "./certificates/localhost.cert.pem" smtpd.config.use_ssl = True from_ = "from.addr@example.org" to_ = "to.addr@example.org" msg = (f"From: {from_}\r\n" f"To: {to_}\r\n" f"Subject: Foo\r\n\r\n" f"Foo bar") with SMTP_SSL(smtpd.hostname, smtpd.port) as client: client.sendmail(from_addr, to_addrs, msg) assert len(smtpd.messages) == 1 ``` ## Alternatives Many libraries for sending email have built-in methods for testing and using these methods should generally be prefered over SMTPDFix. Some known solutions: + **fastapi-mail**: has a `record_messsages()` method to intercept the mail. Instructions on how to suppress the sending of mail and implement it can be seen at [https://sabuhish.github.io/fastapi-mail/example/#unittests-using-fastapimail](https://sabuhish.github.io/fastapi-mail/example/#unittests-using-fastapimail) + **flask-mail**: has a method to suppress sending and capture the email for testing purposes. [Instructions](https://pythonhosted.org/Flask-Mail/#unit-tests-and-suppressing-emails) ## Developing To develop and test smtpdfix you will need to install [pytest-asyncio](https://github.com/pytest-dev/pytest-asyncio) to run asynchronous tests, [isort](https://pycqa.github.io/isort/) to sort imports and [flake8](https://flake8.pycqa.org/en/latest/) to lint. To install in a virtual environment for development: ```bash $ python -m venv venv $ ./venv/scripts/activate $ pip install -e .[dev] ``` Code is tested using tox: ```bash $ tox ``` Quick tests can be handled by running pytest directly: ```bash $ pytest -p no:smtpd --cov ``` Before submitting a pull request with your changes you should ensure that all imports are sorted and that the code passes linting with flake8. ```bash $ isort . $ flake8 . ``` We include a [pre-commit](https://pre-commit.com/) configuration file to automate checks and clean up imports before pushing code. In order to install pre-commit git hooks: ```bash $ pip install pre-commit $ pre-commit install ``` ## Known Issues + Firewalls may interfere with the operation of the smtp server. + Authenticating with LOGIN and PLAIN mechanisms fails over TLS/SSL, but works with STARTTLS. [Issue #10](https://github.com/bebleo/smtpdfix/issues/10) + Currently no support for termination through signals. [Issue #4](https://github.com/bebleo/smtpdfix/issues/4) + If the fixture start exceeds the `ready_timeout` and aborts the host and port are not consistently released and subsequent uses may result in an error. [Issue #80](https://github.com/bebleo/smtpdfix/issues/80) Written with ☕ and ❤ in Montreal, QC %package -n python3-smtpdfix Summary: A SMTP server for use as a pytest fixture that implements encryption and authentication for testing. Provides: python-smtpdfix BuildRequires: python3-devel BuildRequires: python3-setuptools BuildRequires: python3-pip %description -n python3-smtpdfix `host` | `SMTPD_HOST` | `127.0.0.1` or `::1` | The hostname that the fixture will listen on. `port` | `SMTPD_PORT` | `a random free port` | The port that the fixture will listen on. `ready_timeout` | `SMTPD_READY_TIMEOUT` | `10.0` | The seconds the server will wait to start before raising a `TimeoutError`. `login_username` | `SMTPD_LOGIN_NAME` | `user` | Username for default authentication. `login_password` | `SMTPD_LOGIN_PASSWORD` | `password` | Password for default authentication. `use_ssl` | `SMTPD_USE_SSL` | `False` | Whether the fixture should use fixed TLS/SSL for transactions. If using smtplib requires that `SMTP_SSL` be used instead of `SMTP`. `use_starttls` | `SMTPD_USE_STARTTLS` | `False` | Whether the fixture should use StartTLS to encrypt the connections. If using `smtplib` requires that `SMTP.starttls()` is called before other commands are issued. Overrides `use_tls` as the preferred method for securing communications with the client. `enforce_auth` | `SMTPD_ENFORCE_AUTH` | `False` | If set to true then the fixture refuses MAIL, RCPT, DATA commands until authentication is completed. `ssl_cert_path` | `SMTPD_SSL_CERTS_PATH` | `./certs/` | The path to the key and certificate in PEM format for encryption with SSL/TLS or StartTLS. `ssl_cert_files` | `SMTPD_SSL_CERT_FILE` and `SMTPD_SSL_KEY_FILE` | `("cert.pem", None)` | A tuple of the path for the certificate file and key file in PEM format. See [Resolving certificate and key paths](#resolving-certificate-and-key-paths) for more details. ### Resolving certificate and key paths In order to resolve the certificate and key paths for the SSL/TLS context SMTPDFix does the following: 1. On initialization of a `smtpdfix.Config` the `ssl_cert_path` is set by the `SMTPD_SSL_CERTS_PATH` environment variable and the `ssl_cert_files` is set to a tuple of `(SMTPD_SSL_CERT_FILE and SMTPD_SSL_KEY_FILE)`. If the environment variables are not set the deafults are used. 2. If an SSL Context is needed, when the `smptdfix.AuthController` is initialized it will attempt to find the files in the following sequence for both the certificate file and the key file: 1. If the value in `ssl_cert_files` is `None` then `None` is returned. Setting the key file to be none assumes that it has been included in the certificate file. 2. If the value in `ssl_cert_files` is a valid path to a file then this is returned. 3. `ssl_cert_path` and the value from `ssl_cert_files` are joined and returned if it a valid path to a file. 4. A `FileNotFoundError` is raised. An example, assuming that the certificate and key are written in a single PEM file located at `./certificates/localhost.cert.pem` would be: ```python from smtplib import STMP_SSL def test_custom_certificate(smtpd): smtpd.config.ssl_cert_files = "./certificates/localhost.cert.pem" smtpd.config.use_ssl = True from_ = "from.addr@example.org" to_ = "to.addr@example.org" msg = (f"From: {from_}\r\n" f"To: {to_}\r\n" f"Subject: Foo\r\n\r\n" f"Foo bar") with SMTP_SSL(smtpd.hostname, smtpd.port) as client: client.sendmail(from_addr, to_addrs, msg) assert len(smtpd.messages) == 1 ``` ## Alternatives Many libraries for sending email have built-in methods for testing and using these methods should generally be prefered over SMTPDFix. Some known solutions: + **fastapi-mail**: has a `record_messsages()` method to intercept the mail. Instructions on how to suppress the sending of mail and implement it can be seen at [https://sabuhish.github.io/fastapi-mail/example/#unittests-using-fastapimail](https://sabuhish.github.io/fastapi-mail/example/#unittests-using-fastapimail) + **flask-mail**: has a method to suppress sending and capture the email for testing purposes. [Instructions](https://pythonhosted.org/Flask-Mail/#unit-tests-and-suppressing-emails) ## Developing To develop and test smtpdfix you will need to install [pytest-asyncio](https://github.com/pytest-dev/pytest-asyncio) to run asynchronous tests, [isort](https://pycqa.github.io/isort/) to sort imports and [flake8](https://flake8.pycqa.org/en/latest/) to lint. To install in a virtual environment for development: ```bash $ python -m venv venv $ ./venv/scripts/activate $ pip install -e .[dev] ``` Code is tested using tox: ```bash $ tox ``` Quick tests can be handled by running pytest directly: ```bash $ pytest -p no:smtpd --cov ``` Before submitting a pull request with your changes you should ensure that all imports are sorted and that the code passes linting with flake8. ```bash $ isort . $ flake8 . ``` We include a [pre-commit](https://pre-commit.com/) configuration file to automate checks and clean up imports before pushing code. In order to install pre-commit git hooks: ```bash $ pip install pre-commit $ pre-commit install ``` ## Known Issues + Firewalls may interfere with the operation of the smtp server. + Authenticating with LOGIN and PLAIN mechanisms fails over TLS/SSL, but works with STARTTLS. [Issue #10](https://github.com/bebleo/smtpdfix/issues/10) + Currently no support for termination through signals. [Issue #4](https://github.com/bebleo/smtpdfix/issues/4) + If the fixture start exceeds the `ready_timeout` and aborts the host and port are not consistently released and subsequent uses may result in an error. [Issue #80](https://github.com/bebleo/smtpdfix/issues/80) Written with ☕ and ❤ in Montreal, QC %package help Summary: Development documents and examples for smtpdfix Provides: python3-smtpdfix-doc %description help `host` | `SMTPD_HOST` | `127.0.0.1` or `::1` | The hostname that the fixture will listen on. `port` | `SMTPD_PORT` | `a random free port` | The port that the fixture will listen on. `ready_timeout` | `SMTPD_READY_TIMEOUT` | `10.0` | The seconds the server will wait to start before raising a `TimeoutError`. `login_username` | `SMTPD_LOGIN_NAME` | `user` | Username for default authentication. `login_password` | `SMTPD_LOGIN_PASSWORD` | `password` | Password for default authentication. `use_ssl` | `SMTPD_USE_SSL` | `False` | Whether the fixture should use fixed TLS/SSL for transactions. If using smtplib requires that `SMTP_SSL` be used instead of `SMTP`. `use_starttls` | `SMTPD_USE_STARTTLS` | `False` | Whether the fixture should use StartTLS to encrypt the connections. If using `smtplib` requires that `SMTP.starttls()` is called before other commands are issued. Overrides `use_tls` as the preferred method for securing communications with the client. `enforce_auth` | `SMTPD_ENFORCE_AUTH` | `False` | If set to true then the fixture refuses MAIL, RCPT, DATA commands until authentication is completed. `ssl_cert_path` | `SMTPD_SSL_CERTS_PATH` | `./certs/` | The path to the key and certificate in PEM format for encryption with SSL/TLS or StartTLS. `ssl_cert_files` | `SMTPD_SSL_CERT_FILE` and `SMTPD_SSL_KEY_FILE` | `("cert.pem", None)` | A tuple of the path for the certificate file and key file in PEM format. See [Resolving certificate and key paths](#resolving-certificate-and-key-paths) for more details. ### Resolving certificate and key paths In order to resolve the certificate and key paths for the SSL/TLS context SMTPDFix does the following: 1. On initialization of a `smtpdfix.Config` the `ssl_cert_path` is set by the `SMTPD_SSL_CERTS_PATH` environment variable and the `ssl_cert_files` is set to a tuple of `(SMTPD_SSL_CERT_FILE and SMTPD_SSL_KEY_FILE)`. If the environment variables are not set the deafults are used. 2. If an SSL Context is needed, when the `smptdfix.AuthController` is initialized it will attempt to find the files in the following sequence for both the certificate file and the key file: 1. If the value in `ssl_cert_files` is `None` then `None` is returned. Setting the key file to be none assumes that it has been included in the certificate file. 2. If the value in `ssl_cert_files` is a valid path to a file then this is returned. 3. `ssl_cert_path` and the value from `ssl_cert_files` are joined and returned if it a valid path to a file. 4. A `FileNotFoundError` is raised. An example, assuming that the certificate and key are written in a single PEM file located at `./certificates/localhost.cert.pem` would be: ```python from smtplib import STMP_SSL def test_custom_certificate(smtpd): smtpd.config.ssl_cert_files = "./certificates/localhost.cert.pem" smtpd.config.use_ssl = True from_ = "from.addr@example.org" to_ = "to.addr@example.org" msg = (f"From: {from_}\r\n" f"To: {to_}\r\n" f"Subject: Foo\r\n\r\n" f"Foo bar") with SMTP_SSL(smtpd.hostname, smtpd.port) as client: client.sendmail(from_addr, to_addrs, msg) assert len(smtpd.messages) == 1 ``` ## Alternatives Many libraries for sending email have built-in methods for testing and using these methods should generally be prefered over SMTPDFix. Some known solutions: + **fastapi-mail**: has a `record_messsages()` method to intercept the mail. Instructions on how to suppress the sending of mail and implement it can be seen at [https://sabuhish.github.io/fastapi-mail/example/#unittests-using-fastapimail](https://sabuhish.github.io/fastapi-mail/example/#unittests-using-fastapimail) + **flask-mail**: has a method to suppress sending and capture the email for testing purposes. [Instructions](https://pythonhosted.org/Flask-Mail/#unit-tests-and-suppressing-emails) ## Developing To develop and test smtpdfix you will need to install [pytest-asyncio](https://github.com/pytest-dev/pytest-asyncio) to run asynchronous tests, [isort](https://pycqa.github.io/isort/) to sort imports and [flake8](https://flake8.pycqa.org/en/latest/) to lint. To install in a virtual environment for development: ```bash $ python -m venv venv $ ./venv/scripts/activate $ pip install -e .[dev] ``` Code is tested using tox: ```bash $ tox ``` Quick tests can be handled by running pytest directly: ```bash $ pytest -p no:smtpd --cov ``` Before submitting a pull request with your changes you should ensure that all imports are sorted and that the code passes linting with flake8. ```bash $ isort . $ flake8 . ``` We include a [pre-commit](https://pre-commit.com/) configuration file to automate checks and clean up imports before pushing code. In order to install pre-commit git hooks: ```bash $ pip install pre-commit $ pre-commit install ``` ## Known Issues + Firewalls may interfere with the operation of the smtp server. + Authenticating with LOGIN and PLAIN mechanisms fails over TLS/SSL, but works with STARTTLS. [Issue #10](https://github.com/bebleo/smtpdfix/issues/10) + Currently no support for termination through signals. [Issue #4](https://github.com/bebleo/smtpdfix/issues/4) + If the fixture start exceeds the `ready_timeout` and aborts the host and port are not consistently released and subsequent uses may result in an error. [Issue #80](https://github.com/bebleo/smtpdfix/issues/80) Written with ☕ and ❤ in Montreal, QC %prep %autosetup -n smtpdfix-0.5.0 %build %py3_build %install %py3_install install -d -m755 %{buildroot}/%{_pkgdocdir} if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi pushd %{buildroot} if [ -d usr/lib ]; then find usr/lib -type f -printf "\"/%h/%f\"\n" >> filelist.lst fi if [ -d usr/lib64 ]; then find usr/lib64 -type f -printf "\"/%h/%f\"\n" >> filelist.lst fi if [ -d usr/bin ]; then find usr/bin -type f -printf "\"/%h/%f\"\n" >> filelist.lst fi if [ -d usr/sbin ]; then find usr/sbin -type f -printf "\"/%h/%f\"\n" >> filelist.lst fi touch doclist.lst if [ -d usr/share/man ]; then find usr/share/man -type f -printf "\"/%h/%f.gz\"\n" >> doclist.lst fi popd mv %{buildroot}/filelist.lst . mv %{buildroot}/doclist.lst . %files -n python3-smtpdfix -f filelist.lst %dir %{python3_sitelib}/* %files help -f doclist.lst %{_docdir}/* %changelog * Thu Jun 08 2023 Python_Bot - 0.5.0-1 - Package Spec generated