From 26ea249481281db5b86b5963daeb7aeb74a71fef Mon Sep 17 00:00:00 2001 From: Nafees Nazik <84864519+G3root@users.noreply.github.com> Date: Fri, 3 Mar 2023 22:05:11 +0530 Subject: [PATCH] Fix: email encoding bug (#7490) * fix: existing decode Uri * feat: unescape characters in base email * fix: encoding in booking page --- apps/web/components/booking/BookingListItem.tsx | 6 ++++-- packages/emails/templates/_base-email.ts | 11 ++++++++++- packages/emails/templates/attendee-scheduled-email.ts | 2 +- .../emails/templates/organizer-scheduled-email.ts | 4 +--- 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/apps/web/components/booking/BookingListItem.tsx b/apps/web/components/booking/BookingListItem.tsx index 01086f7dfa..01a775fbb9 100644 --- a/apps/web/components/booking/BookingListItem.tsx +++ b/apps/web/components/booking/BookingListItem.tsx @@ -223,6 +223,8 @@ function BookingListItem(booking: BookingItemProps) { }; const showRecordingsButtons = (booking.location === "integrations:daily" || booking?.location?.trim() === "") && isPast && isConfirmed; + + const title = decodeURIComponent(booking.title); return ( <>
- {booking.title} + {title} {!!booking?.eventType?.price && !booking.paid && ( diff --git a/packages/emails/templates/_base-email.ts b/packages/emails/templates/_base-email.ts index 770617b8e7..9d25a8cde5 100644 --- a/packages/emails/templates/_base-email.ts +++ b/packages/emails/templates/_base-email.ts @@ -1,4 +1,5 @@ import nodemailer from "nodemailer"; +import { z } from "zod"; import type { Dayjs } from "@calcom/dayjs"; import dayjs from "@calcom/dayjs"; @@ -34,10 +35,18 @@ export default class BaseEmail { console.log("Skipped Sending Email as NEXT_PUBLIC_IS_E2E==1"); return new Promise((r) => r("Skipped sendEmail for E2E")); } + + const payload = this.getNodeMailerPayload(); + const parseSubject = z.string().safeParse(payload?.subject); + const payloadWithUnEscapedSubject = { + ...payload, + ...(parseSubject.success && { subject: decodeURIComponent(parseSubject.data) }), + }; + new Promise((resolve, reject) => nodemailer .createTransport(this.getMailerOptions().transport) - .sendMail(this.getNodeMailerPayload(), (_err, info) => { + .sendMail(payloadWithUnEscapedSubject, (_err, info) => { if (_err) { const err = getErrorFromUnknown(_err); this.printNodeMailerError(err); diff --git a/packages/emails/templates/attendee-scheduled-email.ts b/packages/emails/templates/attendee-scheduled-email.ts index 610b3db54e..e7477540df 100644 --- a/packages/emails/templates/attendee-scheduled-email.ts +++ b/packages/emails/templates/attendee-scheduled-email.ts @@ -78,7 +78,7 @@ export default class AttendeeScheduledEmail extends BaseEmail { to: `${this.attendee.name} <${this.attendee.email}>`, from: `${this.calEvent.organizer.name} <${this.getMailerOptions().from}>`, replyTo: [...this.calEvent.attendees.map(({ email }) => email), this.calEvent.organizer.email], - subject: decodeURIComponent(`${this.calEvent.title}`), + subject: `${this.calEvent.title}`, html: renderEmail("AttendeeScheduledEmail", { calEvent: this.calEvent, attendee: this.attendee, diff --git a/packages/emails/templates/organizer-scheduled-email.ts b/packages/emails/templates/organizer-scheduled-email.ts index dbd91140f7..eeaa55134d 100644 --- a/packages/emails/templates/organizer-scheduled-email.ts +++ b/packages/emails/templates/organizer-scheduled-email.ts @@ -76,9 +76,7 @@ export default class OrganizerScheduledEmail extends BaseEmail { }, from: `${APP_NAME} <${this.getMailerOptions().from}>`, to: toAddresses.join(","), - subject: decodeURIComponent( - `${this.newSeat ? this.t("new_attendee") + ":" : ""} ${this.calEvent.title}` - ), + subject: `${this.newSeat ? this.t("new_attendee") + ":" : ""} ${this.calEvent.title}`, html: renderEmail("OrganizerScheduledEmail", { calEvent: this.calEvent, attendee: this.calEvent.organizer,