From 083858483fb8fb5386e527e6976950d042f73f11 Mon Sep 17 00:00:00 2001 From: HENRY Florian Date: Fri, 19 Aug 2022 10:10:06 +0200 Subject: [PATCH] feat: STARTTLS authentication for IMAP (#17683) Co-authored-by: phot0n (cherry picked from commit 11a17d38679ce03983e307fb7fecd0d5540ac05d) --- .../doctype/email_account/email_account.json | 11 ++++++++- .../doctype/email_account/email_account.py | 3 +++ .../doctype/email_domain/email_domain.json | 10 +++++++- .../doctype/email_domain/email_domain.py | 5 +++- .../doctype/email_domain/test_email_domain.py | 1 + frappe/email/receive.py | 3 +++ frappe/translations/fr.csv | 23 +++++++++++++++---- 7 files changed, 49 insertions(+), 7 deletions(-) diff --git a/frappe/email/doctype/email_account/email_account.json b/frappe/email/doctype/email_account/email_account.json index 7b27059843..6ca5e289df 100644 --- a/frappe/email/doctype/email_account/email_account.json +++ b/frappe/email/doctype/email_account/email_account.json @@ -29,6 +29,7 @@ "default_incoming", "use_imap", "use_ssl", + "use_starttls", "email_server", "incoming_port", "column_break_18", @@ -601,12 +602,20 @@ "fieldtype": "Select", "label": "Method", "options": "Basic\nOAuth" + }, + { + "default": "0", + "depends_on": "eval:!doc.domain && doc.enable_incoming && doc.use_imap && !doc.use_ssl", + "fetch_from": "domain.use_starttls", + "fieldname": "use_starttls", + "fieldtype": "Check", + "label": "Use STARTTLS" } ], "icon": "fa fa-inbox", "index_web_pages_for_search": 1, "links": [], - "modified": "2022-08-10 13:05:45.445572", + "modified": "2022-08-16 13:05:45.445572", "modified_by": "Administrator", "module": "Email", "name": "Email Account", diff --git a/frappe/email/doctype/email_account/email_account.py b/frappe/email/doctype/email_account/email_account.py index c1ed170b6a..15eba0faa5 100755 --- a/frappe/email/doctype/email_account/email_account.py +++ b/frappe/email/doctype/email_account/email_account.py @@ -82,6 +82,7 @@ class EmailAccount(Document): return use_oauth = self.auth_method == "OAuth" + self.use_starttls = cint(self.use_imap and self.use_starttls and not self.use_ssl) if getattr(self, "service", "") != "GMail" and use_oauth: self.auth_method = "Basic" @@ -187,6 +188,7 @@ class EmailAccount(Document): "use_imap", "email_server", "use_ssl", + "use_starttls", "smtp_server", "use_tls", "smtp_port", @@ -209,6 +211,7 @@ class EmailAccount(Document): "email_account": self.name, "host": self.email_server, "use_ssl": self.use_ssl, + "use_starttls": self.use_starttls, "username": getattr(self, "login_id", None) or self.email_id, "service": getattr(self, "service", ""), "use_imap": self.use_imap, diff --git a/frappe/email/doctype/email_domain/email_domain.json b/frappe/email/doctype/email_domain/email_domain.json index 71ba1280e1..18635e6dae 100644 --- a/frappe/email/doctype/email_domain/email_domain.json +++ b/frappe/email/doctype/email_domain/email_domain.json @@ -12,6 +12,7 @@ "email_server", "use_imap", "use_ssl", + "use_starttls", "column_break_9", "incoming_port", "attachment_limit", @@ -60,6 +61,13 @@ "fieldtype": "Check", "label": "Use SSL" }, + { + "default": "0", + "depends_on": "eval:doc.use_imap && !doc.use_ssl", + "fieldname": "use_starttls", + "fieldtype": "Check", + "label": "Use STARTTLS" + }, { "description": "Ignore attachments over this size", "fieldname": "attachment_limit", @@ -125,7 +133,7 @@ "link_fieldname": "domain" } ], - "modified": "2022-08-10 21:20:50.692698", + "modified": "2022-08-19 12:55:06.434541", "modified_by": "Administrator", "module": "Email", "name": "Email Domain", diff --git a/frappe/email/doctype/email_domain/email_domain.py b/frappe/email/doctype/email_domain/email_domain.py index b0dbed842c..e532c87c72 100644 --- a/frappe/email/doctype/email_domain/email_domain.py +++ b/frappe/email/doctype/email_domain/email_domain.py @@ -56,6 +56,7 @@ class EmailDomain(Document): "email_server", "use_imap", "use_ssl", + "use_starttls", "use_tls", "attachment_limit", "smtp_server", @@ -76,10 +77,12 @@ class EmailDomain(Document): def validate_incoming_server_conn(self): self.incoming_port = get_port(self) - conn_method = Timed_POP3_SSL if self.use_ssl else Timed_POP3 if self.use_imap: conn_method = Timed_IMAP4_SSL if self.use_ssl else Timed_IMAP4 + else: + conn_method = Timed_POP3_SSL if self.use_ssl else Timed_POP3 + self.use_starttls = cint(self.use_imap and self.use_starttls and not self.use_ssl) incoming_conn = conn_method(self.email_server, port=self.incoming_port) incoming_conn.logout() if self.use_imap else incoming_conn.quit() diff --git a/frappe/email/doctype/email_domain/test_email_domain.py b/frappe/email/doctype/email_domain/test_email_domain.py index 55a8d620a8..5f0dd59ceb 100644 --- a/frappe/email/doctype/email_domain/test_email_domain.py +++ b/frappe/email/doctype/email_domain/test_email_domain.py @@ -33,6 +33,7 @@ class TestDomain(unittest.TestCase): # Also make sure that the other attributes match self.assertEqual(mail_account.use_imap, mail_domain.use_imap) self.assertEqual(mail_account.use_ssl, mail_domain.use_ssl) + self.assertEqual(mail_account.use_starttls, mail_domain.use_starttls) self.assertEqual(mail_account.use_tls, mail_domain.use_tls) self.assertEqual(mail_account.attachment_limit, mail_domain.attachment_limit) self.assertEqual(mail_account.smtp_server, mail_domain.smtp_server) diff --git a/frappe/email/receive.py b/frappe/email/receive.py index e26748dd07..351c14481d 100644 --- a/frappe/email/receive.py +++ b/frappe/email/receive.py @@ -100,6 +100,9 @@ class EmailServer: self.settings.host, self.settings.incoming_port, timeout=frappe.conf.get("pop_timeout") ) + if cint(self.settings.use_starttls): + self.imap.starttls() + if self.settings.use_oauth: Oauth( self.imap, diff --git a/frappe/translations/fr.csv b/frappe/translations/fr.csv index 69bc47d4f6..eb13132bfb 100644 --- a/frappe/translations/fr.csv +++ b/frappe/translations/fr.csv @@ -327,7 +327,7 @@ Active Domains,Domaines Actifs, Active Sessions,Sessions Actives, Activity Log,Journal d'Activité, Activity log of all users.,Journal d'activité de tous les utilisateurs., -Add / Manage Email Domains.,Ajouter / Gérer les Noms de Domaines des Emails, +Add / Manage Email Domains.,Ajouter / Gérer les serveurs de courriels, Add / Update,Ajouter / mettre à jour, Add A New Rule,Ajouter une Nouvelle Règle, Add Another Comment,Ajouter un Autre Commentaire, @@ -959,8 +959,8 @@ Eg. smsgateway.com/api/send_sms.cgi,Eg. smsgateway.com / api / send_sms.cgi, Email Account Name,Nom du Compte Email, Email Account added multiple times,Compte Email ajouté plusieurs fois, Email Addresses,Adresse Email, -Email Domain,Nom de Domaine Email, -"Email Domain not configured for this account, Create one?","Nom de Domain de l'Email non configuré pour ce compte, En créer un ?", +Email Domain,Serveur de courriels, +"Email Domain not configured for this account, Create one?","Serveur de courriels non configuré pour ce compte, En créer un ?", Email Flag Queue,Liste d'Attente des d'Emails Marqués, Email Footer Address,Pied de Page Email, Email Group,Groupe Email, @@ -3619,7 +3619,7 @@ Upload {0} files,Télécharger des fichiers {0}, Uploaded To Google Drive,Téléchargé sur Google Drive, Uploaded successfully,Envoyé avec succès, Uploading {0} of {1},Téléchargement de {0} sur {1}, -Use SSL for Outgoing,Utiliser SSL pour les sorties, +Use SSL,Utiliser SSL Use Same Name,Utiliser le même nom, Used For Google Maps Integration.,Utilisé pour l'intégration de Google Maps., User ID Property,Propriété ID utilisateur, @@ -4726,3 +4726,18 @@ Always use this email address as sender address,Toujours utiliser cet email comm Always use this name as sender name,Toujours utiliser ce nom comme expediteur Login to {0},Se connecter à {0} Add / Remove Fields,Ajouter / Supprimer des colonnes +Use STARTTLS,Utiliser le STARTTLS +Outgoing Settings,Configurations des Courriels Sortant +Incoming Settings,Configurations des Courriels Entrant +Incoming Server,Serveur de Courriel Entrant +Outgoing Server,Serveur de Courriel Sortant +Use different Email ID,Utiliser une authentification email différente +Alternative Email ID,Email de connexion alternatif +Incoming (POP/IMAP) Settings,Configuration POP/IMAP +IMAP Details,Détails IMAP +IMAP Folder,Dossier IMAP à récupérer +Document Linking,Lien vers les documents +Auto Reply,Réponse automatique +Footer Content,Contenue du pied de page +Brand Logo,Logo de la marque +Folder Name,Nom du dossier