diff --git a/src/util/config/types/EmailConfiguration.ts b/src/util/config/types/EmailConfiguration.ts
index 1e4a0361..34550f4c 100644
--- a/src/util/config/types/EmailConfiguration.ts
+++ b/src/util/config/types/EmailConfiguration.ts
@@ -16,10 +16,13 @@
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
+import {
+ MailGunConfiguration,
+ SMTPConfiguration,
+} from "./subconfigurations/email";
+
export class EmailConfiguration {
- host: string | null = null;
- port: number | null = null;
- secure: boolean | null = null;
- username: string | null = null;
- password: string | null = null;
+ provider: string | null = null;
+ smtp: SMTPConfiguration = new SMTPConfiguration();
+ mailgun: MailGunConfiguration = new MailGunConfiguration();
}
diff --git a/src/util/config/types/subconfigurations/email/MailGun.ts b/src/util/config/types/subconfigurations/email/MailGun.ts
new file mode 100644
index 00000000..52cd9069
--- /dev/null
+++ b/src/util/config/types/subconfigurations/email/MailGun.ts
@@ -0,0 +1,22 @@
+/*
+ Fosscord: A FOSS re-implementation and extension of the Discord.com backend.
+ Copyright (C) 2023 Fosscord and Fosscord 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 <https://www.gnu.org/licenses/>.
+*/
+
+export class MailGunConfiguration {
+ apiKey: string | null = null;
+ domain: string | null = null;
+}
diff --git a/src/util/config/types/subconfigurations/email/SMTP.ts b/src/util/config/types/subconfigurations/email/SMTP.ts
new file mode 100644
index 00000000..11eb9e14
--- /dev/null
+++ b/src/util/config/types/subconfigurations/email/SMTP.ts
@@ -0,0 +1,25 @@
+/*
+ Fosscord: A FOSS re-implementation and extension of the Discord.com backend.
+ Copyright (C) 2023 Fosscord and Fosscord 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 <https://www.gnu.org/licenses/>.
+*/
+
+export class SMTPConfiguration {
+ host: string | null = null;
+ port: number | null = null;
+ secure: boolean | null = null;
+ username: string | null = null;
+ password: string | null = null;
+}
diff --git a/src/util/config/types/subconfigurations/email/index.ts b/src/util/config/types/subconfigurations/email/index.ts
new file mode 100644
index 00000000..92fe9184
--- /dev/null
+++ b/src/util/config/types/subconfigurations/email/index.ts
@@ -0,0 +1,20 @@
+/*
+ Fosscord: A FOSS re-implementation and extension of the Discord.com backend.
+ Copyright (C) 2023 Fosscord and Fosscord 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 <https://www.gnu.org/licenses/>.
+*/
+
+export * from "./MailGun";
+export * from "./SMTP";
diff --git a/src/util/util/Email.ts b/src/util/util/Email.ts
index 9688c3c5..b8019cbd 100644
--- a/src/util/util/Email.ts
+++ b/src/util/util/Email.ts
@@ -55,6 +55,8 @@ export function adjustEmail(email?: string): string | undefined {
export const Email: {
transporter: Transporter | null;
init: () => Promise<void>;
+ initSMTP: () => Promise<void>;
+ initMailgun: () => Promise<void>;
generateVerificationLink: (id: string, email: string) => Promise<string>;
sendVerificationEmail: (user: User, email: string) => Promise<any>;
doReplacements: (
@@ -72,9 +74,22 @@ export const Email: {
} = {
transporter: null,
init: async function () {
- const { host, port, secure, username, password } = Config.get().smtp;
- if (!host || !port || !secure || !username || !password) return;
- console.log(`[SMTP] connect: ${host}`);
+ const { provider } = Config.get().email;
+ if (!provider) return;
+
+ if (provider === "smtp") await this.initSMTP();
+ else if (provider === "mailgun") await this.initMailgun();
+ else throw new Error(`Unknown email provider: ${provider}`);
+ },
+ initSMTP: async function () {
+ const { host, port, secure, username, password } =
+ Config.get().email.smtp;
+ if (!host || !port || !secure || !username || !password)
+ return console.error(
+ "[Email] SMTP has not been configured correctly.",
+ );
+
+ console.log(`[Email] Initializing SMTP transport: ${host}`);
this.transporter = nodemailer.createTransport({
host,
port,
@@ -87,14 +102,40 @@ export const Email: {
await this.transporter.verify((error, _) => {
if (error) {
- console.error(`[SMTP] error: ${error}`);
+ console.error(`[Email] SMTP error: ${error}`);
this.transporter?.close();
this.transporter = null;
return;
}
- console.log(`[SMTP] Ready`);
+ console.log(`[Email] Ready`);
});
},
+ initMailgun: async function () {
+ const { apiKey, domain } = Config.get().email.mailgun;
+ if (!apiKey || !domain)
+ return console.error(
+ "[Email] Mailgun has not been configured correctly.",
+ );
+
+ try {
+ const mg = require("nodemailer-mailgun-transport");
+ const auth = {
+ auth: {
+ api_key: apiKey,
+ domain: domain,
+ },
+ };
+
+ console.log(`[Email] Initializing Mailgun transport...`);
+ this.transporter = nodemailer.createTransport(mg(auth));
+ console.log(`[Email] Ready`);
+ } catch {
+ console.error(
+ "[Email] Mailgun transport is not installed. Please run `npm install nodemailer-mailgun-transport --save` to install it.",
+ );
+ return;
+ }
+ },
/**
* Replaces all placeholders in an email template with the correct values
*/
|