@tiledesk/tiledesk-server 2.1.41 → 2.2.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (85) hide show
  1. package/.circleci/config.yml +54 -0
  2. package/.env.sample +1 -1
  3. package/.github/workflows/docker-community-push-latest.yml +22 -0
  4. package/.github/workflows/{docker-image-push.yml → docker-image-en-tag-push.yml} +1 -1
  5. package/.github/workflows/docker-image-tag-community-tag-push.yml +21 -0
  6. package/.github/workflows/{docker-push-latest.yml → docker-push-en-push-latest.yml} +1 -1
  7. package/CHANGELOG.md +198 -1
  8. package/Dockerfile +1 -1
  9. package/Dockerfile-en +1 -1
  10. package/README.md +5 -7
  11. package/app.js +12 -1
  12. package/channels/chat21/chat21Contact.js +34 -8
  13. package/channels/chat21/chat21Handler.js +48 -5
  14. package/channels/chat21/chat21WebHook.js +34 -5
  15. package/channels/chat21/nativeauth.js +2 -2
  16. package/config/email.js +2 -1
  17. package/config/global.js +3 -0
  18. package/config/labels/widget.json +170 -16
  19. package/event/messageEvent.js +18 -1
  20. package/middleware/passport.js +10 -4
  21. package/models/actionsConstants.js +7 -0
  22. package/models/department.js +3 -0
  23. package/models/faq.js +8 -2
  24. package/models/faq_kb.js +6 -0
  25. package/models/message.js +10 -4
  26. package/models/messageConstants.js +3 -3
  27. package/models/request.js +33 -3
  28. package/package.json +31 -28
  29. package/pubmodules/emailNotification/requestNotification.js +380 -62
  30. package/pubmodules/messageActions/messageActionsInterceptor.js +20 -7
  31. package/pubmodules/messageTransformer/index.js +1 -1
  32. package/pubmodules/messageTransformer/microLanguageAttributesTransformerInterceptor.js +67 -0
  33. package/pubmodules/pubModulesManager.js +66 -14
  34. package/pubmodules/rules/conciergeBot.js +81 -49
  35. package/routes/auth.js +34 -10
  36. package/routes/campaigns.js +117 -25
  37. package/routes/faq.js +19 -0
  38. package/routes/faq_kb.js +13 -4
  39. package/routes/faqpub.js +1 -1
  40. package/routes/images.js +1 -1
  41. package/routes/jwt.js +0 -1
  42. package/routes/logs.js +26 -0
  43. package/routes/message.js +7 -2
  44. package/routes/messagesRoot.js +73 -16
  45. package/routes/project_user.js +36 -1
  46. package/routes/request.js +88 -12
  47. package/routes/requestUtilRoot.js +30 -0
  48. package/routes/urls.js +12 -0
  49. package/routes/users.js +5 -1
  50. package/services/BotSubscriptionNotifier.js +1 -0
  51. package/services/departmentService.js +29 -5
  52. package/services/emailService.js +1103 -298
  53. package/services/faqBotHandler.js +176 -61
  54. package/services/faqBotSupport.js +181 -117
  55. package/services/faqService.js +17 -14
  56. package/services/messageService.js +57 -9
  57. package/services/modulesManager.js +86 -23
  58. package/services/requestService.js +58 -17
  59. package/template/email/assignedEmailMessage.html +205 -0
  60. package/template/email/assignedRequest.html +44 -14
  61. package/template/email/beenInvitedExistingUser.html +2 -2
  62. package/template/email/beenInvitedNewUser.html +1 -1
  63. package/template/email/newMessage.html +31 -12
  64. package/template/email/passwordChanged.html +2 -3
  65. package/template/email/pooledEmailMessage.html +208 -0
  66. package/template/email/pooledRequest.html +41 -14
  67. package/template/email/resetPassword.html +2 -3
  68. package/template/email/sendTranscript.html +1 -1
  69. package/template/email/test.html +1 -1
  70. package/template/email/ticket.html +78 -52
  71. package/template/email/ticket.txt +5 -1
  72. package/template/email/verify.html +1 -1
  73. package/test/authentication.js +76 -4
  74. package/test/authenticationJwt.js +76 -2
  75. package/test/campaignsRoute.js +226 -0
  76. package/test/faqService.js +3 -3
  77. package/test/faqkbRoute.js +3 -2
  78. package/test/messageRootRoute.js +193 -0
  79. package/test/messageRoute.js +75 -0
  80. package/test/messageService.js +5 -5
  81. package/test/requestRoute.js +27 -9
  82. package/test/requestService.js +472 -11
  83. package/test-int/bot.js +673 -8
  84. package/websocket/webSocketServer.js +7 -4
  85. package/template/email/ticket-taking.txt +0 -7
@@ -2,8 +2,18 @@
2
2
 
3
3
  const nodemailer = require('nodemailer');
4
4
  var config = require('../config/email');
5
+ var configGlobal = require('../config/global');
5
6
  var winston = require('../config/winston');
7
+ var marked = require('marked');
6
8
  var handlebars = require('handlebars');
9
+ var encode = require('html-entities').encode;
10
+
11
+ handlebars.registerHelper('ifEquals', function(arg1, arg2, options) {
12
+ return (arg1 == arg2) ? options.fn(this) : options.inverse(this);
13
+ });
14
+
15
+ // var options = {};
16
+ // handlebars.registerHelper('markdown', markdown(options));
7
17
 
8
18
  // handlebars.registerHelper('ifCond', function(v1, v2, options) {
9
19
  // if(v1 === v2) {
@@ -29,16 +39,28 @@ const maskOptions = {
29
39
  unmaskedEndDigits : 3 // Should be positive Integer
30
40
  };
31
41
 
42
+ // const X_REQUEST_ID_HEADER_KEY = "X-TILEDESK-REQUEST-ID";
43
+ // const X_TICKET_ID_HEADER_KEY = "X-TILEDESK-TICKET-ID";
44
+ // const X_PROJECT_ID_HEADER_KEY = "X-TILEDESK-PROJECT-ID";
45
+
46
+ const MESSAGE_ID_DOMAIN = "tiledesk.com";
32
47
 
