mailer.js 3.3 KB

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