-
Notifications
You must be signed in to change notification settings - Fork 218
/
mailer.js
126 lines (101 loc) · 3.28 KB
/
mailer.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
/**
* mailer
*/
module.exports = function(crowi) {
const debug = require('debug')('growi:lib:mailer');
const nodemailer = require('nodemailer');
const swig = require('swig-templates');
const { configManager, appService } = crowi;
const mailConfig = {};
let mailer = {};
function createSMTPClient(option) {
debug('createSMTPClient option', option);
if (!option) {
option = { // eslint-disable-line no-param-reassign
host: configManager.getConfig('crowi', 'mail:smtpHost'),
port: configManager.getConfig('crowi', 'mail:smtpPort'),
};
if (configManager.getConfig('crowi', 'mail:smtpUser') && configManager.getConfig('crowi', 'mail:smtpPassword')) {
option.auth = {
user: configManager.getConfig('crowi', 'mail:smtpUser'),
pass: configManager.getConfig('crowi', 'mail:smtpPassword'),
};
}
if (option.port === 465) {
option.secure = true;
}
}
option.tls = { rejectUnauthorized: false };
const client = nodemailer.createTransport(option);
debug('mailer set up for SMTP', client);
return client;
}
function createSESClient(option) {
if (!option) {
option = { // eslint-disable-line no-param-reassign
accessKeyId: configManager.getConfig('crowi', 'aws:accessKeyId'),
secretAccessKey: configManager.getConfig('crowi', 'aws:secretAccessKey'),
};
}
const ses = require('nodemailer-ses-transport');
const client = nodemailer.createTransport(ses(option));
debug('mailer set up for SES', client);
return client;
}
function initialize() {
if (!configManager.getConfig('crowi', 'mail:from')) {
mailer = undefined;
return;
}
if (configManager.getConfig('crowi', 'mail:smtpHost') && configManager.getConfig('crowi', 'mail:smtpPort')
) {
// SMTP 設定がある場合はそれを優先
mailer = createSMTPClient();
}
else if (configManager.getConfig('crowi', 'aws:accessKeyId') && configManager.getConfig('crowi', 'aws:secretAccessKey')) {
// AWS 設定がある場合はSESを設定
mailer = createSESClient();
}
else {
mailer = undefined;
}
mailConfig.from = configManager.getConfig('crowi', 'mail:from');
mailConfig.subject = `${appService.getAppTitle()}からのメール`;
debug('mailer initialized');
}
function setupMailConfig(overrideConfig) {
const c = overrideConfig;
let mc = {};
mc = mailConfig;
mc.to = c.to;
mc.from = c.from || mailConfig.from;
mc.text = c.text;
mc.subject = c.subject || mailConfig.subject;
return mc;
}
function send(config, callback) {
if (mailer) {
const templateVars = config.vars || {};
return swig.renderFile(
config.template,
templateVars,
(err, output) => {
if (err) {
throw err;
}
config.text = output;
return mailer.sendMail(setupMailConfig(config), callback);
},
);
}
debug('Mailer is not completed to set up. Please set up SMTP or AWS setting.');
return callback(new Error('Mailer is not completed to set up. Please set up SMTP or AWS setting.'), null);
}
initialize();
return {
createSMTPClient,
createSESClient,
mailer,
send,
};
};