mailer.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. /**
  2. * mailer
  3. */
  4. module.exports = function(app) {
  5. 'use strict';
  6. var debug = require('debug')('crowi:lib:mailer')
  7. , nodemailer = require('nodemailer')
  8. , swig = require('swig')
  9. , config = app.set('config')
  10. , mailConfig = {}
  11. , mailer = {}
  12. , MAIL_TEMPLATE_DIR = app.set('views') + '/mail/'
  13. ;
  14. function createSMTPClient(option)
  15. {
  16. var client;
  17. debug('createSMTPClient option', option);
  18. if (!option) {
  19. option = {
  20. host: config.crowi['mail:smtpHost'],
  21. port: config.crowi['mail:smtpPort'],
  22. auth: {
  23. user: config.crowi['mail:smtpUser'],
  24. pass: config.crowi['mail:smtpPassword']
  25. }
  26. };
  27. if (option.port === 465) {
  28. option.secure = true;
  29. }
  30. }
  31. client = nodemailer.createTransport(option);
  32. debug('mailer setted up for SMTP', client);
  33. return client;
  34. }
  35. function createSESClient(option)
  36. {
  37. var client;
  38. if (!option) {
  39. option = {
  40. accessKeyId: config.crowi['aws:accessKeyId'],
  41. secretAccessKey: config.crowi['aws:secretAccessKey']
  42. };
  43. }
  44. var ses = require('nodemailer-ses-transport');
  45. client = nodemailer.createTransport(ses(option));
  46. debug('mailer setted up for SES', client);
  47. return client;
  48. }
  49. function initialize() {
  50. if (!config.crowi['mail:from']) {
  51. mailer = undefined;
  52. return;
  53. }
  54. if (config.crowi['mail:smtpUser'] && config.crowi['mail:smtpPassword'] && config.crowi['mail:smtpHost'] && config.crowi['mail:smtpPort']
  55. ) {
  56. // SMTP 設定がある場合はそれを優先
  57. mailer = createSMTPClient();
  58. } else if (config.crowi['aws:accessKeyId'] && config.crowi['aws:secretAccessKey']) {
  59. // AWS 設定がある場合はSESを設定
  60. mailer = createSESClient();
  61. } else {
  62. mailer = undefined;
  63. }
  64. mailConfig.from = config.crowi['mail:from'];
  65. mailConfig.subject = config.crowi['app:title'] + 'からのメール';
  66. debug('mailer initialized');
  67. }
  68. function setupMailConfig (overrideConfig) {
  69. var c = overrideConfig
  70. , mc = {}
  71. ;
  72. mc = mailConfig;
  73. mc.to = c.to;
  74. mc.from = c.from || mailConfig.from;
  75. mc.text = c.text;
  76. mc.subject = c.subject || mailConfig.subject;
  77. return mc;
  78. }
  79. function send(config, callback) {
  80. if (mailer) {
  81. var templateVars = config.vars || {};
  82. return swig.renderFile(
  83. MAIL_TEMPLATE_DIR + config.template,
  84. templateVars,
  85. function (err, output) {
  86. if (err) {
  87. throw err;
  88. }
  89. config.text = output;
  90. return mailer.sendMail(setupMailConfig(config), callback);
  91. }
  92. );
  93. } else {
  94. debug('Mailer is not completed to set up. Please set up SMTP or AWS setting.');
  95. return callback(new Error('Mailer is not completed to set up. Please set up SMTP or AWS setting.'), null);
  96. }
  97. }
  98. initialize();
  99. return {
  100. createSMTPClient: createSMTPClient,
  101. createSESClient: createSESClient,
  102. mailer: mailer,
  103. send: send,
  104. };
  105. };