PageRenderTime 52ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/shared/io/emailer.js

https://github.com/dbrugne/donut
JavaScript | 660 lines | 608 code | 37 blank | 15 comment | 9 complexity | d71f85816d641ccd42c4d447519b6267 MD5 | raw file
  1. 'use strict';
  2. var logger = require('../util/logger').getLogger('emailer', __filename);
  3. var _ = require('underscore');
  4. var nodemailer = require('nodemailer');
  5. var underscoreTemplate = require('../util/underscore-template');
  6. var i18next = require('../util/i18next');
  7. var conf = require('../../config/index');
  8. var mailgunTransport = require('nodemailer-mailgun-transport');
  9. var urls = require('../util/url');
  10. var emailer = {};
  11. module.exports = emailer;
  12. // setup template engine
  13. var renderer = underscoreTemplate.standard({
  14. defaultVariables: {
  15. t: i18next.t,
  16. fqdn: conf.fqdn,
  17. email: conf.email.from.email,
  18. facebook_url: conf.facebook.url,
  19. twitter_url: conf.twitter.url
  20. }
  21. });
  22. // setup transporter (only one time for this process)
  23. var transporter = nodemailer.createTransport(mailgunTransport({
  24. auth: {
  25. api_key: conf.email.mailgun.api_key,
  26. domain: conf.email.mailgun.domain
  27. }
  28. }));
  29. /**
  30. * Render 'template' with 'data' and send email to 'to'
  31. * @param to
  32. * @param template
  33. * @param data
  34. * @param callback
  35. */
  36. function sendEmail (to, template, data, callback) {
  37. if (!to) {
  38. return callback('"to" param is mandatory');
  39. }
  40. if (!template) {
  41. return callback('"template" param is mandatory');
  42. }
  43. if (!data.subject) {
  44. return callback('"subject" param is mandatory');
  45. }
  46. if (!_.isObject(data)) {
  47. return callback('Third argument should be an object with email data');
  48. }
  49. // stub in non-production environment (@debug)
  50. if (process.env.NODE_ENV !== 'production') {
  51. to = conf.email.fake.replace('__name__', to.substr(0, to.indexOf('@')));
  52. }
  53. renderer.render(template, data, function (err, html) {
  54. if (err) {
  55. return callback(err);
  56. }
  57. var options = {
  58. from: conf.email.from.name + ' <' + conf.email.from.email + '>',
  59. to: to,
  60. subject: data.subject,
  61. html: html
  62. };
  63. if (data.text) {
  64. options.text = data.text;
  65. }
  66. process.nextTick(function () {
  67. transporter.sendMail(options, function (err, info) {
  68. if (err) {
  69. logger.error('Error while sending email to "' + options.to + '": ' + err);
  70. return callback(err);
  71. }
  72. logger.debug('Message sent', info);
  73. return callback(null);
  74. });
  75. });
  76. });
  77. }
  78. /** =================================================================
  79. *
  80. * Emails
  81. *
  82. * ================================================================== */
  83. emailer.signal = function (data, callback) {
  84. sendEmail(conf.email.admin, 'emails/signal.html', {
  85. subject: 'Inappropriate content or activity signaled',
  86. title: 'Inappropriate content or activity signaled',
  87. time: new Date(),
  88. data: data
  89. }, callback);
  90. };
  91. emailer.forgot = function (to, token, callback) {
  92. sendEmail(to, 'emails/forgot.html', {
  93. token: token,
  94. title: i18next.t('email.forgot.content.title'),
  95. subject: i18next.t('email.forgot.subject'),
  96. email_heading_action: false
  97. }, callback);
  98. };
  99. emailer.verify = function (to, from, token, callback) {
  100. sendEmail(to, 'emails/verify.html', {
  101. token: token,
  102. username: from.username,
  103. title: i18next.t('email.verify.content.title', {username: from.username}),
  104. subject: i18next.t('email.verify.subject')
  105. }, callback);
  106. };
  107. emailer.welcome = function (to, user, token, callback) {
  108. sendEmail(to, 'emails/signup.html', {
  109. token: token,
  110. username: user.username,
  111. title: i18next.t('email.welcome.content.title', {username: user.username}),
  112. subject: i18next.t('email.welcome.subject'),
  113. email_heading_action: false
  114. }, callback);
  115. };
  116. emailer.welcomeFacebook = function (to, callback) {
  117. sendEmail(to, 'emails/signupFacebook.html', {
  118. title: i18next.t('email.welcomeFacebook.content.title'),
  119. subject: i18next.t('email.welcomeFacebook.subject'),
  120. email_heading_action: false
  121. }, callback);
  122. };
  123. emailer.passwordChanged = function (to, callback) {
  124. sendEmail(to, 'emails/password-changed.html', {
  125. title: i18next.t('email.passwordchanged.content.title'),
  126. subject: i18next.t('email.passwordchanged.subject'),
  127. email_heading_action: false
  128. }, callback);
  129. };
  130. emailer.emailChanged = function (to, callback) {
  131. sendEmail(to, 'emails/email-changed.html', {
  132. title: i18next.t('email.emailchanged.content.title'),
  133. subject: i18next.t('email.emailchanged.subject'),
  134. email_heading_action: false
  135. }, callback);
  136. };
  137. emailer.roomOp = function (to, data, callback) {
  138. data.name = data.roomname.replace('#', '');
  139. sendEmail(to, 'emails/room-op.html', {
  140. username: data.username,
  141. roomname: data.roomname,
  142. title: i18next.t('email.roomop.content.title', {roomname: data.roomname}),
  143. email_heading_action: {
  144. action: i18next.t('email.roomop.content.action')
  145. },
  146. subject: i18next.t('email.roomop.subject', {roomname: data.roomname}),
  147. roomlink: {
  148. url: conf.url + urls(data, 'room', 'url'),
  149. chat: conf.url + urls(data, 'room', 'chat')
  150. }
  151. }, callback);
  152. };
  153. emailer.roomDeop = function (to, data, callback) {
  154. data.name = data.roomname.replace('#', '');
  155. sendEmail(to, 'emails/room-deop.html', {
  156. username: data.username,
  157. roomname: data.roomname,
  158. title: i18next.t('email.roomdeop.content.title', {roomname: data.roomname}),
  159. email_heading_action: {
  160. action: i18next.t('email.roomdeop.content.action')
  161. },
  162. subject: i18next.t('email.roomdeop.subject', {roomname: data.roomname}),
  163. roomlink: {
  164. url: conf.url + urls(data, 'room', 'url'),
  165. chat: conf.url + urls(data, 'room', 'chat')
  166. }
  167. }, callback);
  168. };
  169. emailer.roomKick = function (to, data, callback) {
  170. data.name = data.roomname.replace('#', '');
  171. sendEmail(to, 'emails/room-kick.html', {
  172. username: data.username,
  173. roomname: data.roomname,
  174. reason: data.reason,
  175. title: i18next.t('email.roomkick.content.title', {roomname: data.roomname}),
  176. subject: i18next.t('email.roomkick.subject', {roomname: data.roomname}),
  177. roomlink: {
  178. url: conf.url + urls(data, 'room', 'url'),
  179. chat: conf.url + urls(data, 'room', 'chat')
  180. },
  181. email_heading_action: {
  182. action: i18next.t('email.roomkick.content.action')
  183. }
  184. }, callback);
  185. };
  186. emailer.roomBan = function (to, data, callback) {
  187. sendEmail(to, 'emails/room-ban.html', {
  188. username: data.username,
  189. roomname: data.roomname,
  190. reason: data.reason,
  191. title: i18next.t('email.roomban.content.title', {roomname: data.roomname}),
  192. subject: i18next.t('email.roomban.subject', {roomname: data.roomname}),
  193. roomlink: {
  194. url: conf.url + urls(data, 'room', 'url'),
  195. chat: conf.url + urls(data, 'room', 'chat')
  196. },
  197. email_heading_action: {
  198. action: i18next.t('email.roomban.content.action')
  199. }
  200. }, callback);
  201. };
  202. emailer.roomDeban = function (to, data, callback) {
  203. data.name = data.roomname.replace('#', '');
  204. sendEmail(to, 'emails/room-deban.html', {
  205. username: data.username,
  206. roomname: data.roomname,
  207. reason: data.reason,
  208. title: i18next.t('email.roomdeban.content.title', {roomname: data.roomname}),
  209. email_heading_action: {
  210. action: i18next.t('email.roomdeban.content.action')
  211. },
  212. subject: i18next.t('email.roomdeban.subject', {roomname: data.roomname}),
  213. roomlink: {
  214. url: conf.url + urls(data, 'room', 'url'),
  215. chat: conf.url + urls(data, 'room', 'chat')
  216. }
  217. }, callback);
  218. };
  219. emailer.roomVoice = function (to, data, callback) {
  220. data.name = data.roomname.replace('#', '');
  221. sendEmail(to, 'emails/room-voice.html', {
  222. username: data.username,
  223. roomname: data.roomname,
  224. title: i18next.t('email.roomvoice.content.title', {roomname: data.roomname}),
  225. email_heading_action: {
  226. action: i18next.t('email.roomvoice.content.action')
  227. },
  228. subject: i18next.t('email.roomvoice.subject', {roomname: data.roomname}),
  229. roomlink: {
  230. url: conf.url + urls(data, 'room', 'url'),
  231. chat: conf.url + urls(data, 'room', 'chat')
  232. }
  233. }, callback);
  234. };
  235. emailer.roomDevoice = function (to, data, callback) {
  236. data.name = data.roomname.replace('#', '');
  237. sendEmail(to, 'emails/room-devoice.html', {
  238. username: data.username,
  239. roomname: data.roomname,
  240. reason: data.reason,
  241. title: i18next.t('email.roomdevoice.content.title', {roomname: data.roomname}),
  242. email_heading_action: {
  243. action: i18next.t('email.roomdevoice.content.action')
  244. },
  245. subject: i18next.t('email.roomdevoice.subject', {roomname: data.roomname}),
  246. roomlink: {
  247. url: conf.url + urls(data, 'room', 'url'),
  248. chat: conf.url + urls(data, 'room', 'chat')
  249. }
  250. }, callback);
  251. };
  252. emailer.contactForm = function (data, callback) {
  253. sendEmail(conf.email.from.email, 'emails/contact.html', {
  254. subject: i18next.t('email.contact.subject'),
  255. form: data,
  256. email_heading_action: false
  257. }, callback);
  258. };
  259. emailer.roomJoin = function (to, from, room, callback) {
  260. var data = { name: room.replace('#', '') };
  261. sendEmail(to, 'emails/room-join.html', {
  262. username: from,
  263. roomname: room,
  264. title: i18next.t('email.roomjoin.content.title', {
  265. username: from,
  266. roomname: room
  267. }),
  268. subject: i18next.t('email.roomjoin.subject', {
  269. username: from,
  270. roomname: room
  271. }),
  272. roomlink: {
  273. url: conf.url + urls(data, 'room', 'url'),
  274. chat: conf.url + urls(data, 'room', 'chat')
  275. },
  276. email_heading_action: false
  277. }, callback);
  278. };
  279. emailer.roomJoinRequest = function (to, data, callback) {
  280. data.name = data.roomname.replace('#', '');
  281. sendEmail(to, 'emails/room-join-request.html', {
  282. username: data.username,
  283. roomname: data.roomname,
  284. title: i18next.t('email.roomjoinrequest.content.title', {
  285. roomname: data.roomname,
  286. username: data.username
  287. }),
  288. subject: i18next.t('email.roomjoinrequest.subject', {roomname: data.roomname}),
  289. roomlink: {
  290. url: conf.url + urls(data, 'room', 'url'),
  291. chat: conf.url + urls(data, 'room', 'chat')
  292. },
  293. email_heading_action: false
  294. }, callback);
  295. };
  296. emailer.roomAllow = function (to, data, callback) {
  297. data.name = data.roomname.replace('#', '');
  298. sendEmail(to, 'emails/room-allow.html', {
  299. username: data.username,
  300. roomname: data.roomname,
  301. title: i18next.t('email.roomallow.content.title', {
  302. roomname: data.roomname,
  303. username: data.username
  304. }),
  305. subject: i18next.t('email.roomallow.subject', {roomname: data.roomname}),
  306. roomlink: {
  307. url: conf.url + urls(data, 'room', 'url'),
  308. chat: conf.url + urls(data, 'room', 'chat')
  309. },
  310. email_heading_action: {
  311. action: i18next.t('email.roomallow.content.action')
  312. }
  313. }, callback);
  314. };
  315. emailer.roomRefuse = function (to, data, callback) {
  316. data.name = data.roomname.replace('#', '');
  317. sendEmail(to, 'emails/room-refuse.html', {
  318. username: data.username,
  319. roomname: data.roomname,
  320. title: i18next.t('email.roomrefuse.content.title', {
  321. roomname: data.roomname,
  322. username: data.username
  323. }),
  324. subject: i18next.t('email.roomrefuse.subject', {roomname: data.roomname}),
  325. email_heading_action: {
  326. action: i18next.t('email.roomrefuse.content.action')
  327. },
  328. roomlink: {
  329. url: conf.url + urls(data, 'room', 'url'),
  330. chat: conf.url + urls(data, 'room', 'chat')
  331. }
  332. }, callback);
  333. };
  334. emailer.roomInvite = function (to, data, callback) {
  335. data.name = data.roomname.replace('#', '');
  336. sendEmail(to, 'emails/room-invite.html', {
  337. username: data.username,
  338. roomname: data.roomname,
  339. title: i18next.t('email.roominvite.content.title', {
  340. roomname: data.roomname,
  341. username: data.username
  342. }),
  343. subject: i18next.t('email.roominvite.subject', {
  344. roomname: data.roomname,
  345. username: data.username
  346. }),
  347. roomlink: {
  348. url: conf.url + urls(data, 'room', 'url'),
  349. chat: conf.url + urls(data, 'room', 'chat')
  350. },
  351. email_heading_action: false
  352. }, callback);
  353. };
  354. emailer.roomDelete = function (to, data, callback) {
  355. data.name = data.groupname;
  356. sendEmail(to, 'emails/room-delete.html', {
  357. username: data.username,
  358. roomname: data.roomname,
  359. title: i18next.t('email.roomdelete.content.title', {
  360. roomname: data.roomname,
  361. username: data.username
  362. }),
  363. subject: i18next.t('email.roomdelete.subject', {
  364. roomname: data.roomname,
  365. username: data.username
  366. }),
  367. email_heading_action: {
  368. action: i18next.t('email.roomdelete.content.action')
  369. },
  370. grouplink: {
  371. chat: conf.url + urls(data, 'group', 'chat'),
  372. url: conf.url + urls(data, 'group', 'url')
  373. }
  374. }, callback);
  375. };
  376. emailer.roomCreate = function (to, data, callback) {
  377. data.name = data.roomname.replace('#', '');
  378. sendEmail(to, 'emails/room-create.html', {
  379. username: data.username,
  380. roomname: data.roomname,
  381. title: i18next.t('email.roomcreate.content.title', {
  382. roomname: data.roomname,
  383. username: data.username
  384. }),
  385. subject: i18next.t('email.roomcreate.subject', {
  386. roomname: data.roomname,
  387. username: data.username
  388. }),
  389. roomlink: {
  390. url: conf.url + urls(data, 'room', 'url'),
  391. chat: conf.url + urls(data, 'room', 'chat')
  392. },
  393. email_heading_action: false
  394. }, callback);
  395. };
  396. emailer.roomTopic = function (to, from, room, topic, callback) {
  397. var data = { name: room.replace('#', '') };
  398. sendEmail(to, 'emails/room-topic.html', {
  399. username: from,
  400. roomname: room,
  401. title: i18next.t('email.roomtopic.content.title', {
  402. username: from,
  403. roomname: room
  404. }),
  405. topic: topic,
  406. subject: i18next.t('email.roomtopic.subject', {
  407. username: from,
  408. roomname: room
  409. }),
  410. roomlink: {
  411. url: conf.url + urls(data, 'room', 'url'),
  412. chat: conf.url + urls(data, 'room', 'chat')
  413. },
  414. email_heading_action: false
  415. }, callback);
  416. };
  417. emailer.userMention = function (to, events, from, room, callback) {
  418. var data = { name: room.replace('#', '') };
  419. sendEmail(to, 'emails/user-mention.html', {
  420. events: events,
  421. username: from,
  422. roomname: room,
  423. title: i18next.t('email.usermention.content.title', {
  424. username: from,
  425. roomname: room
  426. }),
  427. subject: i18next.t('email.usermention.subject', {
  428. username: from,
  429. roomname: room
  430. }),
  431. roomlink: {
  432. url: conf.url + urls(data, 'room', 'url'),
  433. chat: conf.url + urls(data, 'room', 'chat')
  434. },
  435. email_heading_action: false
  436. }, callback);
  437. };
  438. emailer.userMessage = function (to, from, events, callback) {
  439. var data = {username: from};
  440. sendEmail(to, 'emails/user-message.html', {
  441. events: events,
  442. username: from,
  443. title: i18next.t('email.usermessage.content.title', {username: from}),
  444. subject: i18next.t('email.usermessage.subject', {username: from}),
  445. userlink: {
  446. chat: conf.url + urls(data, 'user', 'chat')
  447. },
  448. email_heading_action: false
  449. }, callback);
  450. };
  451. emailer.roomMessage = function (to, events, roomName, roomAvatar, callback) {
  452. var data = { name: roomName.replace('#', '') };
  453. sendEmail(to, 'emails/room-message.html', {
  454. events: events,
  455. roomname: roomName,
  456. roomavatar: roomAvatar,
  457. title: i18next.t('email.roommessage.content.title', {roomname: roomName}),
  458. subject: i18next.t('email.roommessage.subject', {roomname: roomName}),
  459. roomlink: {
  460. url: conf.url + urls(data, 'room', 'url'),
  461. chat: conf.url + urls(data, 'room', 'chat')
  462. },
  463. email_heading_action: false
  464. }, callback);
  465. };
  466. emailer.groupRequest = function (to, data, callback) {
  467. data.name = data.groupname;
  468. sendEmail(to, 'emails/group-join-request.html', {
  469. username: data.username,
  470. groupname: data.groupname.replace('#', ''),
  471. title: i18next.t('email.groupjoinrequest.content.title', {
  472. groupname: data.groupname.replace('#', ''),
  473. username: data.username
  474. }),
  475. subject: i18next.t('email.groupjoinrequest.subject', {groupname: data.groupname.replace('#', '')}),
  476. grouplink: {
  477. chat: conf.url + urls(data, 'group', 'chat'),
  478. url: conf.url + urls(data, 'group', 'url')
  479. },
  480. email_heading_action: false
  481. }, callback);
  482. };
  483. emailer.groupAllow = function (to, data, callback) {
  484. data.name = data.groupname;
  485. sendEmail(to, 'emails/group-allow.html', {
  486. username: data.username,
  487. groupname: data.groupname.replace('#', ''),
  488. title: i18next.t('email.groupallow.content.title', {
  489. groupname: data.groupname,
  490. username: data.username
  491. }),
  492. subject: i18next.t('email.groupallow.subject', {groupname: data.groupname}),
  493. grouplink: {chat: conf.url + urls(data, 'group', 'chat')},
  494. email_heading_action: {
  495. action: i18next.t('email.groupallow.content.action')
  496. }
  497. }, callback);
  498. };
  499. emailer.groupDisallow = function (to, data, callback) {
  500. data.name = data.groupname;
  501. sendEmail(to, 'emails/group-disallow.html', {
  502. username: data.username,
  503. groupname: data.groupname.replace('#', ''),
  504. title: i18next.t('email.groupdisallow.content.title', {
  505. groupname: data.groupname,
  506. username: data.username
  507. }),
  508. subject: i18next.t('email.groupdisallow.subject', {groupname: data.groupname}),
  509. grouplink: {
  510. chat: conf.url + urls(data, 'group', 'chat'),
  511. url: conf.url + urls(data, 'group', 'url')
  512. },
  513. email_heading_action: {
  514. action: i18next.t('email.groupdisallow.content.action')
  515. }
  516. }, callback);
  517. };
  518. emailer.groupInvite = function (to, data, callback) {
  519. data.name = data.groupname;
  520. sendEmail(to, 'emails/group-invite.html', {
  521. username: data.username,
  522. groupname: data.groupname.replace('#', ''),
  523. title: i18next.t('email.groupinvite.content.title', {
  524. groupname: data.groupname,
  525. username: data.username
  526. }),
  527. subject: i18next.t('email.groupinvite.subject', {
  528. groupname: data.groupname,
  529. username: data.username
  530. }),
  531. grouplink: {
  532. chat: conf.url + urls(data, 'group', 'chat'),
  533. url: conf.url + urls(data, 'group', 'url')
  534. },
  535. email_heading_action: false
  536. }, callback);
  537. };
  538. emailer.groupRefuse = function (to, data, callback) {
  539. data.name = data.groupname;
  540. sendEmail(to, 'emails/group-refuse.html', {
  541. username: data.username,
  542. groupname: data.groupname.replace('#', ''),
  543. title: i18next.t('email.grouprefuse.content.title', {
  544. groupname: data.groupname,
  545. username: data.username
  546. }),
  547. subject: i18next.t('email.grouprefuse.subject', {
  548. groupname: data.groupname,
  549. username: data.username
  550. }),
  551. email_heading_action: {
  552. action: i18next.t('email.grouprefuse.content.action')
  553. },
  554. grouplink: {
  555. chat: conf.url + urls(data, 'group', 'chat'),
  556. url: conf.url + urls(data, 'group', 'url')
  557. }
  558. }, callback);
  559. };
  560. emailer.groupBan = function (to, data, callback) {
  561. data.name = data.groupname;
  562. sendEmail(to, 'emails/group-ban.html', {
  563. username: data.username,
  564. groupname: data.groupname.replace('#', ''),
  565. title: i18next.t('email.groupban.content.title', {groupname: data.groupname.replace('#', '')}),
  566. subject: i18next.t('email.groupban.subject', {groupname: data.groupname.replace('#', '')}),
  567. grouplink: {
  568. chat: conf.url + urls(data, 'group', 'chat'),
  569. url: conf.url + urls(data, 'group', 'url')
  570. },
  571. email_heading_action: {
  572. action: i18next.t('email.groupban.content.action')
  573. }
  574. }, callback);
  575. };
  576. emailer.groupDeban = function (to, data, callback) {
  577. data.name = data.groupname;
  578. sendEmail(to, 'emails/group-deban.html', {
  579. username: data.username,
  580. groupname: data.groupname.replace('#', ''),
  581. title: i18next.t('email.groupdeban.content.title', {groupname: data.groupname.replace('#', '')}),
  582. subject: i18next.t('email.groupdeban.subject', {groupname: data.groupname.replace('#', '')}),
  583. grouplink: {
  584. chat: conf.url + urls(data, 'group', 'chat'),
  585. url: conf.url + urls(data, 'group', 'url')
  586. },
  587. email_heading_action: {
  588. action: i18next.t('email.groupdeban.content.action')
  589. }
  590. }, callback);
  591. };
  592. emailer.groupOp = function (to, data, callback) {
  593. data.name = data.groupname;
  594. sendEmail(to, 'emails/group-op.html', {
  595. username: data.username,
  596. groupname: data.groupname.replace('#', ''),
  597. title: i18next.t('email.groupop.content.title', {groupname: data.groupname.replace('#', '')}),
  598. subject: i18next.t('email.groupop.subject', {groupname: data.groupname.replace('#', '')}),
  599. grouplink: {
  600. chat: conf.url + urls(data, 'group', 'chat'),
  601. url: conf.url + urls(data, 'group', 'url')
  602. },
  603. email_heading_action: {
  604. action: i18next.t('email.groupop.content.action')
  605. }
  606. }, callback);
  607. };
  608. emailer.groupDeop = function (to, data, callback) {
  609. data.name = data.groupname;
  610. sendEmail(to, 'emails/group-deop.html', {
  611. username: data.username,
  612. groupname: data.groupname.replace('#', ''),
  613. title: i18next.t('email.groupdeop.content.title', {groupname: data.groupname.replace('#', '')}),
  614. subject: i18next.t('email.groupdeop.subject', {groupname: data.groupname.replace('#', '')}),
  615. grouplink: {
  616. chat: conf.url + urls(data, 'group', 'chat'),
  617. url: conf.url + urls(data, 'group', 'url')
  618. },
  619. email_heading_action: {
  620. action: i18next.t('email.groupdeop.content.action')
  621. }
  622. }, callback);
  623. };