Email.js 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. const nodemailer = require('nodemailer')
  2. const path = require('path')
  3. const Logger = require('../../lib/Logger')
  4. const { getRuntimeConfig } = require('../../lib/RuntimeConfig')
  5. const logger = new Logger(path.join(__dirname, '../../logs/Email.log'), 'INFO')
  6. /**
  7. * 尝试用多个邮箱配置发送邮件
  8. * @param {string} email - 收件人邮箱
  9. * @param {string} subject - 邮件主题
  10. * @param {string} content - 邮件内容(支持 HTML)
  11. */
  12. async function sendEmail(email, subject, content) {
  13. return new Promise(async (resolve, reject) => {
  14. const mail = {
  15. to: email,
  16. subject: subject,
  17. html: content
  18. }
  19. let emailConfigs = []
  20. try {
  21. emailConfigs = await getRuntimeConfig('email', { required: false, defaultValue: [] })
  22. } catch (error) {
  23. logger.error(`邮件配置读取失败:${error.stack || error}`)
  24. return resolve(false)
  25. }
  26. if (!Array.isArray(emailConfigs) || emailConfigs.length === 0) {
  27. logger.error('邮件发送失败:未配置可用邮箱账号')
  28. return resolve(false)
  29. }
  30. // 遍历所有邮箱配置
  31. for (let i = 0; i < emailConfigs.length; i++) {
  32. const currentConfig = emailConfigs[i];
  33. const transporter = nodemailer.createTransport({
  34. host: currentConfig.host,
  35. port: currentConfig.port,
  36. auth: {
  37. user: currentConfig.user,
  38. pass: currentConfig.password
  39. }
  40. })
  41. mail.from = currentConfig.from
  42. try {
  43. await transporter.sendMail(mail)
  44. logger.info(`${email}邮件发送成功,使用账号: ${currentConfig.user}`)
  45. return resolve()
  46. } catch (error) {
  47. logger.error(`邮件发送失败 (${currentConfig.user}),错误:`, error.stack)
  48. if (i === emailConfigs.length - 1) {
  49. // 最后一个配置也失败了
  50. logger.error(`邮件发送失败,所有邮箱配置均不可用`)
  51. return resolve(false)
  52. }
  53. // 否则继续下一个配置
  54. }
  55. }
  56. return resolve(false)
  57. })
  58. }
  59. module.exports = sendEmail