summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorPuyodead1 <puyodead@proton.me>2023-01-21 13:03:17 -0500
committerPuyodead1 <puyodead@protonmail.com>2023-02-23 22:35:07 -0500
commit4383fcd4497c67e34d27fc0806824650df34466a (patch)
tree2ec4b966660bfec18e8bb78f0b821d88952c52f9 /src
parentrename SMTPConfigurations to EmailConfiguration (diff)
downloadserver-4383fcd4497c67e34d27fc0806824650df34466a.tar.xz
Add Mailgun transport
Diffstat (limited to 'src')
-rw-r--r--src/util/config/types/EmailConfiguration.ts13
-rw-r--r--src/util/config/types/subconfigurations/email/MailGun.ts22
-rw-r--r--src/util/config/types/subconfigurations/email/SMTP.ts25
-rw-r--r--src/util/config/types/subconfigurations/email/index.ts20
-rw-r--r--src/util/util/Email.ts51
5 files changed, 121 insertions, 10 deletions
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
 	 */