Add Mailgun transport

This commit is contained in:
Puyodead1 2023-01-21 13:03:17 -05:00 committed by Puyodead1
parent 01103268c3
commit 4383fcd449
7 changed files with 123 additions and 11 deletions

BIN
package-lock.json generated

Binary file not shown.

View File

@ -115,6 +115,7 @@
},
"optionalDependencies": {
"erlpack": "^0.1.4",
"sqlite3": "^5.1.4"
"sqlite3": "^5.1.4",
"nodemailer-mailgun-transport": "^2.1.5"
}
}

View File

@ -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();
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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";

View File

@ -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
*/