Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package python-aiosmtplib for
openSUSE:Factory checked in at 2021-05-02 18:35:58
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-aiosmtplib (Old)
and /work/SRC/openSUSE:Factory/.python-aiosmtplib.new.1947 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-aiosmtplib"
Sun May 2 18:35:58 2021 rev:5 rq:889680 version:1.1.5
Changes:
--------
--- /work/SRC/openSUSE:Factory/python-aiosmtplib/python-aiosmtplib.changes
2020-12-01 14:23:20.941629823 +0100
+++
/work/SRC/openSUSE:Factory/.python-aiosmtplib.new.1947/python-aiosmtplib.changes
2021-05-02 18:39:05.204188289 +0200
@@ -1,0 +2,9 @@
+Fri Apr 30 10:00:09 UTC 2021 - Matej Cepl <[email protected]>
+
+- Update to 1.1.5:
+ - Bugfix: avoid raising asyncio.CancelledError on connection lost
+ - Bugfix: allow UTF-8 chars in usernames and password strings
+ - Feature: allow bytes type args for login usernames and passwords
+- Switch off failing tests because of gh#cole/aiosmtplib#171.
+
+-------------------------------------------------------------------
Old:
----
aiosmtplib-1.1.4.tar.gz
New:
----
aiosmtplib-1.1.5.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ python-aiosmtplib.spec ++++++
--- /var/tmp/diff_new_pack.LEAG8U/_old 2021-05-02 18:39:05.640186431 +0200
+++ /var/tmp/diff_new_pack.LEAG8U/_new 2021-05-02 18:39:05.640186431 +0200
@@ -1,7 +1,7 @@
#
# spec file for package python-aiosmtplib
#
-# Copyright (c) 2020 SUSE LLC
+# Copyright (c) 2021 SUSE LLC
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -19,7 +19,7 @@
%{?!python_module:%define python_module() python-%{**} python3-%{**}}
%define skip_python2 1
Name: python-aiosmtplib
-Version: 1.1.4
+Version: 1.1.5
Release: 0
Summary: Python asyncio SMTP client
License: MIT
@@ -53,8 +53,8 @@
%python_expand %fdupes %{buildroot}%{$python_sitelib}
%check
-# test_qq_login or test_starttls_gmail are online
-%pytest -rs -k 'not (test_qq_login or test_starttls_gmail)'
+# gh#cole/aiosmtplib#171
+%pytest -rs -k 'not (test_qq_login or test_starttls_gmail or
test_send_with_login or test_connect_with_login)'
%files %{python_files}
%doc README.rst docs/*.rst
++++++ aiosmtplib-1.1.4.tar.gz -> aiosmtplib-1.1.5.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/aiosmtplib-1.1.4/PKG-INFO
new/aiosmtplib-1.1.5/PKG-INFO
--- old/aiosmtplib-1.1.4/PKG-INFO 2020-09-12 19:20:12.445738000 +0200
+++ new/aiosmtplib-1.1.5/PKG-INFO 2021-04-25 19:31:03.087155800 +0200
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: aiosmtplib
-Version: 1.1.4
+Version: 1.1.5
Summary: asyncio SMTP client
Home-page: https://github.com/cole/aiosmtplib
License: MIT
@@ -19,6 +19,7 @@
Classifier: Programming Language :: Python :: 3.6
Classifier: Programming Language :: Python :: 3.7
Classifier: Programming Language :: Python :: 3.8
+Classifier: Programming Language :: Python :: 3.9
Classifier: Topic :: Communications
Classifier: Topic :: Communications :: Email
Classifier: Topic :: Software Development :: Libraries
@@ -36,7 +37,7 @@
aiosmtplib
==========
-|circleci| |codecov| |pypi-version| |pypi-python-versions| |pypi-status|
+|circleci| |codecov| |pypi-version| |pypi-python-versions| |pypi-status|
|downloads|
|pypi-license| |black|
------------
@@ -76,8 +77,8 @@
-.. |circleci| image::
https://circleci.com/gh/cole/aiosmtplib/tree/master.svg?style=shield
- :target: https://circleci.com/gh/cole/aiosmtplib/tree/master
+.. |circleci| image::
https://circleci.com/gh/cole/aiosmtplib/tree/main.svg?style=shield
+ :target: https://circleci.com/gh/cole/aiosmtplib/tree/main
:alt: "aiosmtplib CircleCI build status"
.. |pypi-version| image:: https://img.shields.io/pypi/v/aiosmtplib.svg
:target: https://pypi.python.org/pypi/aiosmtplib
@@ -85,10 +86,13 @@
.. |pypi-python-versions| image::
https://img.shields.io/pypi/pyversions/aiosmtplib.svg
.. |pypi-status| image:: https://img.shields.io/pypi/status/aiosmtplib.svg
.. |pypi-license| image:: https://img.shields.io/pypi/l/aiosmtplib.svg
-.. |codecov| image::
https://codecov.io/gh/cole/aiosmtplib/branch/master/graph/badge.svg
+.. |codecov| image::
https://codecov.io/gh/cole/aiosmtplib/branch/main/graph/badge.svg
:target: https://codecov.io/gh/cole/aiosmtplib
.. |black| image:: https://img.shields.io/badge/code%20style-black-000000.svg
:target: https://github.com/ambv/black
:alt: "Code style: black"
+.. |downloads| image:: https://pepy.tech/badge/aiosmtplib
+ :target: https://pepy.tech/project/aiosmtplib
+ :alt: "aiosmtplib on pypy.tech"
.. _Read The Docs: https://aiosmtplib.readthedocs.io/en/stable/overview.html
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/aiosmtplib-1.1.4/README.rst
new/aiosmtplib-1.1.5/README.rst
--- old/aiosmtplib-1.1.4/README.rst 2020-09-12 19:19:34.795263800 +0200
+++ new/aiosmtplib-1.1.5/README.rst 2021-04-25 19:31:01.233004600 +0200
@@ -1,7 +1,7 @@
aiosmtplib
==========
-|circleci| |codecov| |pypi-version| |pypi-python-versions| |pypi-status|
+|circleci| |codecov| |pypi-version| |pypi-python-versions| |pypi-status|
|downloads|
|pypi-license| |black|
------------
@@ -41,8 +41,8 @@
-.. |circleci| image::
https://circleci.com/gh/cole/aiosmtplib/tree/master.svg?style=shield
- :target: https://circleci.com/gh/cole/aiosmtplib/tree/master
+.. |circleci| image::
https://circleci.com/gh/cole/aiosmtplib/tree/main.svg?style=shield
+ :target: https://circleci.com/gh/cole/aiosmtplib/tree/main
:alt: "aiosmtplib CircleCI build status"
.. |pypi-version| image:: https://img.shields.io/pypi/v/aiosmtplib.svg
:target: https://pypi.python.org/pypi/aiosmtplib
@@ -50,9 +50,12 @@
.. |pypi-python-versions| image::
https://img.shields.io/pypi/pyversions/aiosmtplib.svg
.. |pypi-status| image:: https://img.shields.io/pypi/status/aiosmtplib.svg
.. |pypi-license| image:: https://img.shields.io/pypi/l/aiosmtplib.svg
-.. |codecov| image::
https://codecov.io/gh/cole/aiosmtplib/branch/master/graph/badge.svg
+.. |codecov| image::
https://codecov.io/gh/cole/aiosmtplib/branch/main/graph/badge.svg
:target: https://codecov.io/gh/cole/aiosmtplib
.. |black| image:: https://img.shields.io/badge/code%20style-black-000000.svg
:target: https://github.com/ambv/black
:alt: "Code style: black"
+.. |downloads| image:: https://pepy.tech/badge/aiosmtplib
+ :target: https://pepy.tech/project/aiosmtplib
+ :alt: "aiosmtplib on pypy.tech"
.. _Read The Docs: https://aiosmtplib.readthedocs.io/en/stable/overview.html
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/aiosmtplib-1.1.4/aiosmtplib/__init__.py
new/aiosmtplib-1.1.5/aiosmtplib/__init__.py
--- old/aiosmtplib-1.1.4/aiosmtplib/__init__.py 2020-09-12 19:19:34.803263700
+0200
+++ new/aiosmtplib-1.1.5/aiosmtplib/__init__.py 2021-04-25 19:31:01.233004600
+0200
@@ -32,10 +32,10 @@
__title__ = "aiosmtplib"
-__version__ = "1.1.4"
+__version__ = "1.1.5"
__author__ = "Cole Maclean"
__license__ = "MIT"
-__copyright__ = "Copyright 2020 Cole Maclean"
+__copyright__ = "Copyright 2021 Cole Maclean"
__all__ = (
"send",
"SMTP",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/aiosmtplib-1.1.4/aiosmtplib/api.py
new/aiosmtplib-1.1.5/aiosmtplib/api.py
--- old/aiosmtplib-1.1.4/aiosmtplib/api.py 2020-09-12 19:19:34.807263600
+0200
+++ new/aiosmtplib-1.1.5/aiosmtplib/api.py 2021-04-25 19:31:01.233004600
+0200
@@ -35,8 +35,8 @@
recipients: Optional[Union[str, Sequence[str]]] = ...,
hostname: str = ...,
port: Optional[int] = ...,
- username: Optional[str] = ...,
- password: Optional[str] = ...,
+ username: Optional[Union[str, bytes]] = ...,
+ password: Optional[Union[str, bytes]] = ...,
mail_options: Optional[List[str]] = ...,
rcpt_options: Optional[List[str]] = ...,
timeout: Optional[float] = ...,
@@ -61,8 +61,8 @@
recipients: Union[str, Sequence[str]] = ...,
hostname: str = ...,
port: Optional[int] = ...,
- username: Optional[str] = ...,
- password: Optional[str] = ...,
+ username: Optional[Union[str, bytes]] = ...,
+ password: Optional[Union[str, bytes]] = ...,
mail_options: Optional[List[str]] = ...,
rcpt_options: Optional[List[str]] = ...,
timeout: Optional[float] = ...,
@@ -87,8 +87,8 @@
recipients: Optional[Union[str, Sequence[str]]] = ...,
hostname: str = ...,
port: Optional[int] = ...,
- username: Optional[str] = ...,
- password: Optional[str] = ...,
+ username: Optional[Union[str, bytes]] = ...,
+ password: Optional[Union[str, bytes]] = ...,
mail_options: Optional[List[str]] = ...,
rcpt_options: Optional[List[str]] = ...,
timeout: Optional[float] = ...,
@@ -113,8 +113,8 @@
recipients: Union[str, Sequence[str]] = ...,
hostname: str = ...,
port: Optional[int] = ...,
- username: Optional[str] = ...,
- password: Optional[str] = ...,
+ username: Optional[Union[str, bytes]] = ...,
+ password: Optional[Union[str, bytes]] = ...,
mail_options: Optional[List[str]] = ...,
rcpt_options: Optional[List[str]] = ...,
timeout: Optional[float] = ...,
@@ -139,8 +139,8 @@
recipients: Optional[Union[str, Sequence[str]]] = ...,
hostname: None = ...,
port: None = ...,
- username: Optional[str] = ...,
- password: Optional[str] = ...,
+ username: Optional[Union[str, bytes]] = ...,
+ password: Optional[Union[str, bytes]] = ...,
mail_options: Optional[List[str]] = ...,
rcpt_options: Optional[List[str]] = ...,
timeout: Optional[float] = ...,
@@ -165,8 +165,8 @@
recipients: Union[str, Sequence[str]] = ...,
hostname: None = ...,
port: None = ...,
- username: Optional[str] = ...,
- password: Optional[str] = ...,
+ username: Optional[Union[str, bytes]] = ...,
+ password: Optional[Union[str, bytes]] = ...,
mail_options: Optional[List[str]] = ...,
rcpt_options: Optional[List[str]] = ...,
timeout: Optional[float] = ...,
@@ -191,8 +191,8 @@
recipients: Optional[Union[str, Sequence[str]]] = ...,
hostname: None = ...,
port: None = ...,
- username: Optional[str] = ...,
- password: Optional[str] = ...,
+ username: Optional[Union[str, bytes]] = ...,
+ password: Optional[Union[str, bytes]] = ...,
mail_options: Optional[List[str]] = ...,
rcpt_options: Optional[List[str]] = ...,
timeout: Optional[float] = ...,
@@ -217,8 +217,8 @@
recipients: Union[str, Sequence[str]] = ...,
hostname: None = ...,
port: None = ...,
- username: Optional[str] = ...,
- password: Optional[str] = ...,
+ username: Optional[Union[str, bytes]] = ...,
+ password: Optional[Union[str, bytes]] = ...,
mail_options: Optional[List[str]] = ...,
rcpt_options: Optional[List[str]] = ...,
timeout: Optional[float] = ...,
@@ -243,8 +243,8 @@
recipients: Optional[Union[str, Sequence[str]]] = ...,
hostname: None = ...,
port: None = ...,
- username: Optional[str] = ...,
- password: Optional[str] = ...,
+ username: Optional[Union[str, bytes]] = ...,
+ password: Optional[Union[str, bytes]] = ...,
mail_options: Optional[List[str]] = ...,
rcpt_options: Optional[List[str]] = ...,
timeout: Optional[float] = ...,
@@ -269,8 +269,8 @@
recipients: Union[str, Sequence[str]] = ...,
hostname: None = ...,
port: None = ...,
- username: Optional[str] = ...,
- password: Optional[str] = ...,
+ username: Optional[Union[str, bytes]] = ...,
+ password: Optional[Union[str, bytes]] = ...,
mail_options: Optional[List[str]] = ...,
rcpt_options: Optional[List[str]] = ...,
timeout: Optional[float] = ...,
@@ -295,8 +295,8 @@
recipients: Optional[Union[str, Sequence[str]]] = ...,
hostname: None = ...,
port: None = ...,
- username: Optional[str] = ...,
- password: Optional[str] = ...,
+ username: Optional[Union[str, bytes]] = ...,
+ password: Optional[Union[str, bytes]] = ...,
mail_options: Optional[List[str]] = ...,
rcpt_options: Optional[List[str]] = ...,
timeout: Optional[float] = ...,
@@ -321,8 +321,8 @@
recipients: Union[str, Sequence[str]] = ...,
hostname: None = ...,
port: None = ...,
- username: Optional[str] = ...,
- password: Optional[str] = ...,
+ username: Optional[Union[str, bytes]] = ...,
+ password: Optional[Union[str, bytes]] = ...,
mail_options: Optional[List[str]] = ...,
rcpt_options: Optional[List[str]] = ...,
timeout: Optional[float] = ...,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/aiosmtplib-1.1.4/aiosmtplib/auth.py
new/aiosmtplib-1.1.5/aiosmtplib/auth.py
--- old/aiosmtplib-1.1.4/aiosmtplib/auth.py 2020-09-12 19:19:34.807263600
+0200
+++ new/aiosmtplib-1.1.5/aiosmtplib/auth.py 2021-04-25 19:31:01.233004600
+0200
@@ -18,7 +18,7 @@
def crammd5_verify(username: bytes, password: bytes, challenge: bytes) ->
bytes:
decoded_challenge = base64.b64decode(challenge)
md5_digest = hmac.new(password, msg=decoded_challenge, digestmod="md5")
- verification = username + b" " + md5_digest.hexdigest().encode("ascii")
+ verification = username + b" " + md5_digest.hexdigest().encode("utf-8")
encoded_verification = base64.b64encode(verification)
return encoded_verification
@@ -42,8 +42,8 @@
async def login(
self,
- username: str,
- password: str,
+ username: Union[str, bytes],
+ password: Union[str, bytes],
timeout: Optional[Union[float, Default]] = _default,
) -> SMTPResponse:
"""
@@ -90,8 +90,8 @@
async def auth_crammd5(
self,
- username: str,
- password: str,
+ username: Union[str, bytes],
+ password: Union[str, bytes],
timeout: Optional[Union[float, Default]] = _default,
) -> SMTPResponse:
"""
@@ -115,9 +115,17 @@
initial_response.code, initial_response.message
)
- password_bytes = password.encode("ascii")
- username_bytes = username.encode("ascii")
- response_bytes = initial_response.message.encode("ascii")
+ if isinstance(password, bytes):
+ password_bytes = password
+ else:
+ password_bytes = password.encode("utf-8")
+
+ if isinstance(username, bytes):
+ username_bytes = username
+ else:
+ username_bytes = username.encode("utf-8")
+
+ response_bytes = initial_response.message.encode("utf-8")
verification_bytes = crammd5_verify(
username_bytes, password_bytes, response_bytes
@@ -132,8 +140,8 @@
async def auth_plain(
self,
- username: str,
- password: str,
+ username: Union[str, bytes],
+ password: Union[str, bytes],
timeout: Optional[Union[float, Default]] = _default,
) -> SMTPResponse:
"""
@@ -147,8 +155,16 @@
235 ok, go ahead (#2.0.0)
"""
- username_bytes = username.encode("ascii")
- password_bytes = password.encode("ascii")
+ if isinstance(password, bytes):
+ password_bytes = password
+ else:
+ password_bytes = password.encode("utf-8")
+
+ if isinstance(username, bytes):
+ username_bytes = username
+ else:
+ username_bytes = username.encode("utf-8")
+
username_and_password = b"\0" + username_bytes + b"\0" + password_bytes
encoded = base64.b64encode(username_and_password)
@@ -163,8 +179,8 @@
async def auth_login(
self,
- username: str,
- password: str,
+ username: Union[str, bytes],
+ password: Union[str, bytes],
timeout: Optional[Union[float, Default]] = _default,
) -> SMTPResponse:
"""
@@ -190,8 +206,18 @@
However, since most servers seem to support both, we send the username
with the initial request.
"""
- encoded_username = base64.b64encode(username.encode("ascii"))
- encoded_password = base64.b64encode(password.encode("ascii"))
+ if isinstance(password, bytes):
+ password_bytes = password
+ else:
+ password_bytes = password.encode("utf-8")
+
+ if isinstance(username, bytes):
+ username_bytes = username
+ else:
+ username_bytes = username.encode("utf-8")
+
+ encoded_username = base64.b64encode(username_bytes)
+ encoded_password = base64.b64encode(password_bytes)
initial_response = await self.execute_command(
b"AUTH", b"LOGIN", encoded_username, timeout=timeout
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/aiosmtplib-1.1.4/aiosmtplib/compat.py
new/aiosmtplib-1.1.5/aiosmtplib/compat.py
--- old/aiosmtplib-1.1.4/aiosmtplib/compat.py 2020-09-12 19:19:34.811263600
+0200
+++ new/aiosmtplib-1.1.5/aiosmtplib/compat.py 2021-04-25 19:31:01.233004600
+0200
@@ -36,7 +36,7 @@
if PY37_OR_LATER:
return asyncio.all_tasks(loop=loop)
- return asyncio.Task.all_tasks(loop=loop)
+ return asyncio.Task.all_tasks(loop=loop) # type: ignore
async def start_tls(
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/aiosmtplib-1.1.4/aiosmtplib/connection.py
new/aiosmtplib-1.1.5/aiosmtplib/connection.py
--- old/aiosmtplib-1.1.4/aiosmtplib/connection.py 2020-09-12
19:19:34.815263700 +0200
+++ new/aiosmtplib-1.1.5/aiosmtplib/connection.py 2021-04-25
19:31:01.233004600 +0200
@@ -53,8 +53,8 @@
self,
hostname: Optional[str] = "localhost",
port: Optional[int] = None,
- username: Optional[str] = None,
- password: Optional[str] = None,
+ username: Optional[Union[str, bytes]] = None,
+ password: Optional[Union[str, bytes]] = None,
source_address: Optional[str] = None,
timeout: Optional[float] = DEFAULT_TIMEOUT,
loop: Optional[asyncio.AbstractEventLoop] = None,
@@ -174,8 +174,8 @@
self,
hostname: Optional[Union[str, Default]] = _default,
port: Optional[Union[int, Default]] = _default,
- username: Optional[Union[str, Default]] = _default,
- password: Optional[Union[str, Default]] = _default,
+ username: Optional[Union[str, bytes, Default]] = _default,
+ password: Optional[Union[str, bytes, Default]] = _default,
source_address: Optional[Union[str, Default]] = _default,
timeout: Optional[Union[float, Default]] = _default,
loop: Optional[Union[asyncio.AbstractEventLoop, Default]] = _default,
@@ -432,8 +432,8 @@
async def login(
self,
- username: str,
- password: str,
+ username: Union[str, bytes],
+ password: Union[str, bytes],
timeout: Optional[Union[float, Default]] = _default,
) -> SMTPResponse:
raise NotImplementedError
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/aiosmtplib-1.1.4/aiosmtplib/protocol.py
new/aiosmtplib-1.1.5/aiosmtplib/protocol.py
--- old/aiosmtplib-1.1.4/aiosmtplib/protocol.py 2020-09-12 19:19:34.823263600
+0200
+++ new/aiosmtplib-1.1.5/aiosmtplib/protocol.py 2021-04-25 19:31:01.233004600
+0200
@@ -138,15 +138,12 @@
def connection_lost(self, exc: Optional[Exception]) -> None:
super().connection_lost(exc)
+ smtp_exc = SMTPServerDisconnected("Connection lost")
if exc:
- smtp_exc = SMTPServerDisconnected("Connection lost")
smtp_exc.__cause__ = exc
if self._response_waiter and not self._response_waiter.done():
- if exc:
- self._response_waiter.set_exception(smtp_exc)
- else:
- self._response_waiter.cancel()
+ self._response_waiter.set_exception(smtp_exc)
if self._connection_lost_waiter and not
self._connection_lost_waiter.done():
if exc:
@@ -195,8 +192,7 @@
return False
def _read_response_from_buffer(self) -> Optional[SMTPResponse]:
- """Parse the actual response (if any) from the data buffer
- """
+ """Parse the actual response (if any) from the data buffer"""
code = -1
message = bytearray()
offset = 0
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/aiosmtplib-1.1.4/aiosmtplib/response.py
new/aiosmtplib-1.1.5/aiosmtplib/response.py
--- old/aiosmtplib-1.1.4/aiosmtplib/response.py 2020-09-12 19:19:34.831263500
+0200
+++ new/aiosmtplib-1.1.5/aiosmtplib/response.py 2021-04-25 19:31:01.233004600
+0200
@@ -7,7 +7,7 @@
__all__ = ("SMTPResponse",)
-BaseResponse = NamedTuple("SMTPResponse", [("code", int), ("message", str)])
+BaseResponse = NamedTuple("BaseResponse", [("code", int), ("message", str)])
class SMTPResponse(BaseResponse):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/aiosmtplib-1.1.4/docs/conf.py
new/aiosmtplib-1.1.5/docs/conf.py
--- old/aiosmtplib-1.1.4/docs/conf.py 2020-09-12 19:19:34.843263600 +0200
+++ new/aiosmtplib-1.1.5/docs/conf.py 2021-04-25 19:31:01.233004600 +0200
@@ -186,6 +186,7 @@
("py:class", "typing.Tuple"),
("py:class", "concurrent.futures._base.TimeoutError"),
("py:class", "asyncio.exceptions.TimeoutError"),
+ ("py:class", "socket.socket"),
]
doctest_global_setup = """
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/aiosmtplib-1.1.4/pyproject.toml
new/aiosmtplib-1.1.5/pyproject.toml
--- old/aiosmtplib-1.1.4/pyproject.toml 2020-09-12 19:19:34.859263700 +0200
+++ new/aiosmtplib-1.1.5/pyproject.toml 2021-04-25 19:31:01.233004600 +0200
@@ -4,7 +4,7 @@
[tool.poetry]
name = "aiosmtplib"
-version = "1.1.4"
+version = "1.1.5"
description = "asyncio SMTP client"
authors = ["Cole Maclean <[email protected]>"]
license = "MIT"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/aiosmtplib-1.1.4/setup.py
new/aiosmtplib-1.1.5/setup.py
--- old/aiosmtplib-1.1.4/setup.py 2020-09-12 19:20:12.445069300 +0200
+++ new/aiosmtplib-1.1.5/setup.py 2021-04-25 19:31:03.086809200 +0200
@@ -13,9 +13,9 @@
setup_kwargs = {
'name': 'aiosmtplib',
- 'version': '1.1.4',
+ 'version': '1.1.5',
'description': 'asyncio SMTP client',
- 'long_description': 'aiosmtplib\n==========\n\n|circleci| |codecov|
|pypi-version| |pypi-python-versions| |pypi-status|\n|pypi-license|
|black|\n\n------------\n\naiosmtplib is an asynchronous SMTP client for use
with asyncio.\n\nFor documentation, see `Read The
Docs`_.\n\nQuickstart\n----------\n\n.. code-block:: python\n\n import
asyncio\n from email.message import EmailMessage\n\n import
aiosmtplib\n\n message = EmailMessage()\n message["From"] =
"root@localhost"\n message["To"] = "[email protected]"\n
message["Subject"] = "Hello World!"\n message.set_content("Sent via
aiosmtplib")\n\n loop = asyncio.get_event_loop()\n
loop.run_until_complete(aiosmtplib.send(message, hostname="127.0.0.1",
port=25))\n\n\nRequirements\n------------\nPython 3.5.2+, compiled with SSL
support, is required.\n\n\nBug reporting\n-------------\nBug reports (and
feature requests) are welcome via Github issues.\n\n\n\n.. |circleci| image::
https://circleci.com/gh/cole/ai
osmtplib/tree/master.svg?style=shield\n :target:
https://circleci.com/gh/cole/aiosmtplib/tree/master\n :alt:
"aiosmtplib CircleCI build status"\n.. |pypi-version| image::
https://img.shields.io/pypi/v/aiosmtplib.svg\n :target:
https://pypi.python.org/pypi/aiosmtplib\n :alt: "aiosmtplib on
the Python Package Index"\n.. |pypi-python-versions| image::
https://img.shields.io/pypi/pyversions/aiosmtplib.svg\n.. |pypi-status| image::
https://img.shields.io/pypi/status/aiosmtplib.svg\n.. |pypi-license| image::
https://img.shields.io/pypi/l/aiosmtplib.svg\n.. |codecov| image::
https://codecov.io/gh/cole/aiosmtplib/branch/master/graph/badge.svg\n
:target: https://codecov.io/gh/cole/aiosmtplib\n.. |black| image::
https://img.shields.io/badge/code%20style-black-000000.svg\n :target:
https://github.com/ambv/black\n :alt: "Code style: black"\n.. _Read
The Docs: https://aiosmtplib.readthedocs.io/en/stable/overview.
html\n',
+ 'long_description': 'aiosmtplib\n==========\n\n|circleci| |codecov|
|pypi-version| |pypi-python-versions| |pypi-status| |downloads|\n|pypi-license|
|black|\n\n------------\n\naiosmtplib is an asynchronous SMTP client for use
with asyncio.\n\nFor documentation, see `Read The
Docs`_.\n\nQuickstart\n----------\n\n.. code-block:: python\n\n import
asyncio\n from email.message import EmailMessage\n\n import
aiosmtplib\n\n message = EmailMessage()\n message["From"] =
"root@localhost"\n message["To"] = "[email protected]"\n
message["Subject"] = "Hello World!"\n message.set_content("Sent via
aiosmtplib")\n\n loop = asyncio.get_event_loop()\n
loop.run_until_complete(aiosmtplib.send(message, hostname="127.0.0.1",
port=25))\n\n\nRequirements\n------------\nPython 3.5.2+, compiled with SSL
support, is required.\n\n\nBug reporting\n-------------\nBug reports (and
feature requests) are welcome via Github issues.\n\n\n\n.. |circleci| image::
https://circleci.co
m/gh/cole/aiosmtplib/tree/main.svg?style=shield\n :target:
https://circleci.com/gh/cole/aiosmtplib/tree/main\n :alt: "aiosmtplib
CircleCI build status"\n.. |pypi-version| image::
https://img.shields.io/pypi/v/aiosmtplib.svg\n :target:
https://pypi.python.org/pypi/aiosmtplib\n :alt: "aiosmtplib on
the Python Package Index"\n.. |pypi-python-versions| image::
https://img.shields.io/pypi/pyversions/aiosmtplib.svg\n.. |pypi-status| image::
https://img.shields.io/pypi/status/aiosmtplib.svg\n.. |pypi-license| image::
https://img.shields.io/pypi/l/aiosmtplib.svg\n.. |codecov| image::
https://codecov.io/gh/cole/aiosmtplib/branch/main/graph/badge.svg\n
:target: https://codecov.io/gh/cole/aiosmtplib\n.. |black| image::
https://img.shields.io/badge/code%20style-black-000000.svg\n :target:
https://github.com/ambv/black\n :alt: "Code style: black"\n..
|downloads| image:: https://pepy.tech/badge/aiosmtplib\n
:target: https://pepy.tech/project/aiosmtplib\n :alt:
"aiosmtplib on pypy.tech"\n.. _Read The Docs:
https://aiosmtplib.readthedocs.io/en/stable/overview.html\n',
'author': 'Cole Maclean',
'author_email': '[email protected]',
'maintainer': None,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/aiosmtplib-1.1.4/tests/conftest.py
new/aiosmtplib-1.1.5/tests/conftest.py
--- old/aiosmtplib-1.1.4/tests/conftest.py 2020-09-12 19:19:34.879263400
+0200
+++ new/aiosmtplib-1.1.5/tests/conftest.py 2021-04-25 19:31:01.233004600
+0200
@@ -110,8 +110,7 @@
@pytest.fixture(scope="session")
def bind_address(request):
- """Server side address for socket binding
- """
+ """Server side address for socket binding"""
return request.config.getoption("--bind-addr")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/aiosmtplib-1.1.4/tests/test_auth.py
new/aiosmtplib-1.1.5/tests/test_auth.py
--- old/aiosmtplib-1.1.4/tests/test_auth.py 2020-09-12 19:19:34.887263500
+0200
+++ new/aiosmtplib-1.1.5/tests/test_auth.py 2021-04-25 19:31:01.233004600
+0200
@@ -93,8 +93,8 @@
@pytest.mark.parametrize(
"username,password",
- [("test", "test"), ("admin124", "$3cr3t$")],
- ids=["test user", "admin user"],
+ [("test", "test"), ("admin124", "$3cr3t$"), ("f????", "b??r???")],
+ ids=["test user", "admin user", "utf-8 user"],
)
async def test_auth_plain_success(mock_auth, username, password):
"""
@@ -104,11 +104,24 @@
await mock_auth.auth_plain(username, password)
b64data = base64.b64encode(
- b"\0" + username.encode("ascii") + b"\0" + password.encode("ascii")
+ b"\0" + username.encode("utf-8") + b"\0" + password.encode("utf-8")
)
assert mock_auth.received_commands == [b"AUTH PLAIN " + b64data]
+async def test_auth_plain_success_bytes(mock_auth):
+ """
+ Check that auth_plain base64 encodes the username/password when given as
bytes.
+ """
+ username = "????????????".encode("tis-620")
+ password = "?????????".encode("tis-620")
+ mock_auth.responses.append(SUCCESS_RESPONSE)
+ await mock_auth.auth_plain(username, password)
+
+ b64data = base64.b64encode(b"\0" + username + b"\0" + password)
+ assert mock_auth.received_commands == [b"AUTH PLAIN " + b64data]
+
+
async def test_auth_plain_error(mock_auth):
mock_auth.responses.append(FAILURE_RESPONSE)
@@ -118,16 +131,30 @@
@pytest.mark.parametrize(
"username,password",
- [("test", "test"), ("admin124", "$3cr3t$")],
- ids=["test user", "admin user"],
+ [("test", "test"), ("admin124", "$3cr3t$"), ("f????", "b??r???")],
+ ids=["test user", "admin user", "utf-8 user"],
)
async def test_auth_login_success(mock_auth, username, password):
continue_response = (SMTPStatus.auth_continue, "VXNlcm5hbWU6")
mock_auth.responses.extend([continue_response, SUCCESS_RESPONSE])
await mock_auth.auth_login(username, password)
- b64username = base64.b64encode(username.encode("ascii"))
- b64password = base64.b64encode(password.encode("ascii"))
+ b64username = base64.b64encode(username.encode("utf-8"))
+ b64password = base64.b64encode(password.encode("utf-8"))
+
+ assert mock_auth.received_commands == [b"AUTH LOGIN " + b64username,
b64password]
+
+
+async def test_auth_login_success_bytes(mock_auth):
+ continue_response = (SMTPStatus.auth_continue, "VXNlcm5hbWU6")
+ mock_auth.responses.extend([continue_response, SUCCESS_RESPONSE])
+
+ username = "????????????".encode("tis-620")
+ password = "?????????".encode("tis-620")
+ await mock_auth.auth_login(username, password)
+
+ b64username = base64.b64encode(username)
+ b64password = base64.b64encode(password)
assert mock_auth.received_commands == [b"AUTH LOGIN " + b64username,
b64password]
@@ -148,25 +175,43 @@
@pytest.mark.parametrize(
"username,password",
- [("test", "test"), ("admin124", "$3cr3t$")],
- ids=["test user", "admin user"],
+ [("test", "test"), ("admin124", "$3cr3t$"), ("f????", "b??r???")],
+ ids=["test user", "admin user", "utf-8 user"],
)
async def test_auth_crammd5_success(mock_auth, username, password):
continue_response = (
SMTPStatus.auth_continue,
- base64.b64encode(b"secretteststring").decode("ascii"),
+ base64.b64encode(b"secretteststring").decode("utf-8"),
)
mock_auth.responses.extend([continue_response, SUCCESS_RESPONSE])
await mock_auth.auth_crammd5(username, password)
- password_bytes = password.encode("ascii")
- username_bytes = username.encode("ascii")
- response_bytes = continue_response[1].encode("ascii")
+ password_bytes = password.encode("utf-8")
+ username_bytes = username.encode("utf-8")
+ response_bytes = continue_response[1].encode("utf-8")
expected_command = crammd5_verify(username_bytes, password_bytes,
response_bytes)
assert mock_auth.received_commands == [b"AUTH CRAM-MD5", expected_command]
+
+async def test_auth_crammd5_success_bytes(mock_auth):
+ continue_response = (
+ SMTPStatus.auth_continue,
+ base64.b64encode(b"secretteststring").decode("utf-8"),
+ )
+ mock_auth.responses.extend([continue_response, SUCCESS_RESPONSE])
+
+ username = "????????????".encode("tis-620")
+ password = "?????????".encode("tis-620")
+ await mock_auth.auth_crammd5(username, password)
+
+ response_bytes = continue_response[1].encode("utf-8")
+
+ expected_command = crammd5_verify(username, password, response_bytes)
+
+ assert mock_auth.received_commands == [b"AUTH CRAM-MD5", expected_command]
+
async def test_auth_crammd5_initial_error(mock_auth):
mock_auth.responses.append(FAILURE_RESPONSE)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/aiosmtplib-1.1.4/tests/test_live.py
new/aiosmtplib-1.1.5/tests/test_live.py
--- old/aiosmtplib-1.1.4/tests/test_live.py 2020-09-12 19:19:34.907263500
+0200
+++ new/aiosmtplib-1.1.5/tests/test_live.py 2021-04-25 19:31:01.237004500
+0200
@@ -8,7 +8,13 @@
import pytest
-from aiosmtplib import SMTP, SMTPAuthenticationError, SMTPStatus, send
+from aiosmtplib import (
+ SMTP,
+ SMTPAuthenticationError,
+ SMTPSenderRefused,
+ SMTPStatus,
+ send,
+)
pytestmark = [
@@ -35,7 +41,6 @@
await client.login("test", "test")
[email protected]()
async def test_qq_login():
client = SMTP(hostname="smtp.qq.com", port=587, use_tls=False)
await client.connect(timeout=2.0)
@@ -62,3 +67,18 @@
password="test",
username="test",
)
+
+
+async def test_office365_skip_login():
+ message = EmailMessage()
+ message["From"] = "[email protected]"
+ message["To"] = "[email protected]"
+ message["Subject"] = "Hello World!"
+ message.set_content("Sent via aiosmtplib")
+
+ smtp_client = SMTP("smtp.office365.com", 587)
+ await smtp_client.connect()
+ await smtp_client.starttls()
+ # skip login, which is required
+ with pytest.raises(SMTPSenderRefused):
+ await smtp_client.send_message(message)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/aiosmtplib-1.1.4/tests/test_tls.py
new/aiosmtplib-1.1.5/tests/test_tls.py
--- old/aiosmtplib-1.1.4/tests/test_tls.py 2020-09-12 19:19:34.923263300
+0200
+++ new/aiosmtplib-1.1.5/tests/test_tls.py 2021-04-25 19:31:01.237004500
+0200
@@ -269,4 +269,4 @@
with pytest.raises(SMTPConnectError) as exception_info:
await tls_smtp_client.connect(validate_certs=True)
- assert "CERTIFICATE_VERIFY_FAILED" in str(exception_info.value)
+ assert "CERTIFICATE" in str(exception_info.value).upper()