| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- 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<boolean>} 是否至少有一个账号发送成功
- */
- 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
|