mailer.js 3.1 KB

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