Email.js 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. const nodemailer = require('nodemailer')
  2. const config = require('../../config.json')
  3. const path = require('path')
  4. const Logger = require('../../lib/Logger')
  5. const logger = new Logger(path.join(__dirname, '../../logs/Email.log'), 'INFO')
  6. /**
  7. * 尝试用多个邮箱配置发送邮件;失败时仅记录日志并 resolve(false),不抛错、不 reject。
  8. * @param {string} email - 收件人邮箱
  9. * @param {string} subject - 邮件主题
  10. * @param {string} content - 邮件内容(支持 HTML)
  11. * @returns {Promise<boolean>} 是否至少有一个账号发送成功
  12. */
  13. async function sendEmail(email, subject, content) {
  14. const mail = {
  15. to: email,
  16. subject,
  17. html: content
  18. }
  19. if (!Array.isArray(config.email) || config.email.length === 0) {
  20. logger.error('邮件发送失败:未配置可用邮箱账号')
  21. return false
  22. }
  23. for (let i = 0; i < config.email.length; i++) {
  24. const currentConfig = config.email[i]
  25. if (!currentConfig?.host || !currentConfig?.user) {
  26. logger.error(`邮件发送失败:第 ${i + 1} 个邮箱配置不完整,已跳过`)
  27. continue
  28. }
  29. let transporter
  30. try {
  31. transporter = nodemailer.createTransport({
  32. host: currentConfig.host,
  33. port: currentConfig.port,
  34. secure: currentConfig.secure === true,
  35. auth: {
  36. user: currentConfig.user,
  37. pass: currentConfig.password
  38. }
  39. })
  40. } catch (error) {
  41. logger.error(`邮件传输器创建失败 (${currentConfig.user}):${error.stack || error.message || error}`)
  42. continue
  43. }
  44. mail.from = currentConfig.from || currentConfig.user
  45. try {
  46. await transporter.sendMail(mail)
  47. logger.info(`${email} 邮件发送成功,使用账号: ${currentConfig.user}`)
  48. return true
  49. } catch (error) {
  50. logger.error(`邮件发送失败 (${currentConfig.user}),错误: ${error.stack || error.message || error}`)
  51. }
  52. }
  53. logger.error('邮件发送失败,所有邮箱配置均不可用')
  54. return false
  55. }
  56. module.exports = sendEmail