fix: Show custom message for invalid login credentials
This commit is contained in:
parent
5a84c1fc94
commit
aef8ecc7ef
3 changed files with 44 additions and 26 deletions
|
|
@ -148,7 +148,7 @@ class EmailAccount(Document):
|
|||
return None
|
||||
|
||||
args = frappe._dict({
|
||||
"email_account":self.name,
|
||||
"email_account": self.name,
|
||||
"host": self.email_server,
|
||||
"use_ssl": self.use_ssl,
|
||||
"username": getattr(self, "login_id", None) or self.email_id,
|
||||
|
|
@ -166,21 +166,46 @@ class EmailAccount(Document):
|
|||
frappe.throw(_("{0} is required").format("Email Server"))
|
||||
|
||||
email_server = EmailServer(frappe._dict(args))
|
||||
self.check_email_server_connection(email_server, in_receive)
|
||||
|
||||
if not in_receive and self.use_imap:
|
||||
email_server.imap.logout()
|
||||
|
||||
# reset failed attempts count
|
||||
self.set_failed_attempts_count(0)
|
||||
|
||||
return email_server
|
||||
|
||||
@classmethod
|
||||
def check_email_server_connection(cls, email_server, in_receive):
|
||||
# tries to connect to email server and handles failure
|
||||
try:
|
||||
email_server.connect()
|
||||
except (error_proto, imaplib.IMAP4.error) as e:
|
||||
e = cstr(e)
|
||||
message = e.lower().replace(" ","")
|
||||
if in_receive and any(map(lambda t: t in message, ['authenticationfailed', 'loginviayourwebbrowser', #abbreviated to work with both failure and failed
|
||||
'loginfailed', 'err[auth]', 'errtemporaryerror'])): #temporary error to deal with godaddy
|
||||
# if called via self.receive and it leads to authentication error, disable incoming
|
||||
# and send email to system manager
|
||||
self.handle_incoming_connect_error(
|
||||
description=_('Authentication failed while receiving emails from Email Account {0}. Message from server: {1}').format(self.name, e)
|
||||
)
|
||||
message = cstr(e).lower().replace(" ","")
|
||||
auth_error_codes = [
|
||||
'authenticationfailed',
|
||||
'loginfailed',
|
||||
]
|
||||
|
||||
other_error_codes = [
|
||||
'err[auth]',
|
||||
'errtemporaryerror',
|
||||
'loginviayourwebbrowser'
|
||||
]
|
||||
|
||||
all_error_codes = auth_error_codes + other_error_codes
|
||||
|
||||
if in_receive and any(map(lambda t: t in message, all_error_codes)):
|
||||
# if called via self.receive and it leads to authentication error,
|
||||
# disable incoming and send email to System Manager
|
||||
error_message = _('Authentication failed while receiving emails from Email Account {0}.').format(self.name)
|
||||
error_message += "<br>" + _('Message from server: {0}').format(cstr(e))
|
||||
self.handle_incoming_connect_error(description=error_message)
|
||||
return None
|
||||
|
||||
elif not in_receive and any(map(lambda t: t in message, auth_error_codes)):
|
||||
cls.throw_invalid_credentials_exception()
|
||||
else:
|
||||
frappe.throw(e)
|
||||
|
||||
|
|
@ -195,16 +220,16 @@ class EmailAccount(Document):
|
|||
else:
|
||||
frappe.cache().set_value("workers:no-internet", True)
|
||||
return None
|
||||
|
||||
else:
|
||||
raise
|
||||
if not in_receive:
|
||||
if self.use_imap:
|
||||
email_server.imap.logout()
|
||||
# reset failed attempts count
|
||||
self.set_failed_attempts_count(0)
|
||||
|
||||
return email_server
|
||||
@classmethod
|
||||
def throw_invalid_credentials_exception(cls):
|
||||
frappe.throw(
|
||||
_("Incorrect email or password. Please check your login credentials."),
|
||||
exc=frappe.ValidationError,
|
||||
title=_("Invalid Credentials")
|
||||
)
|
||||
|
||||
def handle_incoming_connect_error(self, description):
|
||||
if test_internet():
|
||||
|
|
|
|||
|
|
@ -59,10 +59,6 @@ class EmailServer:
|
|||
frappe.msgprint(_('Invalid Mail Server. Please rectify and try again.'))
|
||||
raise
|
||||
|
||||
except Exception as e:
|
||||
frappe.msgprint(_('Cannot connect: {0}').format(str(e)))
|
||||
raise
|
||||
|
||||
def connect_pop(self):
|
||||
#this method return pop connection
|
||||
try:
|
||||
|
|
|
|||
|
|
@ -242,11 +242,8 @@ class SMTPServer:
|
|||
return self._sess
|
||||
|
||||
except smtplib.SMTPAuthenticationError as e:
|
||||
frappe.throw(
|
||||
_("Incorrect email or password. Please check your login credentials."),
|
||||
exc=frappe.ValidationError,
|
||||
title=_("Invalid Credentials")
|
||||
)
|
||||
from frappe.email.doctype.email_account.email_account import EmailAccount
|
||||
EmailAccount.throw_invalid_credentials_exception()
|
||||
|
||||
except _socket.error as e:
|
||||
# Invalid mail server -- due to refusing connection
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue