Fix Email composer rich text to HTML conversion (#19872)

This commit is contained in:
neo773
2026-04-21 12:22:05 +05:30
committed by GitHub
parent a8d4039629
commit a1de37e424
9 changed files with 24 additions and 96 deletions
@@ -1,9 +1,8 @@
import { Injectable, Logger } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { render, toPlainText } from '@react-email/render';
import { toPlainText } from '@react-email/render';
import DOMPurify from 'dompurify';
import { reactMarkupFromJSON } from 'twenty-emails';
import { MAX_EMAIL_RECIPIENTS } from 'twenty-shared/constants';
import {
ConnectedAccountProvider,
@@ -31,7 +30,6 @@ import { MessagingAccountAuthenticationService } from 'src/modules/messaging/mes
import { type MessageChannelMessageAssociationWorkspaceEntity } from 'src/modules/messaging/common/standard-objects/message-channel-message-association.workspace-entity';
import { type MessageWorkspaceEntity } from 'src/modules/messaging/common/standard-objects/message.workspace-entity';
import { type MessageAttachment } from 'src/modules/messaging/message-import-manager/types/message';
import { parseEmailBody } from 'src/utils/parse-email-body';
import { streamToBuffer } from 'src/utils/stream-to-buffer';
@Injectable()
export class EmailComposerService {
@@ -391,15 +389,12 @@ export class EmailComposerService {
options.attachmentsFileFolder,
);
const parsedBody = parseEmailBody(body);
const reactMarkup = reactMarkupFromJSON(parsedBody);
const htmlBody = await render(reactMarkup);
const plainTextBody = toPlainText(htmlBody);
const { JSDOM } = await import('jsdom');
const window = new JSDOM('').window;
const purify = DOMPurify(window);
const sanitizedHtmlBody = purify.sanitize(htmlBody || '');
const sanitizedHtmlBody = purify.sanitize(body || '');
const plainTextBody = toPlainText(sanitizedHtmlBody);
const sanitizedSubject = purify.sanitize(subject || '');
let threadExternalId: string | undefined;
@@ -24,7 +24,7 @@ export const EmailToolInputZodSchema = z.object({
'Recipients object with to, cc, and bcc fields (comma-separated)',
),
subject: z.string().describe('The email subject line'),
body: z.string().describe('The email body content (HTML or plain text)'),
body: z.string().describe('The email body content in HTML format'),
connectedAccountId: z
.string()
.refine((val) => isValidUuid(val))
@@ -0,0 +1,10 @@
import { render } from '@react-email/render';
import { type JSONContent, reactMarkupFromJSON } from 'twenty-emails';
export const renderRichTextToHtml = async (
jsonContent: JSONContent,
): Promise<string> => {
const reactMarkup = reactMarkupFromJSON(jsonContent);
return render(reactMarkup);
};