Performs an authentication attempt using the LOGIN mechanism.

        Protocol:

            1. The username is base64-encoded ;
            2. The string 'AUTH LOGIN' and a space character are prepended to
               the base64-encoded username and sent to the server ;
            3. If the server replies with a 334 return code, we can go on:

                1) The password is base64-encoded and sent to the server ;
                2) If the server replies with a 235 return code, the user is
                   authenticated.

        Args:
            username (str): Identifier of the user trying to authenticate.
            password (str): Password for the user.

        Raises:
            ConnectionResetError: If the connection with the server is
                unexpectedely lost.
            SMTPAuthenticationError: If the authentication attempt fails.

        Returns:
            (int, str): A (code, message) 2-tuple containing the server
                response.

async def _auth_login(self, username, password):
        """
        Performs an authentication attempt using the LOGIN mechanism.

        Protocol:

            1. The username is base64-encoded ;
            2. The string 'AUTH LOGIN' and a space character are prepended to
               the base64-encoded username and sent to the server ;
            3. If the server replies with a 334 return code, we can go on:

                1) The password is base64-encoded and sent to the server ;
                2) If the server replies with a 235 return code, the user is
                   authenticated.

        Args:
            username (str): Identifier of the user trying to authenticate.
            password (str): Password for the user.

        Raises:
            ConnectionResetError: If the connection with the server is
                unexpectedely lost.
            SMTPAuthenticationError: If the authentication attempt fails.

        Returns:
            (int, str): A (code, message) 2-tuple containing the server
                response.
        """
        mechanism = "LOGIN"

        code, message = await self.do_cmd(
            "AUTH", mechanism, SMTP.b64enc(username), success=(334,)
        )

        try:
            code, message = await self.do_cmd(SMTP.b64enc(password), success=(235, 503))
        except SMTPCommandFailedError as e:
            raise SMTPAuthenticationError(e.code, e.message, mechanism)

        return code, message