From 0bd973564709317ea855b7383a9b7e29d87ddb24 Mon Sep 17 00:00:00 2001 From: CarinaWolli Date: Tue, 19 Jul 2022 15:17:57 -0400 Subject: [PATCH 1/5] add html format to email template --- .../reminders/emailReminderManager.ts | 31 ++++++++++++------- .../templates/emailReminderTemplate.ts | 16 +++++++--- .../cron/workflows/scheduleEmailReminders.ts | 27 ++++++++-------- 3 files changed, 44 insertions(+), 30 deletions(-) diff --git a/apps/web/ee/lib/workflows/reminders/emailReminderManager.ts b/apps/web/ee/lib/workflows/reminders/emailReminderManager.ts index 1d15d6254d704..cf94bfbd5c425 100644 --- a/apps/web/ee/lib/workflows/reminders/emailReminderManager.ts +++ b/apps/web/ee/lib/workflows/reminders/emailReminderManager.ts @@ -57,11 +57,17 @@ export const scheduleEmailReminder = async ( const attendeeName = action === WorkflowActions.EMAIL_HOST ? evt.attendees[0].name : evt.organizer.name; const timeZone = action === WorkflowActions.EMAIL_HOST ? evt.organizer.timeZone : evt.attendees[0].timeZone; + let emailContent = { + emailSubject, + emailBody: { + text: emailBody, + html: `${emailBody}`, + }, + }; + switch (template) { case WorkflowTemplates.REMINDER: - const emailTemplate = emailReminderTemplate(startTime, evt.title, timeZone, attendeeName, name); - emailSubject = emailTemplate.subject; - emailBody = emailTemplate.body; + emailContent = emailReminderTemplate(startTime, evt.title, timeZone, attendeeName, name); break; } @@ -70,7 +76,14 @@ export const scheduleEmailReminder = async ( triggerEvent === WorkflowTriggerEvents.EVENT_CANCELLED ) { try { - await sendWorkflowReminderEmail(evt, sendTo, emailSubject, emailBody); + await sgMail.send({ + to: sendTo, + from: senderEmail, + subject: emailContent.emailSubject, + text: emailContent.emailBody.text, + html: emailContent.emailBody.html, + batchId: batchIdResponse[1].batch_id, + }); } catch (error) { console.log("Error sending Email"); } @@ -85,13 +98,9 @@ export const scheduleEmailReminder = async ( await sgMail.send({ to: sendTo, from: senderEmail, - subject: emailSubject, - content: [ - { - type: "text/html", - value: emailBody, - }, - ], + subject: emailContent.emailSubject, + text: emailContent.emailBody.text, + html: emailContent.emailBody.text, batchId: batchIdResponse[1].batch_id, sendAt: scheduledDate.unix(), }); diff --git a/apps/web/ee/lib/workflows/reminders/templates/emailReminderTemplate.ts b/apps/web/ee/lib/workflows/reminders/templates/emailReminderTemplate.ts index 60368f797a839..513a75a0a6fdc 100644 --- a/apps/web/ee/lib/workflows/reminders/templates/emailReminderTemplate.ts +++ b/apps/web/ee/lib/workflows/reminders/templates/emailReminderTemplate.ts @@ -7,19 +7,25 @@ const emailReminderTemplate = ( attendee: string, name: string ) => { - const templateSubject = `Reminder: ${eventName} at ${dayjs(startTime) + const emailSubject = `Reminder: ${eventName} on ${dayjs(startTime) .tz(timeZone) - .format("YYYY MMM D h:mmA")}`; + .format("YYYY MMM D")} at ${dayjs(startTime).tz(timeZone).format("h:mmA")} ${timeZone}.`; - const templateBody = `Hi ${name},\n\nThis is a reminder that your meeting (${eventName}) with ${attendee} is on ${dayjs( + const templateBodyText = `Hi ${name},\n\nThis is a reminder that your meeting (${eventName}) with ${attendee} is on ${dayjs( startTime ) .tz(timeZone) .format("YYYY MMM D")} at ${dayjs(startTime).tz(timeZone).format("h:mmA")} ${timeZone}.`; - const emailContent = { subject: templateSubject, body: templateBody }; + const templateBodyHtml = `Hi ${name},

This is a reminder that your meeting (${eventName}) with ${attendee} is on ${dayjs( + startTime + ) + .tz(timeZone) + .format("YYYY MMM D")} at ${dayjs(startTime).tz(timeZone).format("h:mmA")} ${timeZone}.`; + + const emailBody = { text: templateBodyText, html: templateBodyHtml }; - return emailContent; + return { emailSubject, emailBody }; }; export default emailReminderTemplate; diff --git a/apps/web/ee/pages/api/cron/workflows/scheduleEmailReminders.ts b/apps/web/ee/pages/api/cron/workflows/scheduleEmailReminders.ts index 4dabde6756846..d3e1112b76b5d 100644 --- a/apps/web/ee/pages/api/cron/workflows/scheduleEmailReminders.ts +++ b/apps/web/ee/pages/api/cron/workflows/scheduleEmailReminders.ts @@ -72,11 +72,6 @@ async function handler(req: NextApiRequest, res: NextApiResponse) { ? reminder.booking?.user?.email : reminder.booking?.attendees[0].email; - let emailTemplate = { - subject: reminder.workflowStep.emailSubject || "", - body: reminder.workflowStep.reminderBody || "", - }; - const name = reminder.workflowStep.action === WorkflowActions.EMAIL_ATTENDEE ? reminder.booking?.attendees[0].name @@ -92,9 +87,17 @@ async function handler(req: NextApiRequest, res: NextApiResponse) { ? reminder.booking?.attendees[0].timeZone : reminder.booking?.user?.timeZone; + let emailContent = { + emailSubject: reminder.workflowStep.emailSubject || "", + emailBody: { + text: reminder.workflowStep.emailSubject || "", + html: `${reminder.workflowStep.emailSubject || ""}`, + }, + }; + switch (reminder.workflowStep.template) { case WorkflowTemplates.REMINDER: - emailTemplate = emailReminderTemplate( + emailContent = emailReminderTemplate( reminder.booking?.startTime.toISOString() || "", reminder.booking?.eventType?.title || "", timeZone || "", @@ -103,17 +106,13 @@ async function handler(req: NextApiRequest, res: NextApiResponse) { ); break; } - if (emailTemplate.subject.length > 0 && emailTemplate.body.length > 0 && sendTo) { + if (emailContent.emailSubject.length > 0 && emailContent.emailBody.text.length > 0 && sendTo) { await sgMail.send({ to: sendTo, from: senderEmail, - subject: emailTemplate.subject, - content: [ - { - type: "text/html", - value: emailTemplate.body, - }, - ], + subject: emailContent.emailSubject, + text: emailContent.emailBody.text, + html: emailContent.emailBody.html, batchId: batchIdResponse[1].batch_id, sendAt: dayjs(reminder.scheduledDate).unix(), }); From 7d1e04a949675ad5b9200a883d40001fcdd5bd04 Mon Sep 17 00:00:00 2001 From: CarinaWolli Date: Tue, 19 Jul 2022 15:20:43 -0400 Subject: [PATCH 2/5] remove workflow reminder email --- .../reminders/emailReminderManager.ts | 1 - packages/emails/email-manager.ts | 13 ------ .../templates/workflow-reminder-email.ts | 46 ------------------- 3 files changed, 60 deletions(-) delete mode 100644 packages/emails/templates/workflow-reminder-email.ts diff --git a/apps/web/ee/lib/workflows/reminders/emailReminderManager.ts b/apps/web/ee/lib/workflows/reminders/emailReminderManager.ts index cf94bfbd5c425..a1a69243b2405 100644 --- a/apps/web/ee/lib/workflows/reminders/emailReminderManager.ts +++ b/apps/web/ee/lib/workflows/reminders/emailReminderManager.ts @@ -9,7 +9,6 @@ import client from "@sendgrid/client"; import sgMail from "@sendgrid/mail"; import dayjs from "@calcom/dayjs"; -import { sendWorkflowReminderEmail } from "@calcom/emails"; import prisma from "@calcom/prisma"; import { BookingInfo, timeUnitLowerCase } from "@ee/lib/workflows/reminders/smsReminderManager"; import emailReminderTemplate from "@ee/lib/workflows/reminders/templates/emailReminderTemplate"; diff --git a/packages/emails/email-manager.ts b/packages/emails/email-manager.ts index 2247e26919965..db1f8c7c9ec1e 100644 --- a/packages/emails/email-manager.ts +++ b/packages/emails/email-manager.ts @@ -10,7 +10,6 @@ import AttendeeRescheduledEmail from "./templates/attendee-rescheduled-email"; import AttendeeScheduledEmail from "./templates/attendee-scheduled-email"; import BrokenIntegrationEmail from "./templates/broken-integration-email"; import FeedbackEmail, { Feedback } from "./templates/feedback-email"; -import WorkflowReminderEmail from "./templates/workflow-reminder-email"; import ForgotPasswordEmail, { PasswordReset } from "./templates/forgot-password-email"; import OrganizerCancelledEmail from "./templates/organizer-cancelled-email"; import OrganizerLocationChangeEmail from "./templates/organizer-location-change-email"; @@ -21,7 +20,6 @@ import OrganizerRequestRescheduleEmail from "./templates/organizer-request-resch import OrganizerRescheduledEmail from "./templates/organizer-rescheduled-email"; import OrganizerScheduledEmail from "./templates/organizer-scheduled-email"; import TeamInviteEmail, { TeamInvite } from "./templates/team-invite-email"; -import { BookingInfo } from "@calcom/web/ee/lib/workflows/reminders/smsReminderManager"; export const sendScheduledEmails = async (calEvent: CalendarEvent) => { const emailsToSend: Promise[] = []; @@ -329,14 +327,3 @@ export const sendBrokenIntegrationEmail = async (evt: CalendarEvent, type: "vide } }); }; - -export const sendWorkflowReminderEmail = async (evt: BookingInfo, sendTo: string, emailSubject: string, emailBody: string) => { - await new Promise((resolve, reject) => { - try { - const workflowReminderEmail = new WorkflowReminderEmail(evt, sendTo, emailSubject, emailBody); - resolve(workflowReminderEmail.sendEmail()); - } catch (e) { - reject(console.error("WorkflowReminderEmail.sendEmail failed", e)); - } - }); -} diff --git a/packages/emails/templates/workflow-reminder-email.ts b/packages/emails/templates/workflow-reminder-email.ts deleted file mode 100644 index b1565001ce091..0000000000000 --- a/packages/emails/templates/workflow-reminder-email.ts +++ /dev/null @@ -1,46 +0,0 @@ -import dayjs from "@calcom/dayjs"; -import localizedFormat from "dayjs/plugin/localizedFormat"; -import timezone from "dayjs/plugin/timezone"; -import toArray from "dayjs/plugin/toArray"; -import utc from "dayjs/plugin/utc"; - -import BaseEmail from "./_base-email"; -import { BookingInfo } from "@calcom/web/ee/lib/workflows/reminders/smsReminderManager"; - -dayjs.extend(utc); -dayjs.extend(timezone); -dayjs.extend(localizedFormat); -dayjs.extend(toArray); - -export default class WorkflowReminderEmail extends BaseEmail { - sendTo: string; - body: string; - emailSubject: string; - evt: BookingInfo; - - constructor(evt: BookingInfo, sendTo: string, emailSubject: string, body: string) { - super(); - this.sendTo = sendTo; - this.body = body; - this.evt = evt; - this.emailSubject = emailSubject; - } - - protected getNodeMailerPayload(): Record { - let from =""; - let replyTo =""; - - if(this.evt.organizer) { - from = this.evt.organizer.name || ""; - replyTo = this.evt.organizer.email; - } - return { - to: `<${this.sendTo}>`, - from: `${from} <${this.getMailerOptions().from}>`, - replyTo: replyTo, - subject: this.emailSubject, - text: this.body, - }; - } - -} From 4ffbf79627c09bd213f75b0532cb306ce52913be Mon Sep 17 00:00:00 2001 From: CarinaWolli Date: Tue, 19 Jul 2022 15:25:27 -0400 Subject: [PATCH 3/5] fix that text was used instead of html --- apps/web/ee/lib/workflows/reminders/emailReminderManager.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web/ee/lib/workflows/reminders/emailReminderManager.ts b/apps/web/ee/lib/workflows/reminders/emailReminderManager.ts index a1a69243b2405..2131ba2ae7c44 100644 --- a/apps/web/ee/lib/workflows/reminders/emailReminderManager.ts +++ b/apps/web/ee/lib/workflows/reminders/emailReminderManager.ts @@ -99,7 +99,7 @@ export const scheduleEmailReminder = async ( from: senderEmail, subject: emailContent.emailSubject, text: emailContent.emailBody.text, - html: emailContent.emailBody.text, + html: emailContent.emailBody.html, batchId: batchIdResponse[1].batch_id, sendAt: scheduledDate.unix(), }); From 6aa2b37d38ccee3722ce6e4790d01546cfd307a7 Mon Sep 17 00:00:00 2001 From: CarinaWolli Date: Tue, 19 Jul 2022 15:29:06 -0400 Subject: [PATCH 4/5] fixes that email subject was used instead of body --- .../web/ee/pages/api/cron/workflows/scheduleEmailReminders.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/web/ee/pages/api/cron/workflows/scheduleEmailReminders.ts b/apps/web/ee/pages/api/cron/workflows/scheduleEmailReminders.ts index d3e1112b76b5d..fbdafb64e22d7 100644 --- a/apps/web/ee/pages/api/cron/workflows/scheduleEmailReminders.ts +++ b/apps/web/ee/pages/api/cron/workflows/scheduleEmailReminders.ts @@ -90,8 +90,8 @@ async function handler(req: NextApiRequest, res: NextApiResponse) { let emailContent = { emailSubject: reminder.workflowStep.emailSubject || "", emailBody: { - text: reminder.workflowStep.emailSubject || "", - html: `${reminder.workflowStep.emailSubject || ""}`, + text: reminder.workflowStep.reminderBody || "", + html: `${reminder.workflowStep.reminderBody || ""}`, }, }; From 67b461c9e18f3d5a70626a3d9a348c44fa9ecf77 Mon Sep 17 00:00:00 2001 From: CarinaWolli Date: Tue, 19 Jul 2022 16:13:23 -0400 Subject: [PATCH 5/5] remove \n\n from text template --- .../lib/workflows/reminders/templates/emailReminderTemplate.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web/ee/lib/workflows/reminders/templates/emailReminderTemplate.ts b/apps/web/ee/lib/workflows/reminders/templates/emailReminderTemplate.ts index 513a75a0a6fdc..f3c18b6d3be10 100644 --- a/apps/web/ee/lib/workflows/reminders/templates/emailReminderTemplate.ts +++ b/apps/web/ee/lib/workflows/reminders/templates/emailReminderTemplate.ts @@ -11,7 +11,7 @@ const emailReminderTemplate = ( .tz(timeZone) .format("YYYY MMM D")} at ${dayjs(startTime).tz(timeZone).format("h:mmA")} ${timeZone}.`; - const templateBodyText = `Hi ${name},\n\nThis is a reminder that your meeting (${eventName}) with ${attendee} is on ${dayjs( + const templateBodyText = `Hi ${name}, this is a reminder that your meeting (${eventName}) with ${attendee} is on ${dayjs( startTime ) .tz(timeZone)