diff --git a/frappe/__init__.py b/frappe/__init__.py index 5be47fa47f..cdce7629eb 100644 --- a/frappe/__init__.py +++ b/frappe/__init__.py @@ -13,7 +13,7 @@ import os, sys, importlib, inspect, json from .exceptions import * from .utils.jinja import get_jenv, get_template, render_template -__version__ = '8.0.62' +__version__ = '8.0.63' __title__ = "Frappe Framework" local = Local() diff --git a/frappe/email/queue.py b/frappe/email/queue.py index c153a3cec6..23a549d6e2 100755 --- a/frappe/email/queue.py +++ b/frappe/email/queue.py @@ -456,10 +456,22 @@ def prepare_message(email, recipient, recipients_list): def clear_outbox(): """Remove low priority older than 31 days in Outbox and expire mails not sent for 7 days. - - Called daily via scheduler.""" - frappe.db.sql("""delete q, r from `tabEmail Queue` as q, `tabEmail Queue Recipient` as r where q.name = r.parent and q.priority=0 and - datediff(now(), q.modified) > 31""") - - frappe.db.sql("""update `tabEmail Queue` as q, `tabEmail Queue Recipient` as r set q.status='Expired', r.status='Expired' - where q.name = r.parent and datediff(curdate(), q.modified) > 7 and q.status='Not Sent' and r.status='Not Sent'""") + Called daily via scheduler. + Note: Used separate query to avoid deadlock + """ + + email_queues = frappe.db.sql_list("""select name from `tabEmail Queue` + where priority=0 and datediff(now(), modified) > 31""") + + if email_queues: + frappe.db.sql("""delete from `tabEmail Queue` where name in (%s)""" + % ','.join(['%s']*len(email_queues)), tuple(email_queues)) + + frappe.db.sql("""delete from `tabEmail Queue Recipient` where parent in (%s)""" + % ','.join(['%s']*len(email_queues)), tuple(email_queues)) + + for dt in ("Email Queue", "Email Queue Recipient"): + frappe.db.sql(""" + update `tab{0}` + set status='Expired' + where datediff(curdate(), modified) > 7 and status='Not Sent'""".format(dt)) \ No newline at end of file diff --git a/frappe/email/receive.py b/frappe/email/receive.py index 33aa9c2d0b..0ff632771e 100644 --- a/frappe/email/receive.py +++ b/frappe/email/receive.py @@ -174,7 +174,9 @@ class EmailServer: email_list = [] self.check_imap_uidvalidity() - self.imap.select("Inbox", readonly=True) + readonly = False if self.settings.email_sync_rule == "UNSEEN" else True + + self.imap.select("Inbox", readonly=readonly) response, message = self.imap.uid('search', None, self.settings.email_sync_rule) if message[0]: email_list = message[0].split() @@ -261,14 +263,16 @@ class EmailServer: if not cint(self.settings.use_imap): self.pop.dele(msg_num) else: - # mark as seen - self.imap.uid('STORE', message_meta, '+FLAGS', '(\\SEEN)') + # mark as seen if email sync rule is UNSEEN (syncing only unseen mails) + if self.settings.email_sync_rule == "UNSEEN": + self.imap.uid('STORE', message_meta, '+FLAGS', '(\\SEEN)') else: if not cint(self.settings.use_imap): self.pop.dele(msg_num) else: - # mark as seen - self.imap.uid('STORE', message_meta, '+FLAGS', '(\\SEEN)') + # mark as seen if email sync rule is UNSEEN (syncing only unseen mails) + if self.settings.email_sync_rule == "UNSEEN": + self.imap.uid('STORE', message_meta, '+FLAGS', '(\\SEEN)') def get_email_seen_status(self, uid, flag_string): """ parse the email FLAGS response """