refactor: method to get frappe mail client instance

This commit is contained in:
s-aga-r 2024-06-24 06:16:55 +05:30
parent 2819a2d927
commit 1ada5211b9
2 changed files with 15 additions and 18 deletions

View file

@ -142,10 +142,8 @@ class EmailAccount(Document):
if not self.always_use_account_email_id_as_sender:
self.always_use_account_email_id_as_sender = 1
fm_client = FrappeMail(
self.frappe_mail_site, self.email_id, self.api_key, self.get_password("api_secret")
)
fm_client.validate(for_inbound=self.enable_incoming, for_outbound=self.enable_outgoing)
frappe_mail_client = self.get_frappe_mail_client()
frappe_mail_client.validate(for_inbound=self.enable_incoming, for_outbound=self.enable_outgoing)
if self.login_id_is_different:
if not self.login_id:
@ -519,6 +517,13 @@ class EmailAccount(Document):
config = self.sendmail_config()
return SMTPServer(**config)
def get_frappe_mail_client(self):
return self._frappe_mail_client
@functools.cached_property
def _frappe_mail_client(self):
return FrappeMail(self.frappe_mail_site, self.email_id, self.api_key, self.get_password("api_secret"))
def remove_unpicklable_values(self, state):
super().remove_unpicklable_values(state)
state.pop("_smtp_server_instance", None)
@ -611,10 +616,8 @@ class EmailAccount(Document):
try:
if self.service == "Frappe Mail":
fm_client = FrappeMail(
self.frappe_mail_site, self.email_id, self.api_key, self.get_password("api_secret")
)
messages = fm_client.pull(last_synced_at=self.last_synced_at)
frappe_mail_client = self.get_frappe_mail_client()
messages = frappe_mail_client.pull(last_synced_at=self.last_synced_at)
process_mail(messages)
self.db_set("last_synced_at", messages["last_synced_at"], update_modified=False)
else:

View file

@ -14,7 +14,6 @@ from frappe.core.utils import html2text
from frappe.database.database import savepoint
from frappe.email.doctype.email_account.email_account import EmailAccount
from frappe.email.email_body import add_attachment, get_email, get_formatted_html
from frappe.email.frappemail import FrappeMail
from frappe.email.queue import get_unsubcribed_url, get_unsubscribe_message
from frappe.email.smtp import SMTPServer
from frappe.model.document import Document
@ -160,7 +159,7 @@ class EmailQueue(Document):
return
with SendMailContext(self, smtp_server_instance) as ctx:
ctx.fetch_smtp_server()
ctx.fetch_outgoing_server()
message = None
for recipient in self.recipients:
if recipient.is_mail_sent():
@ -171,7 +170,7 @@ class EmailQueue(Document):
method(self, self.sender, recipient.recipient, message)
elif not frappe.flags.in_test or frappe.flags.testing_email:
if ctx.email_account_doc.service == "Frappe Mail":
ctx.fm_client.send(
ctx.frappe_mail_client.send(
sender=self.sender,
recipients=recipient.recipient,
message=message.decode("utf-8"),
@ -245,16 +244,11 @@ class SendMailContext:
rec.recipient for rec in self.queue_doc.recipients if rec.is_mail_sent()
)
def fetch_smtp_server(self):
def fetch_outgoing_server(self):
self.email_account_doc = self.queue_doc.get_email_account(raise_error=True)
if self.email_account_doc.service == "Frappe Mail":
site = self.email_account_doc.frappe_mail_site
mailbox = self.email_account_doc.email_id
api_key = self.email_account_doc.api_key
api_secret = self.email_account_doc.get_password("api_secret")
self.fm_client = FrappeMail(site, mailbox, api_key, api_secret)
self.frappe_mail_client = self.email_account_doc.get_frappe_mail_client()
elif not self.smtp_server:
self.smtp_server = self.email_account_doc.get_smtp_server()