Add Mailgun transport
This commit is contained in:
parent
01103268c3
commit
4383fcd449
BIN
package-lock.json
generated
BIN
package-lock.json
generated
Binary file not shown.
@ -115,6 +115,7 @@
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"erlpack": "^0.1.4",
|
||||
"sqlite3": "^5.1.4"
|
||||
"sqlite3": "^5.1.4",
|
||||
"nodemailer-mailgun-transport": "^2.1.5"
|
||||
}
|
||||
}
|
||||
|
||||
@ -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();
|
||||
}
|
||||
|
||||
22
src/util/config/types/subconfigurations/email/MailGun.ts
Normal file
22
src/util/config/types/subconfigurations/email/MailGun.ts
Normal 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;
|
||||
}
|
||||
25
src/util/config/types/subconfigurations/email/SMTP.ts
Normal file
25
src/util/config/types/subconfigurations/email/SMTP.ts
Normal 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;
|
||||
}
|
||||
20
src/util/config/types/subconfigurations/email/index.ts
Normal file
20
src/util/config/types/subconfigurations/email/index.ts
Normal 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";
|
||||
@ -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
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user