diff --git a/packages/emails/templates/organizer-add-guests-email.ts b/packages/emails/templates/organizer-add-guests-email.ts index 6aac64614c..551a63988f 100644 --- a/packages/emails/templates/organizer-add-guests-email.ts +++ b/packages/emails/templates/organizer-add-guests-email.ts @@ -19,7 +19,8 @@ export default class OrganizerAddGuestsEmail extends OrganizerScheduledEmail { to: toAddresses.join(","), ...getReplyToHeader( this.calEvent, - this.calEvent.attendees.map(({ email }) => email) + this.calEvent.attendees.map(({ email }) => email), + true ), subject: `${this.t("guests_added_event_type_subject", { eventType: this.calEvent.type, diff --git a/packages/emails/templates/organizer-daily-video-download-recording-email.ts b/packages/emails/templates/organizer-daily-video-download-recording-email.ts index 9472b31ffa..e8db532ee6 100644 --- a/packages/emails/templates/organizer-daily-video-download-recording-email.ts +++ b/packages/emails/templates/organizer-daily-video-download-recording-email.ts @@ -26,7 +26,8 @@ export default class OrganizerDailyVideoDownloadRecordingEmail extends BaseEmail from: `${EMAIL_FROM_NAME} <${this.getMailerOptions().from}>`, ...getReplyToHeader( this.calEvent, - this.calEvent.attendees.map(({ email }) => email) + this.calEvent.attendees.map(({ email }) => email), + true ), subject: `${this.t("download_recording_subject", { title: this.calEvent.title, diff --git a/packages/emails/templates/organizer-daily-video-download-transcript-email.ts b/packages/emails/templates/organizer-daily-video-download-transcript-email.ts index 854ca60de2..c17b029032 100644 --- a/packages/emails/templates/organizer-daily-video-download-transcript-email.ts +++ b/packages/emails/templates/organizer-daily-video-download-transcript-email.ts @@ -38,7 +38,8 @@ export default class OrganizerDailyVideoDownloadTranscriptEmail extends BaseEmai from: `${EMAIL_FROM_NAME} <${this.getMailerOptions().from}>`, ...getReplyToHeader( this.calEvent, - this.calEvent.attendees.map(({ email }) => email) + this.calEvent.attendees.map(({ email }) => email), + true ), subject: `${this.t("download_transcript_email_subject", { title: this.calEvent.title, diff --git a/packages/emails/templates/organizer-location-change-email.ts b/packages/emails/templates/organizer-location-change-email.ts index fe6ccf1521..4724587801 100644 --- a/packages/emails/templates/organizer-location-change-email.ts +++ b/packages/emails/templates/organizer-location-change-email.ts @@ -19,7 +19,8 @@ export default class OrganizerLocationChangeEmail extends OrganizerScheduledEmai to: toAddresses.join(","), ...getReplyToHeader( this.calEvent, - this.calEvent.attendees.map(({ email }) => email) + this.calEvent.attendees.map(({ email }) => email), + true ), subject: `${this.t("location_changed_event_type_subject", { eventType: this.calEvent.type, diff --git a/packages/emails/templates/organizer-request-email.ts b/packages/emails/templates/organizer-request-email.ts index 8d20987b37..d17040035c 100644 --- a/packages/emails/templates/organizer-request-email.ts +++ b/packages/emails/templates/organizer-request-email.ts @@ -24,7 +24,8 @@ export default class OrganizerRequestEmail extends OrganizerScheduledEmail { to: toAddresses.join(","), ...getReplyToHeader( this.calEvent, - this.calEvent.attendees.map(({ email }) => email) + this.calEvent.attendees.map(({ email }) => email), + true ), subject: `${this.t("awaiting_approval")}: ${this.calEvent.title}`, html: await this.getHtmlRequestEmail(template, this.calEvent, this.calEvent.organizer), diff --git a/packages/emails/templates/organizer-request-reminder-email.ts b/packages/emails/templates/organizer-request-reminder-email.ts index c7b6392441..12f48d3815 100644 --- a/packages/emails/templates/organizer-request-reminder-email.ts +++ b/packages/emails/templates/organizer-request-reminder-email.ts @@ -13,7 +13,8 @@ export default class OrganizerRequestReminderEmail extends OrganizerRequestEmail to: toAddresses.join(","), ...getReplyToHeader( this.calEvent, - this.calEvent.attendees.map(({ email }) => email) + this.calEvent.attendees.map(({ email }) => email), + true ), subject: `${this.t("event_awaiting_approval_subject", { title: this.calEvent.title, diff --git a/packages/emails/templates/organizer-rescheduled-email.ts b/packages/emails/templates/organizer-rescheduled-email.ts index e6cff8828b..6456cd3e5b 100644 --- a/packages/emails/templates/organizer-rescheduled-email.ts +++ b/packages/emails/templates/organizer-rescheduled-email.ts @@ -19,7 +19,8 @@ export default class OrganizerRescheduledEmail extends OrganizerScheduledEmail { to: toAddresses.join(","), ...getReplyToHeader( this.calEvent, - this.calEvent.attendees.map(({ email }) => email) + this.calEvent.attendees.map(({ email }) => email), + true ), subject: `${this.calEvent.organizer.language.translate("event_type_has_been_rescheduled_on_time_date", { title: this.calEvent.title, diff --git a/packages/emails/templates/organizer-scheduled-email.ts b/packages/emails/templates/organizer-scheduled-email.ts index c346597de7..88f201e030 100644 --- a/packages/emails/templates/organizer-scheduled-email.ts +++ b/packages/emails/templates/organizer-scheduled-email.ts @@ -52,7 +52,8 @@ export default class OrganizerScheduledEmail extends BaseEmail { to: toAddresses.join(","), ...getReplyToHeader( this.calEvent, - this.calEvent.attendees.map(({ email }) => email) + this.calEvent.attendees.map(({ email }) => email), + true ), subject: `${this.newSeat ? `${this.t("new_attendee")}: ` : ""}${this.calEvent.title}`, html: await this.getHtml( diff --git a/packages/lib/getReplyToEmail.ts b/packages/lib/getReplyToEmail.ts index 67b430e302..3331d14c57 100644 --- a/packages/lib/getReplyToEmail.ts +++ b/packages/lib/getReplyToEmail.ts @@ -3,6 +3,17 @@ import type { CalendarEvent } from "@calcom/types/Calendar"; /** * Returns the reply-to email address to use, with fallback to organizer's email */ -export const getReplyToEmail = (calEvent: Pick) => { - return calEvent.customReplyToEmail || calEvent.organizer.email; +export const getReplyToEmail = ( + calEvent: Pick, + excludeOrganizerEmail?: boolean +) => { + if (calEvent.customReplyToEmail) { + return calEvent.customReplyToEmail; + } + + if (excludeOrganizerEmail) { + return null; + } + + return calEvent.organizer.email; }; diff --git a/packages/lib/getReplyToHeader.ts b/packages/lib/getReplyToHeader.ts index c32073844b..22b3425e3e 100644 --- a/packages/lib/getReplyToHeader.ts +++ b/packages/lib/getReplyToHeader.ts @@ -2,15 +2,32 @@ import type { CalendarEvent } from "@calcom/types/Calendar"; import { getReplyToEmail } from "./getReplyToEmail"; -export function getReplyToHeader(calEvent: CalendarEvent, additionalEmails?: string | string[]) { +export function getReplyToHeader( + calEvent: CalendarEvent, + additionalEmails?: string | string[], + excludeOrganizerEmail?: boolean +) { if (calEvent.hideOrganizerEmail) return {}; - const replyToEmail = getReplyToEmail(calEvent); - const replyTo = additionalEmails - ? Array.isArray(additionalEmails) - ? [...additionalEmails, replyToEmail] - : [additionalEmails, replyToEmail] - : replyToEmail; + 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.length === 1 ? emailArray[0] : emailArray; return { replyTo }; }