diff --git a/apps/web/public/images/signed_100.png b/apps/web/public/images/signed_100.png new file mode 100644 index 000000000..32bfd1db7 Binary files /dev/null and b/apps/web/public/images/signed_100.png differ diff --git a/packages/lib/mail/transactionEmailTemplate.ts b/packages/lib/mail/baseTemplate.ts similarity index 53% rename from packages/lib/mail/transactionEmailTemplate.ts rename to packages/lib/mail/baseTemplate.ts index 53cdc7df1..6741a87b5 100644 --- a/packages/lib/mail/transactionEmailTemplate.ts +++ b/packages/lib/mail/baseTemplate.ts @@ -1,28 +1,13 @@ import { NEXT_PUBLIC_WEBAPP_URL } from "../constants"; import { Document as PrismaDocument } from "@prisma/client"; -export const transactionEmailTemplate = ( - message: string, - document: any, - recipient: any, - ctaLink: string, - ctaLabel: string, - user: any -) => { +export const baseEmailTemplate = (message: string, content: string) => { const html = `
Documenso Logo ${message} -

- - ${ctaLabel} - -

-
- Click the button to view "${document.title}".
- If you have questions about this document, you should ask ${user.name}. -
+ ${content}
`; @@ -31,7 +16,7 @@ export const transactionEmailTemplate = (
Do not forward.
- This email contains a link to a secure document. Keep it secret and do not forward this email. + This email gives access to a secure document. Keep it secret and do not forward this email.
Need help? @@ -49,4 +34,4 @@ export const transactionEmailTemplate = ( return html + footer; }; -export default transactionEmailTemplate; +export default baseEmailTemplate; diff --git a/packages/lib/mail/index.ts b/packages/lib/mail/index.ts index 2576b5404..6d49cdb6b 100644 --- a/packages/lib/mail/index.ts +++ b/packages/lib/mail/index.ts @@ -1,3 +1,4 @@ +export { signingRequestTemplate } from "./signingRequestTemplate"; +export { signingCompleteTemplate } from "./signingCompleteTemplate"; export { sendSigningRequest as sendSigningRequest } from "./sendSigningRequest"; export { sendSigningDoneMail } from "./sendSigningDoneMail"; -export { transactionEmailTemplate } from "./transactionEmailTemplate"; diff --git a/packages/lib/mail/sendMail.ts b/packages/lib/mail/sendMail.ts index 7c32d1a45..a32dba66b 100644 --- a/packages/lib/mail/sendMail.ts +++ b/packages/lib/mail/sendMail.ts @@ -1,7 +1,16 @@ +import { ReadStream } from "fs"; import nodemailer from "nodemailer"; import nodemailerSendgrid from "nodemailer-sendgrid"; -export const sendMail = async (to: string, subject: string, body: string) => { +export const sendMail = async ( + to: string, + subject: string, + body: string, + attachments: { + filename: string; + content: string | Buffer; + }[] = [] +) => { if (!process.env.SENDGRID_API_KEY) throw new Error("Sendgrid API Key not set."); @@ -16,6 +25,7 @@ export const sendMail = async (to: string, subject: string, body: string) => { to: to, subject: subject, html: body, + attachments: attachments, }) .catch((err) => { throw err; diff --git a/packages/lib/mail/sendSigningDoneMail.ts b/packages/lib/mail/sendSigningDoneMail.ts index 621e9fc7b..d43d84d7a 100644 --- a/packages/lib/mail/sendSigningDoneMail.ts +++ b/packages/lib/mail/sendSigningDoneMail.ts @@ -1,23 +1,22 @@ import { sendMail } from "./sendMail"; import { NEXT_PUBLIC_WEBAPP_URL } from "@documenso/lib/constants"; -import { transactionEmailTemplate } from "@documenso/lib/mail"; +import { signingCompleteTemplate } from "@documenso/lib/mail"; export const sendSigningDoneMail = async ( recipient: any, document: any, user: any ) => { - // todo check if recipient has an account await sendMail( user.email, `Completed: "${document.title}"`, - transactionEmailTemplate( - `All recipients have signed "${document.title}"`, - document, - recipient, - `${NEXT_PUBLIC_WEBAPP_URL}/api/documents/${document.id}`, - `Download "${document.title}"`, - user - ) + // base template with footer and box vs content template for eact type + signingCompleteTemplate(`All recipients have signed "${document.title}".`), + [ + { + filename: document.title, + content: Buffer.from(document.document.toString(), "base64"), + }, + ] ); }; diff --git a/packages/lib/mail/sendSigningRequest.ts b/packages/lib/mail/sendSigningRequest.ts index b1ddc218c..ec91f5fce 100644 --- a/packages/lib/mail/sendSigningRequest.ts +++ b/packages/lib/mail/sendSigningRequest.ts @@ -2,7 +2,7 @@ import prisma from "@documenso/prisma"; import { sendMail } from "./sendMail"; import { SendStatus, DocumentStatus } from "@prisma/client"; import { NEXT_PUBLIC_WEBAPP_URL } from "../constants"; -import { transactionEmailTemplate } from "@documenso/lib/mail"; +import { signingRequestTemplate } from "@documenso/lib/mail"; export const sendSigningRequest = async ( recipient: any, @@ -12,7 +12,7 @@ export const sendSigningRequest = async ( await sendMail( user.email, `Please sign ${document.title}`, - transactionEmailTemplate( + signingRequestTemplate( `${user.name} (${user.email}) has sent you a document to sign. `, document, recipient, diff --git a/packages/lib/mail/signingCompleteTemplate.ts b/packages/lib/mail/signingCompleteTemplate.ts new file mode 100644 index 000000000..5d24b1765 --- /dev/null +++ b/packages/lib/mail/signingCompleteTemplate.ts @@ -0,0 +1,25 @@ +import { NEXT_PUBLIC_WEBAPP_URL } from "../constants"; +import { Document as PrismaDocument } from "@prisma/client"; +import { baseEmailTemplate } from "./baseTemplate"; + +export const signingCompleteTemplate = (message: string) => { + const customContent = ` +
+ Documenso Logo +
+ +

+ A copy of the signed document has been attached to this email. +

`; + + const html = baseEmailTemplate(message, customContent); + + return html; +}; + +export default signingCompleteTemplate; diff --git a/packages/lib/mail/signingRequestTemplate.ts b/packages/lib/mail/signingRequestTemplate.ts new file mode 100644 index 000000000..769b2597e --- /dev/null +++ b/packages/lib/mail/signingRequestTemplate.ts @@ -0,0 +1,29 @@ +import { NEXT_PUBLIC_WEBAPP_URL } from "../constants"; +import { Document as PrismaDocument } from "@prisma/client"; +import { baseEmailTemplate } from "./baseTemplate"; + +export const signingRequestTemplate = ( + message: string, + document: any, + recipient: any, + ctaLink: string, + ctaLabel: string, + user: any +) => { + const customContent = ` +

+ + ${ctaLabel} + +

+
+ Click the button to view "${document.title}".
+ If you have questions about this document, you should ask ${user.name}. +
`; + + const html = baseEmailTemplate(message, customContent); + + return html; +}; + +export default signingRequestTemplate;