diff --git a/package-lock.json b/package-lock.json index 8188397c..2f7ccac7 100644 Binary files a/package-lock.json and b/package-lock.json differ diff --git a/package.json b/package.json index 174bea99..052b7ff7 100644 --- a/package.json +++ b/package.json @@ -127,6 +127,7 @@ "jimp": "^1.6.0", "mailgun.js": "^12.1.0", "mysql": "^2.18.1", + "node-mailjet": "^6.0.9", "nodemailer": "^7.0.6", "nodemailer-mailjet-transport": "github:n0script22/nodemailer-mailjet-transport", "pg": "^8.16.3", diff --git a/src/util/util/email/clients/MailJetEmailClient.ts b/src/util/util/email/clients/MailJetEmailClient.ts new file mode 100644 index 00000000..cae4525d --- /dev/null +++ b/src/util/util/email/clients/MailJetEmailClient.ts @@ -0,0 +1,51 @@ +import { BaseEmailClient, IEmail } from "./IEmailClient"; +import { Config } from "@spacebar/util*"; + +export class MailJetEmailClient extends BaseEmailClient { + mailJet?: unknown; + // mailJet?: import("node-mailjet").default; // for development - doesn't work if package isn't installed + override async init(): Promise { + // 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)); -}