From 288cdf3bf0f36e44ccaa06bf11c29dd45b13409e Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Thu, 30 Apr 2026 14:35:12 +0530 Subject: [PATCH] fix(project): use user.email for invitations and skip disabled users. (backport #54561) (#54667) fix(project): use user.email for invitations and skip disabled users. (#54561) * fix(project): use user.email for invitations and skip disabled users. * Update erpnext/projects/doctype/project/project.py * fix(project): remove duplicate loop causing indentation error * fix(project): resolve pre-commit hook failure --------- (cherry picked from commit 231dd1856fd1649ea124fb622acb8480866efb50) Co-authored-by: Hemil-Sangani Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- erpnext/projects/doctype/project/project.py | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/erpnext/projects/doctype/project/project.py b/erpnext/projects/doctype/project/project.py index 0208bf1e9d0..1c76ee19a60 100644 --- a/erpnext/projects/doctype/project/project.py +++ b/erpnext/projects/doctype/project/project.py @@ -364,13 +364,18 @@ class Project(Document): ) for user in self.users: + # process only users who haven't received the welcome email yet if user.welcome_email_sent == 0: - frappe.sendmail( - user.user, - subject=_("Project Collaboration Invitation"), - content=content, - ) - user.welcome_email_sent = 1 + # fetch canonical User data (enabled status + latest email) + user_info = frappe.db.get_value("User", user.user, ["enabled", "email"], as_dict=True) + # send email only if user is enabled and has a valid email + if user_info and user_info.enabled and user_info.email: + frappe.sendmail( + recipients=[user_info.email], + subject=_("Project Collaboration Invitation"), + content=content, + ) + user.welcome_email_sent = 1 def get_timeline_data(doctype: str, name: str) -> dict[int, int]: