mirror of https://github.com/requarks/wiki
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
80 lines
2.2 KiB
80 lines
2.2 KiB
import nodemailer from 'nodemailer'
|
|
import { get } from 'lodash-es'
|
|
import path from 'node:path'
|
|
import { config } from '@vue-email/compiler'
|
|
|
|
export default {
|
|
vueEmail: null,
|
|
transport: null,
|
|
templates: {},
|
|
init() {
|
|
if (get(WIKI.config, 'mail.host', '').length > 2) {
|
|
let conf = {
|
|
host: WIKI.config.mail.host,
|
|
port: WIKI.config.mail.port,
|
|
name: WIKI.config.mail.name,
|
|
secure: WIKI.config.mail.secure,
|
|
tls: {
|
|
rejectUnauthorized: !(WIKI.config.mail.verifySSL === false)
|
|
}
|
|
}
|
|
if (get(WIKI.config, 'mail.user', '').length > 1) {
|
|
conf = {
|
|
...conf,
|
|
auth: {
|
|
user: WIKI.config.mail.user,
|
|
pass: WIKI.config.mail.pass
|
|
}
|
|
}
|
|
}
|
|
if (get(WIKI.config, 'mail.useDKIM', false)) {
|
|
conf = {
|
|
...conf,
|
|
dkim: {
|
|
domainName: WIKI.config.mail.dkimDomainName,
|
|
keySelector: WIKI.config.mail.dkimKeySelector,
|
|
privateKey: WIKI.config.mail.dkimPrivateKey
|
|
}
|
|
}
|
|
}
|
|
this.transport = nodemailer.createTransport(conf)
|
|
this.vueEmail = config(path.join(WIKI.SERVERPATH, 'templates/mail'), {
|
|
verbose: false,
|
|
options: {
|
|
baseUrl: WIKI.config.mail.defaultBaseURL
|
|
}
|
|
})
|
|
} else {
|
|
WIKI.logger.warn('Mail is not setup! Please set the configuration in the administration area!')
|
|
this.transport = null
|
|
}
|
|
return this
|
|
},
|
|
async send(opts) {
|
|
if (!this.transport) {
|
|
WIKI.logger.warn('Cannot send email because mail is not setup in the administration area!')
|
|
throw new Error('ERR_MAIL_NOT_CONFIGURED')
|
|
}
|
|
return this.transport.sendMail({
|
|
headers: {
|
|
'x-mailer': 'Wiki.js'
|
|
},
|
|
from: `"${WIKI.config.mail.senderName}" <${WIKI.config.mail.senderEmail}>`,
|
|
to: opts.to,
|
|
subject: opts.subject,
|
|
text: opts.text,
|
|
html: await this.loadTemplate(opts.template, opts.data)
|
|
})
|
|
},
|
|
async loadTemplate(key, opts = {}) {
|
|
try {
|
|
return this.vueEmail.render(`${key}.vue`, {
|
|
props: opts
|
|
})
|
|
} catch (err) {
|
|
WIKI.logger.warn(err)
|
|
throw new Error('ERR_MAIL_RENDER_FAILED')
|
|
}
|
|
}
|
|
}
|