forked from NodeBB/NodeBB
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathemailer.js
142 lines (115 loc) · 3.49 KB
/
emailer.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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
'use strict';
var SMTPServer = require('smtp-server').SMTPServer;
var assert = require('assert');
var fs = require('fs');
var path = require('path');
var Plugins = require('../src/plugins');
var Emailer = require('../src/emailer');
var Meta = require('../src/meta');
describe('emailer', function () {
var onMail = function (address, session, callback) { callback(); };
var onTo = function (address, session, callback) { callback(); };
var template = 'test';
var email = '[email protected]';
var language = 'en-GB';
var params = {
subject: 'Welcome to NodeBB',
};
before(function (done) {
var server = new SMTPServer({
allowInsecureAuth: true,
onAuth: function (auth, session, callback) {
callback(null, {
user: auth.username,
});
},
onMailFrom: function (address, session, callback) {
onMail(address, session, callback);
},
onRcptTo: function (address, session, callback) {
onTo(address, session, callback);
},
});
server.on('error', function (err) {
throw err;
});
server.listen(4000, done);
});
// TODO: test sendmail here at some point
it('plugin hook should work', function (done) {
var error = new Error();
Plugins.registerHook('emailer-test', {
hook: 'filter:email.send',
method: function (data, next) {
assert(data);
assert.equal(data.to, email);
assert.equal(data.subject, params.subject);
next(error);
},
});
Emailer.sendToEmail(template, email, language, params, function (err) {
assert.equal(err, error);
Plugins.unregisterHook('emailer-test', 'filter:email.send');
done();
});
});
it('should build custom template on config change', function (done) {
var text = 'a random string of text';
// make sure it's not already set
Emailer.renderAndTranslate('test', {}, 'en-GB', function (err, output) {
assert.ifError(err);
assert.notEqual(output, text);
Meta.configs.set('email:custom:test', text, function (err) {
assert.ifError(err);
// wait for pubsub stuff
setTimeout(function () {
Emailer.renderAndTranslate('test', {}, 'en-GB', function (err, output) {
assert.ifError(err);
assert.equal(output, text);
done();
});
}, 500);
});
});
});
it('should send via SMTP', function (done) {
var from = '[email protected]';
var username = '[email protected]';
onMail = function (address, session, callback) {
assert.equal(address.address, from);
assert.equal(session.user, username);
callback();
};
onTo = function (address, session, callback) {
assert.equal(address.address, email);
callback();
done();
};
Meta.configs.setMultiple({
'email:smtpTransport:enabled': '1',
'email:smtpTransport:user': username,
'email:smtpTransport:pass': 'anything',
'email:smtpTransport:service': 'nodebb-custom-smtp',
'email:smtpTransport:port': 4000,
'email:smtpTransport:host': 'localhost',
'email:smtpTransport:security': 'NONE',
'email:from': from,
}, function (err) {
assert.ifError(err);
// delay so emailer has a chance to update after config changes
setTimeout(function () {
assert.equal(Emailer.fallbackTransport, Emailer.transports.smtp);
Emailer.sendToEmail(template, email, language, params, function (err) {
assert.ifError(err);
});
}, 200);
});
});
after(function (done) {
fs.unlinkSync(path.join(__dirname, '../build/public/templates/emails/test.js'));
Meta.configs.setMultiple({
'email:smtpTransport:enabled': '0',
'email:custom:test': '',
}, done);
});
});