Browse Source

✨ feat: 邮件采用多个发送源

Pchen. 7 months ago
parent
commit
edf1ed31dd
1 changed files with 41 additions and 28 deletions
  1. 41 28
      plugin/Email/Email.js

+ 41 - 28
plugin/Email/Email.js

@@ -1,41 +1,54 @@
-const nodemailer = require('nodemailer');
-const config = require('../../config.json');
-const path = require('path');
-const Logger = require('../../lib/Logger');
+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');
-
-const transporter = nodemailer.createTransport({
-    host: config.email.host,
-    port: config.email.port,
-    auth: {
-        user: config.email.user,
-        pass: config.email.password
-    }
-})
+const logger = new Logger(path.join(__dirname, '../../logs/Email.log'), 'INFO')
 
+/**
+ * 尝试用多个邮箱配置发送邮件
+ * @param {string} email - 收件人邮箱
+ * @param {string} subject - 邮件主题
+ * @param {string} content - 邮件内容(支持 HTML)
+ */
 async function sendEmail(email, subject, content) {
-    return new Promise((resolve, reject) => {
+    return new Promise(async (resolve, reject) => {
         const mail = {
-            from: config.email.from,
             to: email,
             subject: subject,
             html: content
         }
-        try {
-            transporter.sendMail(mail, (error) => {
-                if (error) {
-                    logger.error('邮件发送失败:', error);
-                    reject(error);
-                } else {
-                    resolve();
+
+        // 遍历所有邮箱配置
+        for (let i = 0; i < config.email.length; i++) {
+            const currentConfig = config.email[i];
+
+            const transporter = nodemailer.createTransport({
+                host: currentConfig.host,
+                port: currentConfig.port,
+                secure: currentConfig.secure || false,
+                auth: {
+                    user: currentConfig.user,
+                    pass: currentConfig.password
+                }
+            });
+
+            mail.from = currentConfig.from
+
+            try {
+                await transporter.sendMail(mail)
+                logger.info(`邮件发送成功,使用账号: ${currentConfig.user}`)
+                return resolve()
+            } catch (error) {
+                logger.error(`邮件发送失败 (${currentConfig.user}),错误:`, error)
+                if (i === config.email.length - 1) {
+                    // 最后一个配置也失败了
+                    return reject(error)
                 }
-            })
-        } catch (error) {
-            logger.error('邮件发送失败:', error);
-            reject(error);
+                // 否则继续下一个配置
+            }
         }
     })
 }
 
-module.exports = sendEmail;
+module.exports = sendEmail