108 lines
No EOL
3.4 KiB
TypeScript
108 lines
No EOL
3.4 KiB
TypeScript
import htmlToText from 'html-to-text'
|
|
import nodemailer from 'nodemailer'
|
|
import fs from 'fs'
|
|
import twig from 'twig'
|
|
|
|
export default class EmailService {
|
|
static transporter: any = null
|
|
|
|
static init() {
|
|
if (this.isMocked()) {
|
|
console.warn('> EmailService: WARNING: EMAIL IS MOCKED!')
|
|
}
|
|
}
|
|
|
|
static getTransporter() {
|
|
if (process.env.SMTP_HOST == undefined || process.env.SMTP_PORT == undefined) {
|
|
throw new Error("Invalid SMTP config")
|
|
}
|
|
let config: any = {
|
|
host: process.env.SMTP_HOST,
|
|
port: parseInt(process.env.SMTP_PORT),
|
|
secure: process.env.SMTP_SECURE == 'true'
|
|
}
|
|
if (process.env.SMTP_USERNAME !== undefined && process.env.SMTP_PASSWORD !== undefined) {
|
|
config.auth = {
|
|
user: process.env.SMTP_USERNAME,
|
|
pass: process.env.SMTP_PASSWORD,
|
|
}
|
|
}
|
|
console.log('> EmailService: Transport created ', config)
|
|
return nodemailer.createTransport(config)
|
|
}
|
|
|
|
// static getMailgunClient(): Mailgun {
|
|
// return new Mailgun({
|
|
// apiKey: '4e64a894f18cc2fe10e4e4829b0048f3-7caa9475-241eee2c'
|
|
// })
|
|
// }
|
|
|
|
static nativeSend(params: any): Promise<any> {
|
|
// return this.getMailgunClient().sendMessage('sandboxeb2300b9439e4fe7bd2cca8f52ac7bd6.mailgun.org', {
|
|
// from: params.from,
|
|
// to: params.to,
|
|
// subject: params.subject,
|
|
// text: params.text,
|
|
// html: params.html
|
|
// })
|
|
if (EmailService.transporter === null) {
|
|
EmailService.transporter = EmailService.getTransporter()
|
|
}
|
|
return EmailService.transporter.sendMail(params)
|
|
}
|
|
|
|
static send(to: string, subject: string, templateName: string, templateParams: any): Promise<any> {
|
|
const viewPath: string = __dirname + '/../views/emails/'
|
|
const data: Buffer = fs.readFileSync(viewPath + templateName + '.twig')
|
|
const html: string = twig.twig({
|
|
// @ts-ignore
|
|
allowInlineIncludes: true,
|
|
data: data.toString()
|
|
}).render(templateParams)
|
|
const text: string = htmlToText.fromString(html, { wordwrap: 130 })
|
|
|
|
// for now replace every email by a predefined one
|
|
// console.info(to + ' replaced')
|
|
// to = "spamfree@matthieubessat.fr"
|
|
subject += " - Forum des associations 2020"
|
|
|
|
return new Promise((resolve, reject) => {
|
|
const config: any = {
|
|
from: '"Forum des associations - Espace Condorcet Centre Social" <ne-pas-repondre@espacecondorcet.org>',
|
|
to, subject, text, html
|
|
}
|
|
if (this.isMocked()) {
|
|
delete config.html
|
|
console.log(config)
|
|
resolve()
|
|
} else {
|
|
this.nativeSend(config).then(res => {
|
|
console.log('> A "' + templateName + '" email was sent to ' + to)
|
|
resolve(res)
|
|
}).catch(err => {
|
|
console.log('> A "' + templateName + '" email failed to be sent to ' + to)
|
|
console.error(err)
|
|
reject()
|
|
})
|
|
}
|
|
})
|
|
}
|
|
|
|
static getWebUiBaseUrl() {
|
|
return process.env.WEB_UI_URL === undefined ? "WEB_UI_URL_NOT_FOUND" : process.env.WEB_UI_URL
|
|
}
|
|
|
|
static getBaseUrl() {
|
|
return process.env.BASE_URL === undefined ? "BASE_URL_NOT_FOUND" : process.env.BASE_URL
|
|
}
|
|
|
|
static isMocked() {
|
|
// WARNING ATTENTION REQUIRED
|
|
// CUSTOM DESACTIVATION PLEASE ENABLE IN PRODUCTION
|
|
return process.env.MOCK_EMAIL === "true"
|
|
}
|
|
|
|
static getAdminAddress() {
|
|
return process.env.ADMIN_ADDRESS === undefined ? "ADMIN_ADDRESS_NOT_FOUND" : process.env.ADMIN_ADDRESS
|
|
}
|
|
} |