diff --git a/radicale/auth/imap.py b/radicale/auth/imap.py index 18ec527b..f0d52b47 100644 --- a/radicale/auth/imap.py +++ b/radicale/auth/imap.py @@ -64,10 +64,18 @@ class Auth(auth.BaseAuth): if self._security == "starttls": connection.starttls(ssl.create_default_context()) try: - connection.authenticate( - "PLAIN", - lambda _: "{0}\x00{0}\x00{1}".format(login, password).encode(), - ) + if "AUTH=PLAIN" in connection.capabilities: + logger.debug("IMAP authentication PLAIN selected for user %r via %s:%d (security: %s)", login, self._host, self._port, self._security) + connection.authenticate( + "PLAIN", + lambda _: "{0}\x00{0}\x00{1}".format(login, password).encode(), + ) + elif "AUTH=LOGIN" in connection.capabilities: + logger.debug("IMAP authentication LOGIN selected for user %r via %s:%d (security: %s)", login, self._host, self._port, self._security) + connection.login(login, password) + else: + logger.error("IMAP server is neither supporting AUTH=PLAIN or AUTH=LOGIN: %s:%d (security: %s)", self._host, self._port, self._security) + return "" except imaplib.IMAP4.error as e: logger.warning("IMAP authentication failed for user %r: %s", login, e, exc_info=False) return ""