33
48
  class EmailService {
34
49
 
35
50
  constructor() {
36
51
 
37
- this.enabled = process.env.EMAIL_ENABLED || false;
52
+ this.enabled = false;
53
+ if (process.env.EMAIL_ENABLED ==="true" || process.env.EMAIL_ENABLED === true ) {
54
+ this.enabled = true;
55
+ }
56
+
38
57
  winston.info('EmailService enabled: '+ this.enabled);
39
58
 
40
59
  this.baseUrl = process.env.EMAIL_BASEURL || config.baseUrl;
41
60
  winston.info('EmailService baseUrl: '+ this.baseUrl);
61
+
62
+ this.apiUrl = process.env.API_URL || configGlobal.apiUrl;
63
+ winston.info('EmailService apiUrl: '+ this.apiUrl);
42
64
 
43
65
  this.from = process.env.EMAIL_FROM_ADDRESS || config.from;
44
66
  winston.info('EmailService from email: '+ this.from);
@@ -46,28 +68,38 @@ class EmailService {
46
68
  this.bcc = process.env.EMAIL_BCC || config.bcc;
47
69
  winston.info('EmailService bcc address: '+ this.bcc);
48
70
 
71
+ this.replyEnabled = config.replyEnabled;
72
+ if (process.env.EMAIL_REPLY_ENABLED === "true" || process.env.EMAIL_REPLY_ENABLED === true ) {
73
+ this.replyEnabled = true;
74
+ }
75
+ winston.info('EmailService replyEnabled : '+ this.replyEnabled);
76
+
77
+ // this is used as fixed reply to url, but this is unused we always return support-group-dynamic
49
78
  this.replyTo = process.env.EMAIL_REPLY_TO || config.replyTo;
50
79
  winston.info('EmailService replyTo address: '+ this.replyTo);
51
80
 
52
- this.replyToDomain = process.env.EMAIL_REPLY_TO_DOMAIN || config.replyToDomain;
53
- winston.info('EmailService replyToDomain : '+ this.replyToDomain);
81
+ this.inboundDomain = process.env.EMAIL_INBOUND_DOMAIN || config.inboundDomain;
82
+ winston.info('EmailService inboundDomain : '+ this.inboundDomain);
83
+
84
+ this.inboundDomainDomainWithAt = "@"+this.inboundDomain;
85
+ winston.verbose('EmailService inboundDomainDomainWithAt : '+ this.inboundDomainDomainWithAt);
54
86
 
55
- this.emailPassword = process.env.EMAIL_PASSWORD;
87
+ this.pass = process.env.EMAIL_PASSWORD;
56
88
 
57
89
  var maskedemailPassword;
58
- if (this.emailPassword) {
59
- maskedemailPassword = MaskData.maskPhone(this.emailPassword, maskOptions);
90
+ if (this.pass) {
91
+ maskedemailPassword = MaskData.maskPhone(this.pass, maskOptions);
60
92
  }else {
61
- maskedemailPassword = this.emailPassword;
93
+ maskedemailPassword = this.pass;
62
94
  }
63
95
 
64
- winston.info('EmailService emailPassword: ' + maskedemailPassword);
96
+ winston.info('EmailService pass: ' + maskedemailPassword);
65
97
 
66
98
  this.host = process.env.EMAIL_HOST || config.host;
67
99
  winston.info('EmailService host: ' + this.host);
68
100
 
69
- this.secureEmail = process.env.EMAIL_SECURE || false;
70
- winston.info('EmailService secureEmail: ' + this.secureEmail);
101
+ this.secure = process.env.EMAIL_SECURE || false;
102
+ winston.info('EmailService secure: ' + this.secure);
71
103
 
72
104
  this.user = process.env.EMAIL_USERNAME || config.username;
73
105
  winston.info('EmailService username: ' + this.user);
@@ -75,42 +107,110 @@ class EmailService {
75
107
  this.port = process.env.EMAIL_PORT;
76
108
  winston.info('EmailService port: ' + this.port);
77
109
 
78
- }
79
110
 
111
+ this.markdown = process.env.EMAIL_MARKDOWN || true;
112
+ winston.info('EmailService markdown: '+ this.markdown);
80
113
 
81
- readTemplateFile(templateName, callback) {
82
- fs.readFile(appRoot + '/template/email/'+templateName, {encoding: 'utf-8'}, function (err, html) {
83
- if (err) {
84
- winston.error('error readTemplateFile getting ', err);
85
- callback(err);
86
- }
87
- else {
88
- callback(null, html);
89
- }
114
+ this.headers = {
115
+ // "X-Mailer": "Tiledesk Mailer",
116
+ }
117
+ winston.info('EmailService headers: ' + JSON.stringify(this.headers));
118
+
119
+ }
120
+
121
+ readTemplate(templateName, settings) {
122
+ var that = this;
123
+ winston.debug('EmailService readTemplate: '+ templateName + ' ' + JSON.stringify(settings));
124
+
125
+ if (settings && settings.email && settings.email.templates) {
126
+ var templates = settings.email.templates;
127
+ winston.debug('EmailService templates: ',templates);
128
+ var template = templates[templateName];
129
+ winston.debug('EmailService template: '+template);
130
+ if (template) {
131
+ // that.callback(template);
132
+ return new Promise(function (resolve, reject) {
133
+ return resolve(template);
134
+ });
135
+ }else {
136
+ return that.readTemplateFile(templateName);
137
+ }
138
+ } else {
139
+ return that.readTemplateFile(templateName);
140
+ }
141
+ }
142
+ readTemplateFile(templateName) {
143
+ // var that = this;
144
+ return new Promise(function (resolve, reject) {
145
+ fs.readFile(appRoot + '/template/email/'+templateName, {encoding: 'utf-8'}, function (err, html) {
146
+ if (err) {
147
+ winston.error('error readTemplateFile getting ', err);
148
+ // callback(err);
149
+ return reject(err);
150
+ }
151
+ else {
152
+ // callback(null, html);
153
+ return resolve(html);
154
+ }
155
+ });
90
156
  });
91
157
  };
92
158
 
93
159
 
94
- getTransport() {
160
+ getTransport(configEmail) {
161
+
162
+ if (configEmail === undefined) {
163
+ configEmail = {
164
+ host: this.host,
165
+ port: this.port, // defaults to 587 if is secure is false or 465 if true
166
+ secure: this.secure,
167
+ user: this.user,
168
+ pass: this.pass
169
+ }
170
+ winston.debug("getTransport initialized with default");
171
+ } else {
172
+ winston.verbose("getTransport custom", configEmail);
173
+ }
95
174
 
175
+ winston.debug("getTransport configEmail: "+ JSON.stringify(configEmail));
96
176
 
97
- // create reusable transporter object using the default SMTP transport
98
- let transporter = nodemailer.createTransport({
99
- host: this.host,
100
- port: this.port, // defaults to 587 if is secure is false or 465 if true
101
- secure: this.secureEmail,
177
+ let transport = {
178
+ host: configEmail.host,
179
+ port: configEmail.port, // defaults to 587 if is secure is false or 465 if true
180
+ secure: configEmail.secure,
102
181
  auth: {
103
- user: this.user,
104
- pass: this.emailPassword
182
+ user: configEmail.user,
183
+ pass: configEmail.pass
184
+ },
185
+
186
+ // openssl genrsa -out dkim_private.pem 2048
187
+ // openssl rsa -in dkim_private.pem -pubout -outform der 2>/dev/null | openssl base64 -A
188
+ // ->
189
+ // v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAunT2EopDAYnHwAOHd33KhlzjUXJfhmA+fK+cG85i9Pm33oyv1NoGrOynsni0PO6j7oRxxHqs6EMDOw4I/Q0C7aWn20oBomJZehTOkCV2xpuPKESiRktCe/MIZqbkRdypis4jSkFfFFkBHwgkAg5tb11E9elJap0ed/lN5/XlpGedqoypKxp+nEabgYO5mBMMNKRvbHx0eQttRYyIaNkTuMbAaqs4y3TkHOpGvZTJsvUonVMGAstSCfUmXnjF38aKpgyTausTSsxHbaxh3ieUB4ex+svnvsJ4Uh5Skklr+bxLVEHeJN55rxmV67ytLg5XCRWqdKIcJHFvSlm2YwJfcwIDAQABMacAL
190
+ // testdkim._domainkey.tiledesk.com. 86400 IN TXT "v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAunT2EopDAYnHwAOHd33KhlzjUXJfhmA+fK+cG85i9Pm33oyv1NoGrOynsni0PO6j7oRxxHqs6EMDOw4I/Q0C7aWn20oBomJZehTOkCV2xpuPKESiRktCe/MIZqbkRdypis4jSkFfFFkBHwgkAg5tb11E9elJap0ed/lN5/XlpGedqoypKxp+nEabgYO5mBMMNKRvbHx0eQttRYyIaNkTuMbAaqs4y3TkHOpGvZTJsvUonVMGAstSCfUmXnjF38aKpgyTausTSsxHbaxh3ieUB4ex+svnvsJ4Uh5Skklr+bxLVEHeJN55rxmV67ytLg5XCRWqdKIcJHFvSlm2YwJfcwIDAQABMacAL"
191
+
192
+ dkim: {
193
+ domainName: "example.com",
194
+ keySelector: "2017",
195
+ privateKey: "-----BEGIN PRIVATE KEY-----\nMIIEvgIBADANBg...",
196
+ cacheDir: "/tmp",
197
+ cacheTreshold: 100 * 1024
105
198
  }
106
- });
199
+ };
200
+
201
+ winston.debug("getTransport transport: ",transport);
202
+
203
+ // create reusable transporter object using the default SMTP transport
204
+ let transporter = nodemailer.createTransport(transport);
107
205
  return transporter;
108
206
  }
109
207
 
110
- send(to, subject, html) {
111
- return this.sendMail({to:to, subject:subject, html:html});
112
- }
113
- sendMail(mail) {
208
+ // @deprecated
209
+ // send(to, subject, html) {
210
+ // return this.sendMail({to:to, subject:subject, html:html});
211
+ // }
212
+
213
+ send(mail) {
114
214
 
115
215
  if (!this.enabled) {
116
216
  winston.info('EmailService is disabled. Not sending email');
@@ -120,16 +220,22 @@ class EmailService {
120
220
  return winston.warn("EmailService not sending email for testing");
121
221
  }
122
222
 
123
-
124
-
125
223
  let mailOptions = {
126
224
  from: mail.from || this.from, // sender address
127
225
  to: mail.to,
226
+ cc: mail.cc,
128
227
  // bcc: config.bcc,
129
228
  replyTo: mail.replyTo || this.replyTo,
229
+ inReplyTo: mail.inReplyTo,
230
+ references: mail.references,
130
231
  subject: mail.subject, // Subject line
131
232
  text: mail.text, // plain text body
132
- html: mail.html
233
+ html: mail.html,
234
+
235
+ headers: mail.headers || this.headers,
236
+
237
+ messageId: mail.messageId,
238
+ sender: mail.sender
133
239
  };
134
240
 
135
241
  winston.debug('mailOptions', mailOptions);
@@ -139,11 +245,12 @@ class EmailService {
139
245
  }
140
246
 
141
247
  // send mail with defined transport object
142
- this.getTransport().sendMail(mailOptions, (error, info) => {
248
+ this.getTransport(mail.config).sendMail(mailOptions, (error, info) => {
143
249
  if (error) {
144
250
  return winston.error("Error sending email ", {error:error, mailOptions:mailOptions});
145
251
  }
146
- winston.debug('Email sent: %s', info);
252
+ winston.verbose('Email sent:', {info: info});
253
+ winston.debug('Email sent:', {info: info, mailOptions: mailOptions});
147
254
  // Preview only available when sending through an Ethereal account
148
255
  // winston.debug('Preview URL: %s', nodemailer.getTestMessageUrl(info));
149
256
 
@@ -153,215 +260,912 @@ class EmailService {
153
260
  }
154
261
 
155
262
 
156
- sendTest(to) {
263
+ async sendTest(to) {
157
264
 
158
265
  var that = this;
159
266
 
160
- this.readTemplateFile('test.html', function(err, html) {
267
+ var html = await this.readTemplateFile('test.html');
161
268
 
162
- var template = handlebars.compile(html);
269
+ var template = handlebars.compile(html);
163
270
 
164
- var replacements = {
165
- user: {name: "andrea"},
166
- enabled: true
167
- };
271
+ var replacements = {
272
+ user: {name: "andrea"},
273
+ enabled: true
274
+ };
168
275
 
169
- var html = template(replacements);
276
+ var html = template(replacements);
170
277
 
171
- that.send(to, `TileDesk test email`, html);
278
+ that.send({to:to, subject:`TileDesk test email`,html: html});
279
+
280
+ //that.send(that.bcc, `TileDesk test email - notification`, html);
172
281
 
173
- that.send(that.bcc, `TileDesk test email - notification`, html);
174
282
 
175
- });
176
-
177
283
 
178
284
 
179
285
  }
180
286
 
181
287
 
182
- // ok
183
- sendNewAssignedRequestNotification(to, savedRequest, project) {
288
+
289
+ async sendNewAssignedRequestNotification(to, request, project) {
184
290
 
185
291
  var that = this;
186
292
 
187
- this.readTemplateFile('assignedRequest.html', function(err, html) {
293
+ //if the request came from rabbit mq?
294
+ if (request.toJSON) {
295
+ request = request.toJSON();
296
+ }
188
297
 
298
+ if (project.toJSON) {
299
+ project = project.toJSON();
300
+ }
189
301
 
190
- var envTemplate = process.env.EMAIL_ASSIGN_REQUEST_HTML_TEMPLATE;
191
- winston.debug("envTemplate: " + envTemplate);
302
+ var html = await this.readTemplate('assignedRequest.html', project.settings);
192
303
 
193
- if (envTemplate) {
194
- html = envTemplate;
195
- }
304
+ var envTemplate = process.env.EMAIL_ASSIGN_REQUEST_HTML_TEMPLATE;
305
+ winston.debug("envTemplate: " + envTemplate);
196
306
 
197
- winston.debug("html: " + html);
307
+ if (envTemplate) {
308
+ html = envTemplate;
309
+ }
198
310
 
199
- var template = handlebars.compile(html);
311
+ winston.debug("html: " + html);
200
312
 
201
- var baseScope = JSON.parse(JSON.stringify(that));
202
- delete baseScope.emailPassword;
313
+ var template = handlebars.compile(html);
314
+
315
+ var baseScope = JSON.parse(JSON.stringify(that));
316
+ delete baseScope.pass;
203
317
 
204
- // passa anche tutti i messages in modo da stampare tutto
318
+ // passa anche tutti i messages in modo da stampare tutto
205
319
  // Stampa anche contact.email
206
320
 
207
- var replacements = {
208
- savedRequest: savedRequest.toJSON(),
209
- project: project.toJSON(),
210
- baseScope: baseScope
211
- };
212
321
 
213
- winston.debug("replacements ", replacements);
322
+ let msgText = request.first_text;//.replace(/[\n\r]/g, '<br>');
323
+ // winston.verbose("msgText: " + msgText);
324
+ msgText = encode(msgText);
325
+ // winston.verbose("msgText: " + msgText);
326
+ if (this.markdown) {
327
+ msgText = marked(msgText);
328
+ }
329
+
330
+
331
+ winston.debug("msgText: " + msgText);
332
+
333
+ var replacements = {
334
+ request: request,
335
+ project: project,
336
+ msgText: msgText,
337
+ baseScope: baseScope,
338
+ // tools: {marked:marked}
339
+ };
214
340
 
215
- var html = template(replacements);
216
- winston.debug("html after: " + html);
341
+ winston.debug("replacements ", replacements);
217
342
 
343
+ var html = template(replacements);
344
+ winston.debug("html after: " + html);
218
345
 
219
- that.send(to, `[TileDesk ${project ? project.name : '-'}] New Assigned Request`, html);
346
+
347
+ let messageId = "notification" + "@" + MESSAGE_ID_DOMAIN;
220
348
 
221
- that.send(that.bcc, `[TileDesk ${project ? project.name : '-'}] New Assigned Request ${to} - notification`, html);
349
+ let replyTo;
350
+ if (this.replyEnabled) { //fai anche per gli altri
351
+ replyTo = request.request_id + this.inboundDomainDomainWithAt;
352
+ }
222
353
 
354
+ let headers;
355
+ if (request) {
356
+
357
+ messageId = request.request_id + "+" + messageId;
358
+
359
+ if (request.attributes && request.attributes.email_replyTo) {
360
+ replyTo = request.attributes.email_replyTo;
361
+ }
362
+
363
+ headers = {
364
+ "X-TILEDESK-PROJECT-ID": project._id,
365
+ "X-TILEDESK-REQUEST-ID": request.request_id,
366
+ "X-TILEDESK-TICKET-ID":request.ticket_id,
367
+ };
368
+
369
+ winston.verbose("messageId: " + messageId);
370
+ winston.verbose("replyTo: " + replyTo);
371
+ winston.verbose("email headers", headers);
372
+ }
373
+
374
+ let inReplyTo;
375
+ let references;
376
+ if (request.attributes) {
377
+ if (request.attributes.email_messageId) {
378
+ inReplyTo = request.attributes.email_messageId;
379
+ }
380
+ if (request.attributes.email_references) {
381
+ references = request.attributes.email_references;
382
+ }
383
+ }
384
+ winston.verbose("email inReplyTo: "+ inReplyTo);
385
+ winston.verbose("email references: "+ references);
386
+
387
+ let from;
388
+ let configEmail;
389
+ if (project && project.settings && project.settings.email) {
390
+ if (project.settings.email.config) {
391
+ configEmail = project.settings.email.config;
392
+ winston.verbose("custom email configEmail setting found: ", configEmail);
393
+ }
394
+ if (project.settings.email.from) {
395
+ from = project.settings.email.from;
396
+ winston.verbose("custom from email setting found: "+ from);
397
+ }
398
+ }
399
+
400
+ let subject = `[TileDesk ${project ? project.name : '-'}] New Assigned Chat`;
401
+
402
+ if (request.subject) {
403
+ subject = `[TileDesk ${project ? project.name : '-'}] ${request.subject}`;
404
+ }
405
+
406
+ // if (request.ticket_id) {
407
+ // subject = `[Ticket #${request.ticket_id}] New Assigned Chat`;
408
+ // }
409
+
410
+ // if (request.ticket_id && request.subject) {
411
+ // subject = `[Ticket #${request.ticket_id}] ${request.subject}`;
412
+ // }
413
+
414
+ that.send({
415
+ messageId: messageId,
416
+ from:from,
417
+ to:to,
418
+ replyTo: replyTo,
419
+ subject: subject,
420
+ html:html,
421
+ config: configEmail,
422
+ headers:headers
223
423
  });
424
+
425
+ messageId = "notification" + messageId;
426
+
427
+
428
+ // togliere bcc
429
+ that.send({
430
+ messageId: messageId,
431
+ to: that.bcc,
432
+ replyTo: replyTo,
433
+ subject: subject + ` ${to} - notification`,
434
+ html:html,
435
+ headers:headers
436
+ });
437
+
224
438
 
225
439
  }
226
440
 
227
- // ok
228
- sendNewPooledRequestNotification(to, savedRequest, project) {
441
+
442
+ async sendNewAssignedAgentMessageEmailNotification(to, request, project, message) {
229
443
 
230
444
  var that = this;
231
445
 
232
- this.readTemplateFile('pooledRequest.html', function(err, html) {
446
+ //if the request came from rabbit mq?
447
+ if (request.toJSON) {
448
+ request = request.toJSON();
449
+ }
450
+
451
+ if (project.toJSON) {
452
+ project = project.toJSON();
453
+ }
454
+
455
+ var html = await this.readTemplate('assignedEmailMessage.html', project.settings);
233
456
 
234
457
 
235
- var envTemplate = process.env.EMAIL_POOLED_REQUEST_HTML_TEMPLATE;
236
- winston.debug("envTemplate: " + envTemplate);
458
+ var envTemplate = process.env.EMAIL_ASSIGN_MESSAGE_EMAIL_HTML_TEMPLATE;
459
+ winston.debug("envTemplate: " + envTemplate);
237
460
 
238
- if (envTemplate) {
239
- html = envTemplate;
461
+ if (envTemplate) {
462
+ html = envTemplate;
463
+ }
464
+
465
+ winston.debug("html: " + html);
466
+
467
+ var template = handlebars.compile(html);
468
+
469
+ var baseScope = JSON.parse(JSON.stringify(that));
470
+ delete baseScope.pass;
471
+
472
+ // passa anche tutti i messages in modo da stampare tutto
473
+ // Stampa anche contact.email
474
+
475
+ let msgText = message.text;//.replace(/[\n\r]/g, '<br>');
476
+ msgText = encode(msgText);
477
+ if (this.markdown) {
478
+ msgText = marked(msgText);
479
+ }
480
+
481
+ winston.debug("msgText: " + msgText);
482
+
483
+ var replacements = {
484
+ request: request,
485
+ project: project,
486
+ message: message,
487
+ msgText: msgText,
488
+ baseScope: baseScope
489
+ };
490
+
491
+ winston.debug("replacements ", replacements);
492
+
493
+ var html = template(replacements);
494
+ winston.debug("html after: " + html);
495
+
496
+
497
+ let messageId = message._id + "@" + MESSAGE_ID_DOMAIN;
498
+
499
+ let replyTo;
500
+ if (this.replyEnabled) {
501
+ replyTo = message.request.request_id + this.inboundDomainDomainWithAt;
502
+ }
503
+
504
+ let headers;
505
+ if (message.request) {
506
+
507
+ messageId = message.request.request_id + "+" + messageId;
508
+
509
+ if (message.request.attributes && message.request.attributes.email_replyTo) {
510
+ replyTo = message.request.attributes.email_replyTo;
511
+ }
512
+
513
+ headers = {"X-TILEDESK-PROJECT-ID": project._id, "X-TILEDESK-REQUEST-ID": message.request.request_id, "X-TILEDESK-TICKET-ID":message.request.ticket_id };
514
+
515
+ winston.verbose("sendNewAssignedAgentMessageEmailNotification messageId: " + messageId);
516
+ winston.verbose("sendNewAssignedAgentMessageEmailNotification replyTo: " + replyTo);
517
+ winston.verbose("sendNewAssignedAgentMessageEmailNotification email headers", headers);
518
+ }
519
+
520
+ let inReplyTo;
521
+ let references;
522
+ if (message.attributes) {
523
+ if (message.attributes.email_messageId) {
524
+ inReplyTo = message.attributes.email_messageId;
525
+ }
526
+ if (message.attributes.email_references) {
527
+ references = message.attributes.email_references;
528
+ }
529
+ }
530
+ winston.verbose("sendNewAssignedAgentMessageEmailNotification email inReplyTo: "+ inReplyTo);
531
+ winston.verbose("sendNewAssignedAgentMessageEmailNotification email references: "+ references);
532
+
533
+ let from;
534
+ let configEmail;
535
+ if (project && project.settings && project.settings.email) {
536
+ if (project.settings.email.config) {
537
+ configEmail = project.settings.email.config;
538
+ winston.verbose("sendNewAssignedAgentMessageEmailNotification custom email configEmail setting found: ", configEmail);
539
+ }
540
+ if (project.settings.email.from) {
541
+ from = project.settings.email.from;
542
+ winston.verbose("sendNewAssignedAgentMessageEmailNotification custom from email setting found: "+ from);
240
543
  }
544
+ }
241
545
 
242
- winston.debug("html: " + html);
243
546
 
244
- var template = handlebars.compile(html);
547
+ let subject = `[TileDesk ${project ? project.name : '-'}] New message`;
548
+
549
+ if (request.subject) {
550
+ subject = `[TileDesk ${project ? project.name : '-'}] ${request.subject}`;
551
+ }
552
+ if (request.ticket_id) {
553
+ subject = `[Ticket #${request.ticket_id}] New message`;
554
+ }
555
+
556
+ if (request.ticket_id && request.subject) {
557
+ subject = `[Ticket #${request.ticket_id}] ${request.subject}`;
558
+ }
559
+
245
560
 
246
- var baseScope = JSON.parse(JSON.stringify(that));
247
- delete baseScope.emailPassword;
561
+
562
+ that.send({
563
+ messageId: messageId,
564
+ from:from,
565
+ to:to,
566
+ replyTo: replyTo,
567
+ // inReplyTo: inReplyTo,???
568
+ // references: references,??
569
+ subject: subject,
570
+ html:html,
571
+ config: configEmail,
572
+ headers:headers
573
+ });
574
+
575
+
576
+
577
+ messageId = "notification" + messageId;
578
+
579
+ that.send({
580
+ messageId: messageId,
581
+ to: that.bcc,
582
+ replyTo: replyTo,
583
+ subject: subject + ` - notification`,
584
+ html:html,
585
+ headers:headers
586
+ });
587
+
588
+
589
+ }
590
+
591
+
592
+ async sendNewPooledRequestNotification(to, request, project) {
593
+
594
+ //if the request came from rabbit mq?
595
+ if (request.toJSON) {
596
+ request = request.toJSON();
597
+ }
598
+
599
+ if (project.toJSON) {
600
+ project = project.toJSON();
601
+ }
602
+
603
+ var that = this;
604
+
605
+ var html = await this.readTemplate('pooledRequest.html', project.settings);
606
+
607
+ var envTemplate = process.env.EMAIL_POOLED_REQUEST_HTML_TEMPLATE;
608
+ winston.debug("envTemplate: " + envTemplate);
609
+
610
+ if (envTemplate) {
611
+ html = envTemplate;
612
+ }
613
+
614
+ winston.debug("html: " + html);
615
+
616
+ var template = handlebars.compile(html);
617
+
618
+ var baseScope = JSON.parse(JSON.stringify(that));
619
+ delete baseScope.pass;
248
620
 
249
621
  // passa anche tutti i messages in modo da stampare tutto
250
622
  // Stampa anche contact.email
251
- var replacements = {
252
- savedRequest: savedRequest.toJSON(),
253
- project: project.toJSON(),
254
- baseScope: baseScope
255
- };
256
623
 
257
- var html = template(replacements);
624
+ let msgText = request.first_text;//.replace(/[\n\r]/g, '<br>');
625
+ msgText = encode(msgText);
626
+ if (this.markdown) {
627
+ msgText = marked(msgText);
628
+ }
258
629
 
630
+ winston.verbose("msgText: " + msgText);
259
631
 
260
- that.send(to, `[TileDesk ${project ? project.name : '-'}] New Pooled Request`, html);
261
- // this.send(config.bcc, `[TileDesk ${project ? project.name : '-'}] New Pooled Request`, html);
632
+ var replacements = {
633
+ request: request,
634
+ project: project,
635
+ msgText: msgText,
636
+ baseScope: baseScope
637
+ };
638
+
639
+ var html = template(replacements);
262
640
 
641
+
642
+ let messageId = "notification-pooled" + new Date().getTime() + "@" + MESSAGE_ID_DOMAIN;
643
+
644
+ let replyTo;
645
+ if (this.replyEnabled) {
646
+ replyTo = request.request_id + this.inboundDomainDomainWithAt;
647
+ }
648
+
649
+ let headers;
650
+ if (request) {
651
+
652
+ messageId = request.request_id + "+" + messageId;
653
+
654
+ if (request.attributes && request.attributes.email_replyTo) {
655
+ replyTo = request.attributes.email_replyTo;
656
+ }
657
+
658
+ headers = {"X-TILEDESK-PROJECT-ID": project._id, "X-TILEDESK-REQUEST-ID": request.request_id, "X-TILEDESK-TICKET-ID":request.ticket_id };
659
+
660
+ winston.verbose("sendNewPooledRequestNotification messageId: " + messageId);
661
+ winston.verbose("sendNewPooledRequestNotification replyTo: " + replyTo);
662
+ winston.verbose("sendNewPooledRequestNotification email headers", headers);
663
+ }
664
+
665
+ let inReplyTo;
666
+ let references;
667
+ if (request.attributes) {
668
+ if (request.attributes.email_messageId) {
669
+ inReplyTo = request.attributes.email_messageId;
670
+ }
671
+ if (request.attributes.email_references) {
672
+ references = request.attributes.email_references;
673
+ }
674
+ }
675
+ winston.verbose("sendNewPooledRequestNotification email inReplyTo: "+ inReplyTo);
676
+ winston.verbose("sendNewPooledRequestNotification email references: "+ references);
677
+
678
+ let from;
679
+ let configEmail;
680
+ if (project && project.settings && project.settings.email) {
681
+ if (project.settings.email.config) {
682
+ configEmail = project.settings.email.config;
683
+ winston.verbose("sendNewPooledRequestNotification custom email configEmail setting found: ", configEmail);
684
+ }
685
+ if (project.settings.email.from) {
686
+ from = project.settings.email.from;
687
+ winston.verbose("sendNewPooledRequestNotification custom from email setting found: "+ from);
688
+ }
689
+ }
690
+
691
+ let subject = `[TileDesk ${project ? project.name : '-'}] New Pooled Chat`;
692
+
693
+ if (request.subject) {
694
+ subject = `[TileDesk ${project ? project.name : '-'}] ${request.subject}`;
695
+ }
696
+ // if (request.ticket_id) {
697
+ // subject = `[Ticket #${request.ticket_id}] New Pooled Chat`;
698
+ // }
699
+
700
+ // if (request.ticket_id && request.subject) {
701
+ // subject = `[Ticket #${request.ticket_id}] ${request.subject}`;
702
+ // }
703
+
704
+
705
+
706
+ that.send({
707
+ messageId: messageId,
708
+ from:from,
709
+ to: to,
710
+ replyTo: replyTo,
711
+ subject: subject,
712
+ html:html,
713
+ config:configEmail,
714
+ headers:headers
263
715
  });
716
+ // this.send(that.bcc, `[TileDesk ${project ? project.name : '-'}] New Pooled Request`, html);
717
+
264
718
  }
265
719
 
266
720
 
267
- sendNewMessageNotification(to, message, project, tokenQueryString) {
721
+
722
+
723
+
724
+ async sendNewPooledMessageEmailNotification(to, request, project, message) {
268
725
 
269
726
  var that = this;
270
727
 
271
- this.readTemplateFile('newMessage.html', function(err, html) {
728
+
729
+ //if the request came from rabbit mq?
730
+ if (request.toJSON) {
731
+ request = request.toJSON();
732
+ }
272
733
 
734
+ if (project.toJSON) {
735
+ project = project.toJSON();
736
+ }
273
737
 
274
- var envTemplate = process.env.EMAIL_NEW_MESSAGE_HTML_TEMPLATE;
275
- winston.debug("envTemplate: " + envTemplate);
738
+ var html = await this.readTemplate('pooledEmailMessage.html', project.settings);
276
739
 
277
- if (envTemplate) {
278
- html = envTemplate;
279
- }
280
740
 
281
- winston.debug("html: " + html);
741
+ var envTemplate = process.env.EMAIL_POOLED_MESSAGE_EMAIL_HTML_TEMPLATE;
742
+ winston.debug("envTemplate: " + envTemplate);
282
743
 
283
- var template = handlebars.compile(html);
284
744
 
285
- var baseScope = JSON.parse(JSON.stringify(that));
286
- delete baseScope.emailPassword;
745
+ if (envTemplate) {
746
+ html = envTemplate;
747
+ }
287
748
 
288
- var replacements = {
289
- message: message,
290
- project: project.toJSON(),
291
- tokenQueryString: tokenQueryString,
292
- baseScope: baseScope
293
- };
749
+ winston.debug("html: " + html);
294
750
 
295
- var html = template(replacements);
296
- winston.debug("html: " + html);
751
+ var template = handlebars.compile(html);
297
752
 
298
- let replyTo;
299
- if (message.request) {
300
- replyTo = message.request.request_id+"@"+that.replyToDomain;
301
- winston.info("replyTo: " + replyTo);
753
+ var baseScope = JSON.parse(JSON.stringify(that));
754
+ delete baseScope.pass;
755
+
756
+ let msgText = message.text;//.replace(/[\n\r]/g, '<br>');
757
+ msgText = encode(msgText);
758
+ if (this.markdown) {
759
+ msgText = marked(msgText);
760
+ }
761
+
762
+ winston.verbose("msgText: " + msgText);
763
+
764
+ // passa anche tutti i messages in modo da stampare tutto
765
+ // Stampa anche contact.email
766
+
767
+ var replacements = {
768
+ request: request,
769
+ project: project,
770
+ message: message,
771
+ msgText: msgText,
772
+ baseScope: baseScope
773
+ };
774
+
775
+ winston.debug("replacements ", replacements);
776
+
777
+ var html = template(replacements);
778
+ winston.debug("html after: " + html);
779
+
780
+
781
+
782
+ let messageId = message._id + "@" + MESSAGE_ID_DOMAIN;
783
+
784
+ let replyTo;
785
+ if (this.replyEnabled) {
786
+ replyTo = message.request.request_id + this.inboundDomainDomainWithAt;
787
+ }
788
+
789
+ let headers;
790
+ if (message.request) {
791
+
792
+ messageId = message.request.request_id + "+" + messageId;
793
+
794
+ if (message.request.attributes && message.request.attributes.email_replyTo) {
795
+ replyTo = message.request.attributes.email_replyTo;
796
+ }
797
+
798
+ headers = {"X-TILEDESK-PROJECT-ID": project._id, "X-TILEDESK-REQUEST-ID": message.request.request_id, "X-TILEDESK-TICKET-ID":message.request.ticket_id };
799
+
800
+ winston.verbose("sendNewPooledMessageEmailNotification messageId: " + messageId);
801
+ winston.verbose("sendNewPooledMessageEmailNotification replyTo: " + replyTo);
802
+ winston.verbose("sendNewPooledMessageEmailNotification email headers", headers);
803
+ }
804
+
805
+ let inReplyTo;
806
+ let references;
807
+ if (message.attributes) {
808
+ if (message.attributes.email_messageId) {
809
+ inReplyTo = message.attributes.email_messageId;
810
+ }
811
+ if (message.attributes.email_references) {
812
+ references = message.attributes.email_references;
813
+ }
814
+ }
815
+ winston.verbose("sendNewPooledMessageEmailNotification email inReplyTo: "+ inReplyTo);
816
+ winston.verbose("sendNewPooledMessageEmailNotification email references: "+ references);
817
+
818
+ let from;
819
+ let configEmail;
820
+ if (project && project.settings && project.settings.email) {
821
+ if (project.settings.email.config) {
822
+ configEmail = project.settings.email.config;
823
+ winston.verbose("sendNewPooledMessageEmailNotification custom email configEmail setting found: ", configEmail);
302
824
  }
825
+ if (project.settings.email.from) {
826
+ from = project.settings.email.from;
827
+ winston.verbose("sendNewPooledMessageEmailNotification custom from email setting found: "+ from);
828
+ }
829
+ }
830
+
831
+
832
+ let subject = `[TileDesk ${project ? project.name : '-'}] New Message`;
833
+
834
+ if (request.subject) {
835
+ subject = `[TileDesk ${project ? project.name : '-'}] ${request.subject}`;
836
+ }
837
+ if (request.ticket_id) {
838
+ subject = `[Ticket #${request.ticket_id}] New Message`;
839
+ }
840
+
841
+ if (request.ticket_id && request.subject) {
842
+ subject = `[Ticket #${request.ticket_id}] ${request.subject}`;
843
+ }
844
+
845
+
846
+ that.send({
847
+ messageId: messageId,
848
+ from:from,
849
+ to:to,
850
+ replyTo: replyTo,
851
+ // inReplyTo: inReplyTo,???
852
+ // references: references,??
853
+ subject: subject,
854
+ html:html,
855
+ config: configEmail,
856
+ headers:headers
857
+ });
858
+
859
+
860
+
861
+ // messageId = "notification" + messageId;
862
+
863
+ // that.send({
864
+ // messageId: messageId,
865
+ // to: that.bcc,
866
+ // replyTo: replyTo,
867
+ // subject: `[TileDesk ${project ? project.name : '-'}] - ${request.subject ? request.subject : 'New message'} - notification`,
868
+ // html:html,
869
+ // headers:headers
870
+ // });
871
+
872
+
873
+ }
874
+
875
+
876
+ async sendNewMessageNotification(to, message, project, tokenQueryString, sourcePage) {
877
+
878
+ var that = this;
879
+
880
+ //if the request came from rabbit mq?
881
+
882
+ if (project.toJSON) {
883
+ project = project.toJSON();
884
+ }
885
+
886
+ var html = await this.readTemplate('newMessage.html', project.settings);
887
+
888
+
889
+
890
+ var envTemplate = process.env.EMAIL_NEW_MESSAGE_HTML_TEMPLATE;
891
+ winston.debug("envTemplate: " + envTemplate);
892
+
893
+ if (envTemplate) {
894
+ html = envTemplate;
895
+ }
896
+
897
+ winston.debug("html: " + html);
898
+
899
+ var template = handlebars.compile(html);
900
+
901
+ var baseScope = JSON.parse(JSON.stringify(that));
902
+ delete baseScope.pass;
903
+
904
+ let msgText = message.text;//.replace(/[\n\r]/g, '<br>');
905
+ msgText = encode(msgText);
906
+ if (this.markdown) {
907
+ msgText = marked(msgText);
908
+ }
909
+
910
+ winston.debug("msgText: " + msgText);
911
+
912
+ var replacements = {
913
+ message: message,
914
+ project: project,
915
+ msgText:msgText,
916
+ seamlessPage: sourcePage,
917
+ tokenQueryString: tokenQueryString,
918
+ baseScope: baseScope
919
+ };
920
+
921
+ var html = template(replacements);
922
+ winston.debug("html: " + html);
923
+
924
+
925
+ let messageId = message._id + "@" + MESSAGE_ID_DOMAIN;
926
+
927
+ let replyTo;
928
+ if (this.replyEnabled) {
929
+ replyTo = message.request.request_id + this.inboundDomainDomainWithAt;
930
+ }
931
+
932
+ let headers;
933
+ if (message.request) {
303
934
 
935
+ messageId = message.request.request_id + "+" + messageId;
304
936
 
305
- that.sendMail({to:to, replyTo: replyTo, subject:`[TileDesk ${project ? project.name : '-'}] New Offline Message`, html:html});
306
- that.sendMail({to: config.bcc, replyTo: replyTo, subject: `[TileDesk ${project ? project.name : '-'}] New Offline Message - notification`, html:html});
937
+ if (message.request.attributes && message.request.attributes.email_replyTo) {
938
+ replyTo = message.request.attributes.email_replyTo;
939
+ }
940
+
941
+ headers = {"X-TILEDESK-PROJECT-ID": project._id, "X-TILEDESK-REQUEST-ID": message.request.request_id, "X-TILEDESK-TICKET-ID":message.request.ticket_id };
307
942
 
943
+ winston.verbose("messageId: " + messageId);
944
+ winston.verbose("replyTo: " + replyTo);
945
+ winston.verbose("email headers", headers);
946
+ }
947
+
948
+ let inReplyTo;
949
+ let references;
950
+ if (message.attributes) {
951
+ if (message.attributes.email_messageId) {
952
+ inReplyTo = message.attributes.email_messageId;
953
+ }
954
+ if (message.attributes.email_references) {
955
+ references = message.attributes.email_references;
956
+ }
957
+ }
958
+ winston.verbose("email inReplyTo: "+ inReplyTo);
959
+ winston.verbose("email references: "+ references);
960
+
961
+ let from;
962
+ let configEmail;
963
+ if (project && project.settings && project.settings.email) {
964
+ if (project.settings.email.config) {
965
+ configEmail = project.settings.email.config;
966
+ winston.verbose("custom email configEmail setting found: ", configEmail);
967
+ }
968
+ if (project.settings.email.from) {
969
+ from = project.settings.email.from;
970
+ winston.verbose("custom from email setting found: "+ from);
971
+ }
972
+ }
973
+
974
+
975
+ that.send({
976
+ messageId: messageId,
977
+ // sender: message.senderFullname, //must be an email
978
+ from:from,
979
+ to:to,
980
+ replyTo: replyTo,
981
+ inReplyTo: inReplyTo,
982
+ references: references,
983
+ subject:`[TileDesk ${project ? project.name : '-'}] New Offline Message`,
984
+ html:html,
985
+ config:configEmail,
986
+ headers: headers
308
987
  });
988
+
989
+ messageId = "notification" + messageId;
990
+
991
+ that.send({
992
+ messageId: messageId,
993
+ // sender: message.senderFullname, //must be an email
994
+ to: that.bcc,
995
+ replyTo: replyTo,
996
+ inReplyTo: inReplyTo,
997
+ references: references,
998
+ subject: `[TileDesk ${project ? project.name : '-'}] New Offline Message - notification`,
999
+ html:html,
1000
+ headers: headers
1001
+ });
1002
+
309
1003
  }
310
1004
 
311
1005
 
312
1006
 
313
- sendEmailChannelNotification(to, message, project, tokenQueryString) {
1007
+ async sendEmailChannelNotification(to, message, project, tokenQueryString, sourcePage) {
314
1008
 
315
1009
  var that = this;
316
1010
 
317
- this.readTemplateFile('ticket.txt', function(err, html) {
318
- // this.readTemplateFile('ticket.html', function(err, html) {
319
1011
 
1012
+ if (project.toJSON) {
1013
+ project = project.toJSON();
1014
+ }
320
1015
 
321
- var envTemplate = process.env.EMAIL_TICKET_HTML_TEMPLATE;
322
- winston.debug("envTemplate: " + envTemplate);
1016
+ var html = await this.readTemplate('ticket.html', project.settings);
1017
+ // this.readTemplateFile('ticket.txt', function(err, html) {
323
1018
 
324
- if (envTemplate) {
325
- html = envTemplate;
326
- }
327
1019
 
328
- winston.debug("html: " + html);
1020
+ var envTemplate = process.env.EMAIL_TICKET_HTML_TEMPLATE;
1021
+ winston.debug("envTemplate: " + envTemplate);
329
1022
 
330
- var template = handlebars.compile(html);
1023
+ if (envTemplate) {
1024
+ html = envTemplate;
1025
+ }
331
1026
 
332
- var baseScope = JSON.parse(JSON.stringify(that));
333
- delete baseScope.emailPassword;
1027
+ winston.debug("html: " + html);
334
1028
 
335
- var replacements = {
336
- message: message,
337
- project: project.toJSON(),
338
- tokenQueryString: tokenQueryString,
339
- baseScope: baseScope
340
- };
1029
+ var template = handlebars.compile(html);
341
1030
 
342
- var html = template(replacements);
343
- winston.debug("html: " + html);
1031
+ var baseScope = JSON.parse(JSON.stringify(that));
1032
+ delete baseScope.pass;
344
1033
 
345
- let replyTo;
346
- if (message.request) {
347
- replyTo = message.request.request_id+"@"+that.replyToDomain;
348
- winston.info("replyTo: " + replyTo);
349
- }
350
1034
 
351
- // if (message.request && message.request.lead && message.request.lead.email) {
352
- // winston.info("message.request.lead.email: " + message.request.lead.email);
353
- // replyTo = replyTo + ", "+ message.request.lead.email;
354
- // }
1035
+ let msgText = message.text;//.replace(/[\n\r]/g, '<br>');
1036
+ msgText = encode(msgText);
1037
+ if (this.markdown) {
1038
+ msgText = marked(msgText);
1039
+ }
1040
+
1041
+ winston.debug("msgText: " + msgText);
1042
+ winston.debug("baseScope: " + JSON.stringify(baseScope));
1043
+
1044
+
1045
+ var replacements = {
1046
+ message: message,
1047
+ project: project,
1048
+ seamlessPage: sourcePage,
1049
+ msgText: msgText,
1050
+ tokenQueryString: tokenQueryString,
1051
+ baseScope: baseScope
1052
+ };
1053
+
1054
+ var html = template(replacements);
1055
+ winston.debug("html: " + html);
1056
+
1057
+
1058
+
1059
+
1060
+ let messageId = message._id + "@" + MESSAGE_ID_DOMAIN;
1061
+
1062
+ let replyTo;
1063
+ if (this.replyEnabled) {
1064
+ replyTo = message.request.request_id + this.inboundDomainDomainWithAt;
1065
+ }
1066
+
1067
+ let headers;
1068
+ if (message.request) {
355
1069
 
1070
+ messageId = message.request.request_id + "+" + messageId;
1071
+
1072
+ if (message.request.attributes && message.request.attributes.email_replyTo) {
1073
+ replyTo = message.request.attributes.email_replyTo;
1074
+ }
1075
+
1076
+ headers = {"X-TILEDESK-PROJECT-ID": project._id, "X-TILEDESK-REQUEST-ID": message.request.request_id, "X-TILEDESK-TICKET-ID":message.request.ticket_id };
1077
+
1078
+ winston.verbose("messageId: " + messageId);
1079
+ winston.verbose("replyTo: " + replyTo);
1080
+ winston.verbose("email headers", headers);
1081
+ }
1082
+
1083
+
1084
+ let inReplyTo;
1085
+ let references;
1086
+ let cc;
1087
+ let ccString;
1088
+
1089
+ if (message.attributes) {
1090
+
1091
+ winston.verbose("email message.attributes: ", message.attributes);
1092
+ // per email touching manca
1093
+ if (message.attributes.email_messageId) {
1094
+ inReplyTo = message.attributes.email_messageId;
1095
+ }
1096
+ if (message.attributes.email_references) {
1097
+ references = message.attributes.email_references;
1098
+ }
1099
+ if (message.attributes.email_cc) {
1100
+ cc = message.attributes.email_cc;
1101
+ }
1102
+ winston.verbose("email message.attributes.email_ccStr: "+ message.attributes.email_ccStr);
1103
+ if (message.attributes.email_ccStr!=undefined) {
1104
+ ccString = message.attributes.email_ccStr;
1105
+ winston.verbose("email set ccString");
1106
+ }
1107
+ }
1108
+ winston.verbose("email inReplyTo: "+ inReplyTo);
1109
+ winston.verbose("email references: "+ references);
1110
+ winston.verbose("email cc: ", cc);
1111
+ winston.verbose("email ccString: "+ ccString);
1112
+
1113
+ let from;
1114
+ let configEmail;
1115
+ if (project && project.settings && project.settings.email) {
1116
+ if (project.settings.email.config) {
1117
+ configEmail = project.settings.email.config;
1118
+ winston.verbose("custom email configEmail setting found: ", configEmail);
1119
+ }
1120
+ if (project.settings.email.from) {
1121
+ from = project.settings.email.from;
1122
+ winston.verbose("custom from email setting found: "+ from);
1123
+ }
1124
+ }
356
1125
 
357
- that.sendMail({to:to, replyTo: replyTo, subject:`R: ${message.request ? message.request.subject : '-'}`, text:html }); //html:html
358
- that.sendMail({to: config.bcc, replyTo: replyTo, subject: `R: ${message.request ? message.request.subject : '-'} - notification`, text:html});//html:html
359
1126
 
1127
+ // if (message.request && message.request.lead && message.request.lead.email) {
1128
+ // winston.info("message.request.lead.email: " + message.request.lead.email);
1129
+ // replyTo = replyTo + ", "+ message.request.lead.email;
1130
+ // }
1131
+
1132
+ that.send({
1133
+ messageId: messageId,
1134
+ // sender: message.senderFullname, //must be an email
1135
+ from:from,
1136
+ to:to,
1137
+ cc: ccString,
1138
+ replyTo: replyTo,
1139
+ inReplyTo: inReplyTo,
1140
+ references: references,
1141
+ // subject:`${message.request ? message.request.subject : '-'}`,
1142
+ subject:`R: ${message.request ? message.request.subject : '-'}`, //gmail uses subject
1143
+ text:html,
1144
+ html:html,
1145
+ config:configEmail,
1146
+ headers:headers
1147
+ });
1148
+
1149
+ messageId = "notification" + messageId;
1150
+
1151
+ that.send({
1152
+ messageId: messageId,
1153
+ // sender: message.senderFullname, //must be an email
1154
+ to: that.bcc,
1155
+ replyTo: replyTo,
1156
+ inReplyTo: inReplyTo,
1157
+ references: references,
1158
+ // subject: `${message.request ? message.request.subject : '-'} - notification`,
1159
+ subject: `R: ${message.request ? message.request.subject : '-'} - notification`,
1160
+ text:html,
1161
+ html:html,
1162
+ headers:headers
360
1163
  });
361
- }
362
1164
 
1165
+ }
363
1166
 
364
1167
 
1168
+ /*
365
1169
  sendEmailChannelTakingNotification(to, request, project, tokenQueryString) {
366
1170
 
367
1171
  var that = this;
@@ -382,7 +1186,7 @@ class EmailService {
382
1186
  var template = handlebars.compile(html);
383
1187
 
384
1188
  var baseScope = JSON.parse(JSON.stringify(that));
385
- delete baseScope.emailPassword;
1189
+ delete baseScope.pass;
386
1190
 
387
1191
  var replacements = {
388
1192
  request: request,
@@ -394,11 +1198,6 @@ class EmailService {
394
1198
  var html = template(replacements);
395
1199
  winston.debug("html: " + html);
396
1200
 
397
- let replyTo;
398
- if (request) {
399
- replyTo = request.request_id+"@"+that.replyToDomain;
400
- winston.info("replyTo: " + replyTo);
401
- }
402
1201
 
403
1202
  // if (message.request && message.request.lead && message.request.lead.email) {
404
1203
  // winston.info("message.request.lead.email: " + message.request.lead.email);
@@ -406,89 +1205,86 @@ class EmailService {
406
1205
  // }
407
1206
 
408
1207
 
409
- that.sendMail({to:to, replyTo: replyTo, subject:`R: ${request ? request.subject : '-'}`, text:html }); //html:html
410
- that.sendMail({to: config.bcc, replyTo: replyTo, subject: `R: ${request ? request.subject : '-'} - notification`, text:html});//html:html
1208
+ that.send({to:to, replyTo: replyTo, subject:`R: ${request ? request.subject : '-'}`, text:html }); //html:html
1209
+ that.send({to: that.bcc, replyTo: replyTo, subject: `R: ${request ? request.subject : '-'} - notification`, text:html});//html:html
411
1210
 
412
1211
  });
413
1212
  }
414
-
1213
+ */
415
1214
 
416
1215
  // ok
417
- sendPasswordResetRequestEmail(to, resetPswRequestId, userFirstname, userLastname) {
1216
+ async sendPasswordResetRequestEmail(to, resetPswRequestId, userFirstname, userLastname) {
418
1217
 
419
1218
  var that = this;
420
1219
 
421
- this.readTemplateFile('resetPassword.html', function(err, html) {
1220
+ var html = await this.readTemplate('resetPassword.html');
422
1221
 
423
1222
 
424
- var envTemplate = process.env.EMAIL_RESET_PASSWORD_HTML_TEMPLATE;
425
- winston.debug("envTemplate: " + envTemplate);
1223
+ var envTemplate = process.env.EMAIL_RESET_PASSWORD_HTML_TEMPLATE;
1224
+ winston.debug("envTemplate: " + envTemplate);
426
1225
 
427
- if (envTemplate) {
428
- html = envTemplate;
429
- }
1226
+ if (envTemplate) {
1227
+ html = envTemplate;
1228
+ }
430
1229
 
431
- winston.debug("html: " + html);
1230
+ winston.debug("html: " + html);
432
1231
 
433
- var template = handlebars.compile(html);
1232
+ var template = handlebars.compile(html);
434
1233
 
435
- var baseScope = JSON.parse(JSON.stringify(that));
436
- delete baseScope.emailPassword;
1234
+ var baseScope = JSON.parse(JSON.stringify(that));
1235
+ delete baseScope.pass;
437
1236
 
438
1237
 
439
- var replacements = {
440
- resetPswRequestId: resetPswRequestId,
441
- userFirstname: userFirstname,
442
- userLastname: userLastname,
443
- baseScope: baseScope
444
- };
1238
+ var replacements = {
1239
+ resetPswRequestId: resetPswRequestId,
1240
+ userFirstname: userFirstname,
1241
+ userLastname: userLastname,
1242
+ baseScope: baseScope
1243
+ };
445
1244
 
446
- var html = template(replacements);
1245
+ var html = template(replacements);
447
1246
 
448
1247
 
449
- that.send(to, '[TileDesk] Password reset request', html);
450
- that.send(that.bcc, '[TileDesk] Password reset request - notification', html);
1248
+ that.send({to: to, subject: '[TileDesk] Password reset request', html:html});
1249
+ that.send({to:that.bcc, subject: '[TileDesk] Password reset request - notification', html:html });
451
1250
 
452
- });
453
1251
  }
454
1252
 
455
1253
  // ok
456
- sendYourPswHasBeenChangedEmail(to, userFirstname, userLastname) {
1254
+ async sendYourPswHasBeenChangedEmail(to, userFirstname, userLastname) {
457
1255
 
458
1256
  var that = this;
459
1257
 
460
- this.readTemplateFile('passwordChanged.html', function(err, html) {
1258
+ var html = await this.readTemplateFile('passwordChanged.html');
461
1259
 
462
1260
 
463
- var envTemplate = process.env.EMAIL_PASSWORD_CHANGED_HTML_TEMPLATE;
464
- winston.debug("envTemplate: " + envTemplate);
1261
+ var envTemplate = process.env.EMAIL_PASSWORD_CHANGED_HTML_TEMPLATE;
1262
+ winston.debug("envTemplate: " + envTemplate);
465
1263
 
466
- if (envTemplate) {
467
- html = envTemplate;
468
- }
469
-
470
- winston.debug("html: " + html);
1264
+ if (envTemplate) {
1265
+ html = envTemplate;
1266
+ }
471
1267
 
472
- var template = handlebars.compile(html);
1268
+ winston.debug("html: " + html);
473
1269
 
474
- var baseScope = JSON.parse(JSON.stringify(that));
475
- delete baseScope.emailPassword;
1270
+ var template = handlebars.compile(html);
476
1271
 
1272
+ var baseScope = JSON.parse(JSON.stringify(that));
1273
+ delete baseScope.pass;
477
1274
 
478
- var replacements = {
479
- userFirstname: userFirstname,
480
- userLastname: userLastname,
481
- to: to,
482
- baseScope: baseScope
483
- };
484
1275
 
485
- var html = template(replacements);
1276
+ var replacements = {
1277
+ userFirstname: userFirstname,
1278
+ userLastname: userLastname,
1279
+ to: to,
1280
+ baseScope: baseScope
1281
+ };
486
1282
 
1283
+ var html = template(replacements);
487
1284
 
488
- that.send(to, '[TileDesk] Your password has been changed', html);
489
- that.send(that.bcc, '[TileDesk] Your password has been changed - notification', html);
490
1285
 
491
- });
1286
+ that.send({to: to, subject:'[TileDesk] Your password has been changed', html:html });
1287
+ that.send({to: that.bcc, subject: '[TileDesk] Your password has been changed - notification', html: html });
492
1288
 
493
1289
  }
494
1290
 
@@ -499,46 +1295,43 @@ class EmailService {
499
1295
  /**
500
1296
  *! *** EMAIL: YOU HAVE BEEN INVITED AT THE PROJECT ***
501
1297
  */
502
- sendYouHaveBeenInvited(to, currentUserFirstname, currentUserLastname, projectName, id_project, invitedUserFirstname, invitedUserLastname, invitedUserRole) {
1298
+ async sendYouHaveBeenInvited(to, currentUserFirstname, currentUserLastname, projectName, id_project, invitedUserFirstname, invitedUserLastname, invitedUserRole) {
503
1299
 
504
1300
  var that = this;
505
1301
 
506
- this.readTemplateFile('beenInvitedExistingUser.html', function(err, html) {
1302
+ var html = await this.readTemplateFile('beenInvitedExistingUser.html');
507
1303
 
1304
+ var envTemplate = process.env.EMAIL_EXUSER_INVITED_HTML_TEMPLATE;
1305
+ winston.debug("envTemplate: " + envTemplate);
508
1306
 
509
- var envTemplate = process.env.EMAIL_EXUSER_INVITED_HTML_TEMPLATE;
510
- winston.debug("envTemplate: " + envTemplate);
511
-
512
- if (envTemplate) {
513
- html = envTemplate;
514
- }
515
-
516
- winston.debug("html: " + html);
1307
+ if (envTemplate) {
1308
+ html = envTemplate;
1309
+ }
517
1310
 
518
- var template = handlebars.compile(html);
1311
+ winston.debug("html: " + html);
519
1312
 
520
- var baseScope = JSON.parse(JSON.stringify(that));
521
- delete baseScope.emailPassword;
1313
+ var template = handlebars.compile(html);
522
1314
 
1315
+ var baseScope = JSON.parse(JSON.stringify(that));
1316
+ delete baseScope.pass;
523
1317
 
524
- var replacements = {
525
- currentUserFirstname: currentUserFirstname,
526
- currentUserLastname: currentUserLastname,
527
- projectName: projectName,
528
- id_project: id_project,
529
- invitedUserFirstname: invitedUserFirstname,
530
- invitedUserLastname: invitedUserLastname,
531
- invitedUserRole: invitedUserRole,
532
- baseScope: baseScope
533
- };
534
1318
 
535
- var html = template(replacements);
1319
+ var replacements = {
1320
+ currentUserFirstname: currentUserFirstname,
1321
+ currentUserLastname: currentUserLastname,
1322
+ projectName: projectName,
1323
+ id_project: id_project,
1324
+ invitedUserFirstname: invitedUserFirstname,
1325
+ invitedUserLastname: invitedUserLastname,
1326
+ invitedUserRole: invitedUserRole,
1327
+ baseScope: baseScope
1328
+ };
536
1329
 
1330
+ var html = template(replacements);
537
1331
 
538
- that.send(to, `[TileDesk] You have been invited to the '${projectName}' project`, html);
539
- that.send(that.bcc, `[TileDesk] You have been invited to the '${projectName}' project - notification`, html);
540
1332
 
541
- });
1333
+ that.send({to:to, subject: `[TileDesk] You have been invited to the '${projectName}' project`, html:html});
1334
+ that.send({to: that.bcc, subject: `[TileDesk] You have been invited to the '${projectName}' project - notification`, html: html});
542
1335
  }
543
1336
 
544
1337
  // ok
@@ -547,83 +1340,82 @@ class EmailService {
547
1340
  /**
548
1341
  *! *** EMAIL: YOU HAVE BEEN INVITED AT THE PROJECT (USER NOT REGISTERED) ***
549
1342
  */
550
- sendInvitationEmail_UserNotRegistered(to, currentUserFirstname, currentUserLastname, projectName, id_project, invitedUserRole, pendinginvitationid) {
1343
+ async sendInvitationEmail_UserNotRegistered(to, currentUserFirstname, currentUserLastname, projectName, id_project, invitedUserRole, pendinginvitationid) {
551
1344
 
552
1345
 
553
1346
  var that = this;
554
1347
 
555
- this.readTemplateFile('beenInvitedNewUser.html', function(err, html) {
1348
+ var html = await this.readTemplateFile('beenInvitedNewUser.html');
556
1349
 
1350
+ var envTemplate = process.env.EMAIL_NEWUSER_INVITED_HTML_TEMPLATE;
1351
+ winston.debug("envTemplate: " + envTemplate);
557
1352
 
558
- var envTemplate = process.env.EMAIL_NEWUSER_INVITED_HTML_TEMPLATE;
559
- winston.debug("envTemplate: " + envTemplate);
560
-
561
- if (envTemplate) {
562
- html = envTemplate;
563
- }
1353
+ if (envTemplate) {
1354
+ html = envTemplate;
1355
+ }
564
1356
 
565
- winston.debug("html: " + html);
1357
+ winston.debug("html: " + html);
566
1358
 
567
- var template = handlebars.compile(html);
1359
+ var template = handlebars.compile(html);
568
1360
 
569
- var baseScope = JSON.parse(JSON.stringify(that));
570
- delete baseScope.emailPassword;
1361
+ var baseScope = JSON.parse(JSON.stringify(that));
1362
+ delete baseScope.pass;
571
1363
 
572
1364
 
573
- var replacements = {
574
- currentUserFirstname: currentUserFirstname,
575
- currentUserLastname: currentUserLastname,
576
- projectName: projectName,
577
- id_project: id_project,
578
- invitedUserRole: invitedUserRole,
579
- pendinginvitationid: pendinginvitationid,
580
- baseScope: baseScope
581
- };
1365
+ var replacements = {
1366
+ currentUserFirstname: currentUserFirstname,
1367
+ currentUserLastname: currentUserLastname,
1368
+ projectName: projectName,
1369
+ id_project: id_project,
1370
+ invitedUserRole: invitedUserRole,
1371
+ pendinginvitationid: pendinginvitationid,
1372
+ baseScope: baseScope
1373
+ };
582
1374
 
583
- var html = template(replacements);
1375
+ var html = template(replacements);
584
1376
 
585
- that.send(to, `[TileDesk] You have been invited to the '${projectName}' project`, html);
586
- that.send(that.bcc, `[TileDesk] You have been invited to the '${projectName}' project - notification`, html);
1377
+ that.send({to:to, subject: `[TileDesk] You have been invited to the '${projectName}' project`, html:html });
1378
+ that.send({to: that.bcc, subject: `[TileDesk] You have been invited to the '${projectName}' project - notification`, html: html});
587
1379
 
588
- });
589
1380
  }
590
1381
 
591
1382
  // ok
592
- sendVerifyEmailAddress(to, savedUser) {
1383
+ async sendVerifyEmailAddress(to, savedUser) {
593
1384
 
594
1385
 
595
1386
  var that = this;
596
1387
 
597
- this.readTemplateFile('verify.html', function(err, html) {
598
-
1388
+ if (savedUser.toJSON) {
1389
+ savedUser = savedUser.toJSON();
1390
+ }
1391
+ var html = await this.readTemplateFile('verify.html');
599
1392
 
600
- var envTemplate = process.env.EMAIL_VERIFY_HTML_TEMPLATE;
601
- winston.debug("envTemplate: " + envTemplate);
1393
+ var envTemplate = process.env.EMAIL_VERIFY_HTML_TEMPLATE;
1394
+ winston.debug("envTemplate: " + envTemplate);
602
1395
 
603
- if (envTemplate) {
604
- html = envTemplate;
605
- }
1396
+ if (envTemplate) {
1397
+ html = envTemplate;
1398
+ }
606
1399
 
607
- winston.debug("html: " + html);
1400
+ winston.debug("html: " + html);
608
1401
 
609
- var template = handlebars.compile(html);
1402
+ var template = handlebars.compile(html);
610
1403
 
611
- var baseScope = JSON.parse(JSON.stringify(that));
612
- delete baseScope.emailPassword;
1404
+ var baseScope = JSON.parse(JSON.stringify(that));
1405
+ delete baseScope.pass;
613
1406
 
614
1407
 
615
- var replacements = {
616
- savedUser: savedUser.toJSON(),
617
- baseScope: baseScope
618
- };
1408
+ var replacements = {
1409
+ savedUser: savedUser,
1410
+ baseScope: baseScope
1411
+ };
619
1412
 
620
- var html = template(replacements);
1413
+ var html = template(replacements);
621
1414
 
622
1415
 
623
- that.send(to, `[TileDesk] Verify your email address`, html);
624
- that.send(that.bcc, `[TileDesk] Verify your email address `+to + " - notification", html);
1416
+ that.send({to: to, subject: `[TileDesk] Verify your email address`, html:html });
1417
+ that.send({to: that.bcc, subject: `[TileDesk] Verify your email address `+to + " - notification", html:html });
625
1418
 
626
- });
627
1419
  }
628
1420
 
629
1421
 
@@ -634,7 +1426,17 @@ class EmailService {
634
1426
 
635
1427
  // ok
636
1428
 
637
- sendRequestTranscript(to, messages, request) {
1429
+ async sendRequestTranscript(to, messages, request, project) {
1430
+
1431
+
1432
+ //if the request came from rabbit mq?
1433
+ if (request.toJSON) {
1434
+ request = request.toJSON();
1435
+ }
1436
+
1437
+ // if (project.toJSON) {
1438
+ // project = project.toJSON();
1439
+ // }
638
1440
 
639
1441
  var transcriptAsHtml = ""; //https://handlebarsjs.com/guide/expressions.html#html-escaping
640
1442
  messages.forEach(message => {
@@ -646,41 +1448,42 @@ class EmailService {
646
1448
 
647
1449
  var that = this;
648
1450
 
649
- this.readTemplateFile('sendTranscript.html', function(err, html) {
650
-
651
-
652
- var envTemplate = process.env.EMAIL_SEND_TRANSCRIPT_HTML_TEMPLATE;
653
- winston.debug("envTemplate: " + envTemplate);
654
-
655
- if (envTemplate) {
656
- html = envTemplate;
657
- }
1451
+ var html = await this.readTemplate('sendTranscript.html', project.settings);
658
1452
 
659
- winston.debug("html: " + html);
1453
+ var envTemplate = process.env.EMAIL_SEND_TRANSCRIPT_HTML_TEMPLATE;
1454
+ winston.debug("envTemplate: " + envTemplate);
660
1455
 
661
- var template = handlebars.compile(html);
1456
+ if (envTemplate) {
1457
+ html = envTemplate;
1458
+ }
662
1459
 
663
- var baseScope = JSON.parse(JSON.stringify(that));
664
- delete baseScope.emailPassword;
1460
+ winston.debug("html: " + html);
665
1461
 
1462
+ var template = handlebars.compile(html);
666
1463
 
667
- var replacements = {
668
- messages: messages,
669
- request: request.toJSON(),
670
- formattedCreatedAt: request.createdAt.toLocaleString('en', { timeZone: 'UTC' }),
671
- transcriptAsHtml: transcriptAsHtml,
672
- baseScope: baseScope
673
- };
1464
+ var baseScope = JSON.parse(JSON.stringify(that));
1465
+ delete baseScope.pass;
674
1466
 
675
- var html = template(replacements);
676
1467
 
1468
+ var replacements = {
1469
+ messages: messages,
1470
+ request: request,
1471
+ formattedCreatedAt: request.createdAt.toLocaleString('en', { timeZone: 'UTC' }),
1472
+ transcriptAsHtml: transcriptAsHtml,
1473
+ baseScope: baseScope
1474
+ };
677
1475
 
1476
+ var html = template(replacements);
678
1477
 
679
- that.send(to, '[TileDesk] Transcript', html);
680
- that.send(that.bcc, '[TileDesk] Transcript - notification', html);
1478
+ let configEmail;
1479
+ if (project && project.settings && project.settings.email && project.settings.email.config) {
1480
+ configEmail = project.settings.email.config;
1481
+ winston.verbose("custom email setting found: ", configEmail);
1482
+ }
681
1483
 
1484
+ that.send({to:to, subject: '[TileDesk] Transcript', html:html, config: configEmail});
1485
+ that.send({to: that.bcc, subject: '[TileDesk] Transcript - notification', html:html });
682
1486
 
683
- });
684
1487
  }
685
1488
 
686
1489
 
@@ -691,4 +1494,6 @@ class EmailService {
691
1494
 
692
1495
  var emailService = new EmailService();
693
1496
 
1497
+ //emailService.sendTest("al@f21.it");
1498
+
694
1499
  module.exports = emailService;