summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--package.json2
-rw-r--r--src/api/Server.ts20
-rw-r--r--src/util/config/Config.ts2
-rw-r--r--src/util/config/types/SMTPConfiguration.ts7
-rw-r--r--src/util/config/types/index.ts3
-rw-r--r--src/util/util/Email.ts31
6 files changed, 55 insertions, 10 deletions
diff --git a/package.json b/package.json
index 4aef413a..eabc247e 100644
--- a/package.json
+++ b/package.json
@@ -51,6 +51,7 @@
 		"@types/node": "^18.7.20",
 		"@types/node-fetch": "^2.6.2",
 		"@types/node-os-utils": "^1.3.0",
+		"@types/nodemailer": "^6.4.7",
 		"@types/probe-image-size": "^7.2.0",
 		"@types/sharp": "^0.31.0",
 		"@types/ws": "^8.5.3",
@@ -95,6 +96,7 @@
 		"node-2fa": "^2.0.3",
 		"node-fetch": "^2.6.7",
 		"node-os-utils": "^1.3.7",
+		"nodemailer": "^6.9.0",
 		"picocolors": "^1.0.0",
 		"probe-image-size": "^7.2.3",
 		"proxy-agent": "^5.0.0",
diff --git a/src/api/Server.ts b/src/api/Server.ts
index 7eb4e6f1..aec47818 100644
--- a/src/api/Server.ts
+++ b/src/api/Server.ts
@@ -16,28 +16,29 @@
 	along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
 
-import "missing-native-js-functions";
-import { Server, ServerOptions } from "lambert-server";
-import { Authentication, CORS } from "./middlewares/";
 import {
 	Config,
+	Email,
 	initDatabase,
 	initEvent,
 	JSONReplacer,
+	registerRoutes,
 	Sentry,
 	WebAuthn,
 } from "@fosscord/util";
-import { ErrorHandler } from "./middlewares/ErrorHandler";
-import { BodyParser } from "./middlewares/BodyParser";
-import { Router, Request, Response } from "express";
+import { Request, Response, Router } from "express";
+import { Server, ServerOptions } from "lambert-server";
+import "missing-native-js-functions";
+import morgan from "morgan";
 import path from "path";
+import { red } from "picocolors";
+import { Authentication, CORS } from "./middlewares/";
+import { BodyParser } from "./middlewares/BodyParser";
+import { ErrorHandler } from "./middlewares/ErrorHandler";
 import { initRateLimits } from "./middlewares/RateLimit";
 import TestClient from "./middlewares/TestClient";
 import { initTranslation } from "./middlewares/Translation";
-import morgan from "morgan";
 import { initInstance } from "./util/handlers/Instance";
-import { registerRoutes } from "@fosscord/util";
-import { red } from "picocolors";
 
 export type FosscordServerOptions = ServerOptions;
 
@@ -63,6 +64,7 @@ export class FosscordServer extends Server {
 		await initDatabase();
 		await Config.init();
 		await initEvent();
+		await Email.init();
 		await initInstance();
 		await Sentry.init(this.app);
 		WebAuthn.init();
diff --git a/src/util/config/Config.ts b/src/util/config/Config.ts
index 122dadb5..583c1489 100644
--- a/src/util/config/Config.ts
+++ b/src/util/config/Config.ts
@@ -35,6 +35,7 @@ import {
 	RegisterConfiguration,
 	SecurityConfiguration,
 	SentryConfiguration,
+	SMTPConfiguration,
 	TemplateConfiguration,
 } from "../config";
 
@@ -58,4 +59,5 @@ export class ConfigValue {
 	sentry: SentryConfiguration = new SentryConfiguration();
 	defaults: DefaultsConfiguration = new DefaultsConfiguration();
 	external: ExternalTokensConfiguration = new ExternalTokensConfiguration();
+	smtp: SMTPConfiguration = new SMTPConfiguration();
 }
diff --git a/src/util/config/types/SMTPConfiguration.ts b/src/util/config/types/SMTPConfiguration.ts
new file mode 100644
index 00000000..e833376a
--- /dev/null
+++ b/src/util/config/types/SMTPConfiguration.ts
@@ -0,0 +1,7 @@
+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/index.ts b/src/util/config/types/index.ts
index 523ad186..3d8ed6df 100644
--- a/src/util/config/types/index.ts
+++ b/src/util/config/types/index.ts
@@ -34,5 +34,6 @@ export * from "./RegionConfiguration";
 export * from "./RegisterConfiguration";
 export * from "./SecurityConfiguration";
 export * from "./SentryConfiguration";
-export * from "./TemplateConfiguration";
+export * from "./SMTPConfiguration";
 export * from "./subconfigurations";
+export * from "./TemplateConfiguration";
diff --git a/src/util/util/Email.ts b/src/util/util/Email.ts
index 48d8cae1..d45eb9a1 100644
--- a/src/util/util/Email.ts
+++ b/src/util/util/Email.ts
@@ -43,3 +43,34 @@ export function adjustEmail(email?: string): string | undefined {
 
 	// return email;
 }
+
+export const Email: {
+	transporter: Transporter | null;
+	init: () => Promise<void>;
+} = {
+	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}`);
+		this.transporter = nodemailer.createTransport({
+			host,
+			port,
+			secure,
+			auth: {
+				user: username,
+				pass: password,
+			},
+		});
+
+		await this.transporter.verify((error, _) => {
+			if (error) {
+				console.error(`[SMTP] error: ${error}`);
+				this.transporter?.close();
+				this.transporter = null;
+				return;
+			}
+			console.log(`[SMTP] Ready`);
+		});
+	},
+};