From 176037d0afbe572f870a3c702985e7cd83fe6c0c Mon Sep 17 00:00:00 2001 From: Anirban Singha <143536290+SinghaAnirban005@users.noreply.github.com> Date: Sat, 8 Aug 2026 22:43:42 +0530 Subject: [PATCH] fix(emails): customReplyToEmail no longer dropped when hideOrganizerEmail is true (#29940) * fix: respect customReplyToEmail when hideOrganizerEmail is enabled * test: get custom reply to in headers --- packages/lib/getReplyToHeader.test.ts | 23 +++++++++++--- packages/lib/getReplyToHeader.ts | 46 +++++++++++---------------- 2 files changed, 36 insertions(+), 33 deletions(-) diff --git a/packages/lib/getReplyToHeader.test.ts b/packages/lib/getReplyToHeader.test.ts index 0b558d948a..dfe6f3b3b6 100644 --- a/packages/lib/getReplyToHeader.test.ts +++ b/packages/lib/getReplyToHeader.test.ts @@ -8,11 +8,12 @@ import { getReplyToHeader } from "./getReplyToHeader"; * Spec: https://datatracker.ietf.org/doc/html/rfc5322#section-3.6.2 */ -vi.mock("./getReplyToEmail", () => ({ - getReplyToEmail: vi.fn((calEvent, excludeOrganizerEmail) => { - if (excludeOrganizerEmail) return null; - return calEvent.organizer?.email || null; - }), +vi.mock("./getReplyToEmail", () => ({ + getReplyToEmail: vi.fn((calEvent, excludeOrganizerEmail) => { + if (calEvent.customReplyToEmail) return calEvent.customReplyToEmail; + if (excludeOrganizerEmail) return null; + return calEvent.organizer?.email || null; + }), })); const createMockCalEvent = (organizerEmail: string) => ({ @@ -89,4 +90,16 @@ describe("getReplyToHeader", () => { expect(result.replyTo).not.toContain("]"); }); }); + + describe("with hideOrganizerEmail and customReplyToEmail", () => { + it("uses customReplyToEmail even when hideOrganizerEmail is true", () => { + const calEvent = { + organizer: { email: "org@test.com" }, + hideOrganizerEmail: true, + customReplyToEmail: "custom@test.com", + }; + const result = getReplyToHeader(calEvent as any, undefined, true); + expect(result).toEqual({ replyTo: "custom@test.com" }); + }); +}); }); diff --git a/packages/lib/getReplyToHeader.ts b/packages/lib/getReplyToHeader.ts index f9dc8439f5..d1cca9ab73 100644 --- a/packages/lib/getReplyToHeader.ts +++ b/packages/lib/getReplyToHeader.ts @@ -2,32 +2,22 @@ import type { CalendarEvent } from "@calcom/types/Calendar"; import { getReplyToEmail } from "./getReplyToEmail"; -export function getReplyToHeader( - calEvent: CalendarEvent, - additionalEmails?: string | string[], - excludeOrganizerEmail?: boolean -) { - if (calEvent.hideOrganizerEmail) return {}; - - const replyToEmail = getReplyToEmail(calEvent, excludeOrganizerEmail); - const emailArray: string[] = []; - - if (additionalEmails) { - if (Array.isArray(additionalEmails)) { - emailArray.push(...additionalEmails); - } else { - emailArray.push(additionalEmails); - } - } - - if (replyToEmail) { - emailArray.push(replyToEmail); - } - - if (emailArray.length === 0) { - return {}; - } - - const replyTo = emailArray.join(", "); - return { replyTo }; +export function getReplyToHeader( + calEvent: CalendarEvent, + additionalEmails?: string | string[], + excludeOrganizerEmail?: boolean +) { + const shouldExcludeOrganizer = excludeOrganizerEmail || calEvent.hideOrganizerEmail; + const replyToEmail = getReplyToEmail(calEvent, shouldExcludeOrganizer); + + const emailArray: string[] = []; + if (additionalEmails) { + Array.isArray(additionalEmails) ? emailArray.push(...additionalEmails) : emailArray.push(additionalEmails); + } + if (replyToEmail) { + emailArray.push(replyToEmail); + } + if (emailArray.length === 0) return {}; + + return { replyTo: emailArray.join(", ") }; }