const nodemailer = require('nodemailer') const config = require('../../config.json') const path = require('path') const Logger = require('../../lib/Logger') const logger = new Logger(path.join(__dirname, '../../logs/Email.log'), 'INFO') /** * 尝试用多个邮箱配置发送邮件;失败时仅记录日志并 resolve(false),不抛错、不 reject。 * @param {string} email - 收件人邮箱 * @param {string} subject - 邮件主题 * @param {string} content - 邮件内容(支持 HTML) * @returns {Promise} 是否至少有一个账号发送成功 */ async function sendEmail(email, subject, content) { const mail = { to: email, subject, html: content } if (!Array.isArray(config.email) || config.email.length === 0) { logger.error('邮件发送失败:未配置可用邮箱账号') return false } for (let i = 0; i < config.email.length; i++) { const currentConfig = config.email[i] if (!currentConfig?.host || !currentConfig?.user) { logger.error(`邮件发送失败:第 ${i + 1} 个邮箱配置不完整,已跳过`) continue } let transporter try { transporter = nodemailer.createTransport({ host: currentConfig.host, port: currentConfig.port, secure: currentConfig.secure === true, auth: { user: currentConfig.user, pass: currentConfig.password } }) } catch (error) { logger.error(`邮件传输器创建失败 (${currentConfig.user}):${error.stack || error.message || error}`) continue } mail.from = currentConfig.from || currentConfig.user try { await transporter.sendMail(mail) logger.info(`${email} 邮件发送成功,使用账号: ${currentConfig.user}`) return true } catch (error) { logger.error(`邮件发送失败 (${currentConfig.user}),错误: ${error.stack || error.message || error}`) } } logger.error('邮件发送失败,所有邮箱配置均不可用') return false } module.exports = sendEmail