From 2bbf72061c7e41f3505c1338e7b0de3c0d895bf4 Mon Sep 17 00:00:00 2001 From: sokumon Date: Fri, 11 Jul 2025 18:45:20 +0530 Subject: [PATCH] fix: dont let email queue stay in Sending status --- frappe/email/queue.py | 25 +++++++++++++++++++++++++ frappe/hooks.py | 1 + 2 files changed, 26 insertions(+) diff --git a/frappe/email/queue.py b/frappe/email/queue.py index cd6de1ff81..536ae0d680 100755 --- a/frappe/email/queue.py +++ b/frappe/email/queue.py @@ -1,5 +1,6 @@ # Copyright (c) 2022, Frappe Technologies Pvt. Ltd. and Contributors # License: MIT. See LICENSE +from datetime import timedelta import frappe from frappe import _, msgprint @@ -177,3 +178,27 @@ def get_queue(): {"now": now_datetime()}, as_dict=True, ) + + +def mark_sending_emails_as_not_sent(): + emails_in_sending = frappe.get_all( + "Email Queue", filters={"status": "Sending"}, fields=["name", "modified"] + ) + for e in emails_in_sending: + if now_datetime() - e["modified"] > timedelta(minutes=15): + update_fields = {} + email_queue = frappe.get_doc("Email Queue", e["name"]) + sent_to_atleast_one_recipient = any( + rec.recipient for rec in email_queue.recipients if rec.is_mail_sent() + ) + if email_queue.retry < cint(frappe.db.get_system_setting("email_retry_limit")) or 3: + update_fields.update( + { + "status": "Partially Sent" if sent_to_atleast_one_recipient else "Not Sent", + "retry": email_queue.retry + 1, + } + ) + else: + update_fields.update({"status": "Error"}) + update_fields.update({"error": frappe.get_traceback()}) + email_queue.update_status(**update_fields, commit=True) diff --git a/frappe/hooks.py b/frappe/hooks.py index bebb1f7e73..f6458378d5 100644 --- a/frappe/hooks.py +++ b/frappe/hooks.py @@ -217,6 +217,7 @@ scheduler_events = { }, "all": [ "frappe.email.queue.flush", + "frappe.email.queue.mark_sending_emails_as_not_sent", "frappe.monitor.flush", "frappe.integrations.doctype.google_calendar.google_calendar.sync", ],