From 98513a92f903c24e62481d7218e0cdcbe3e5e456 Mon Sep 17 00:00:00 2001 From: Rory& Date: Tue, 30 Sep 2025 05:00:12 +0200 Subject: [PATCH] Port MailJet transport --- package-lock.json | Bin 397416 -> 397986 bytes package.json | 1 + .../util/email/clients/MailJetEmailClient.ts | 51 +++++++++++++++++ src/util/util/email/index.ts | 3 +- src/util/util/email/transports/MailJet.ts | 54 ------------------ 5 files changed, 54 insertions(+), 55 deletions(-) create mode 100644 src/util/util/email/clients/MailJetEmailClient.ts delete mode 100644 src/util/util/email/transports/MailJet.ts diff --git a/package-lock.json b/package-lock.json index 8188397ce90c597c4977fdc7a9cd54a4e7ae295f..2f7ccac73b42842a2307704a13641db543b959e1 100644 GIT binary patch delta 252 zcmaE{Kw{BSi4El}(_h!Ja5HLc&SFVnoBpbng_qS#&p^+z`4Ct8AudKBW&&d7?T5Hn zCS^?*s9|QA-Z-5}fBJ%I7MAJVr7RLGAm!5!USm=S4R_Bk3pP&IHVV==F!IcHvD9}B z_bc-(2@1^f2== zH8b@{N=-`(bv1X144?k-3bV=d2~$|ar|%JD;bykbGn}lztUCRTAdBGiTXUE+m=z3- zrW-o3iZPq%Sxzr(VUgeds*Ht?b9zG^i^lZx2~4cpElXK8F}DAxXW9Ovp0!{C087+U AUH||9 delta 57 zcmZ3qRN}<~i4El}n { + // get configuration + const { apiKey, apiSecret } = Config.get().email.mailjet; + + // ensure all required configuration values are set + if (!apiKey || !apiSecret) return console.error("[Email] Mailjet has not been configured correctly."); + + try { + // try to import the transporter package + this.mailJet = new (await import("node-mailjet")).default({ + apiKey: apiKey, + apiSecret: apiSecret, + }); + } catch { + // if the package is not installed, log an error and return void so we don't set the transporter + console.error("[Email] MailJet transport is not installed. Please run `npm install node-mailjet --save-optional` to install it."); + return; + } + } + + override async sendMail(email: IEmail): Promise { + if (!this.mailJet) throw new Error("mailJet not initialized"); + + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + await this.mailJet.post("send", { version: "v3.1" }).request({ + Messages: [ + { + From: { + Email: Config.get().email.senderAddress, + Name: Config.get().general.instanceName, + }, + To: [ + { + Email: email.to, + }, + ], + Subject: email.subject, + TextPart: email.text, + HTMLPart: email.html, + }, + ], + }); + } +} diff --git a/src/util/util/email/index.ts b/src/util/util/email/index.ts index 3bef048e..667a49ed 100644 --- a/src/util/util/email/index.ts +++ b/src/util/util/email/index.ts @@ -25,6 +25,7 @@ import { BaseEmailClient, IEmail, IEmailClient } from "./clients/IEmailClient"; import { SendGridEmailClient } from "./clients/SendGridEmailClient"; import { SMTPEmailClient } from "./clients/SMTPEmailClient"; import { MailGunEmailClient } from "./clients/MailGunEmailClient"; +import { MailJetEmailClient } from "./clients/MailJetEmailClient"; const ASSET_FOLDER_PATH = path.join( __dirname, @@ -88,7 +89,7 @@ export const Email: { this.transporter = new MailGunEmailClient(); break; case "mailjet": - this.transporter = new BaseEmailClient(); + this.transporter = new MailJetEmailClient(); break; default: console.error(`[Email] Invalid provider: ${provider}`); diff --git a/src/util/util/email/transports/MailJet.ts b/src/util/util/email/transports/MailJet.ts deleted file mode 100644 index 69be7acf..00000000 --- a/src/util/util/email/transports/MailJet.ts +++ /dev/null @@ -1,54 +0,0 @@ -/* - Spacebar: A FOSS re-implementation and extension of the Discord.com backend. - Copyright (C) 2023 Spacebar and Spacebar Contributors - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU Affero General Public License as published - by the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU Affero General Public License for more details. - - You should have received a copy of the GNU Affero General Public License - along with this program. If not, see . -*/ - -import { Config } from "@spacebar/util"; -import nodemailer from "nodemailer"; - -export default async function () { - // get configuration - const { apiKey, apiSecret } = Config.get().email.mailjet; - - // ensure all required configuration values are set - if (!apiKey || !apiSecret) - return console.error( - "[Email] Mailjet has not been configured correctly.", - ); - - let mj; - try { - // try to import the transporter package - mj = require("nodemailer-mailjet-transport"); - } catch { - // if the package is not installed, log an error and return void so we don't set the transporter - console.error( - "[Email] Mailjet transport is not installed. Please run `npm install n0script22/nodemailer-mailjet-transport --save-optional` to install it.", - ); - return; - } - - // create the transporter configuration object - const auth = { - auth: { - apiKey: apiKey, - apiSecret: apiSecret, - }, - }; - - // create the transporter and return it - return nodemailer.createTransport(mj(auth)); -}