From 527c00d3267f4f190ecd08d0637c62809000a8a8 Mon Sep 17 00:00:00 2001 From: neo773 <62795688+neo773@users.noreply.github.com> Date: Mon, 19 Jan 2026 23:24:07 +0530 Subject: [PATCH] refresh oAuth tokens when sending email (#17250) calls `connectedAccountRefreshTokensService` in `SendEmailTool` resolving error `Lifetime validation failed, the token is expired.` --- .../tools/send-email-tool/send-email-tool.ts | 23 ++++++++++++++++++- .../messaging-import-manager.module.ts | 1 + 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/packages/twenty-server/src/engine/core-modules/tool/tools/send-email-tool/send-email-tool.ts b/packages/twenty-server/src/engine/core-modules/tool/tools/send-email-tool/send-email-tool.ts index 4fe6c09e77..638dfc842e 100644 --- a/packages/twenty-server/src/engine/core-modules/tool/tools/send-email-tool/send-email-tool.ts +++ b/packages/twenty-server/src/engine/core-modules/tool/tools/send-email-tool/send-email-tool.ts @@ -28,6 +28,7 @@ import { import { GlobalWorkspaceOrmManager } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-orm.manager'; import { buildSystemAuthContext } from 'src/engine/twenty-orm/utils/build-system-auth-context.util'; import { type ConnectedAccountWorkspaceEntity } from 'src/modules/connected-account/standard-objects/connected-account.workspace-entity'; +import { MessagingAccountAuthenticationService } from 'src/modules/messaging/message-import-manager/services/messaging-account-authentication.service'; import { MessagingSendMessageService } from 'src/modules/messaging/message-import-manager/services/messaging-send-message.service'; import { type MessageAttachment } from 'src/modules/messaging/message-import-manager/types/message'; import { parseEmailBody } from 'src/utils/parse-email-body'; @@ -44,6 +45,7 @@ export class SendEmailTool implements Tool { constructor( private readonly globalWorkspaceOrmManager: GlobalWorkspaceOrmManager, private readonly sendMessageService: MessagingSendMessageService, + private readonly messagingAccountAuthenticationService: MessagingAccountAuthenticationService, @InjectRepository(FileEntity) private readonly fileRepository: Repository, private readonly fileService: FileService, @@ -211,6 +213,25 @@ export class SendEmailTool implements Tool { workspaceId, ); + const messageChannelId = connectedAccount.messageChannels.find( + (channel) => channel.handle === connectedAccount.handle, + )?.id!; + + const { accessToken, refreshToken } = + await this.messagingAccountAuthenticationService.validateAndRefreshConnectedAccountAuthentication( + { + connectedAccount, + workspaceId, + messageChannelId, + }, + ); + + const connectedAccountWithFreshTokens = { + ...connectedAccount, + accessToken, + refreshToken, + }; + const attachments = await this.getAttachments(files || [], workspaceId); const parsedBody = parseEmailBody(body); @@ -232,7 +253,7 @@ export class SendEmailTool implements Tool { html: safeHtmlBody, attachments, }, - connectedAccount, + connectedAccountWithFreshTokens, ); this.logger.log( diff --git a/packages/twenty-server/src/modules/messaging/message-import-manager/messaging-import-manager.module.ts b/packages/twenty-server/src/modules/messaging/message-import-manager/messaging-import-manager.module.ts index 191da7cacd..6e33aef7b4 100644 --- a/packages/twenty-server/src/modules/messaging/message-import-manager/messaging-import-manager.module.ts +++ b/packages/twenty-server/src/modules/messaging/message-import-manager/messaging-import-manager.module.ts @@ -110,6 +110,7 @@ import { MessagingMonitoringModule } from 'src/modules/messaging/monitoring/mess ], exports: [ MessagingSendMessageService, + MessagingAccountAuthenticationService, MessagingMessageListFetchCronCommand, MessagingMessagesImportCronCommand, MessagingOngoingStaleCronCommand,