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