Node.js脚本:解决Nodemailer针对失效URL重复发邮件问题
解决多失效URL发送单封邮件的问题
核心思路是先批量收集所有访问失败的URL信息,再统一发送一封包含全部失效条目的邮件,而非逐个触发邮件发送。
修改后的完整代码:
const request = require("request"); const nodemailer = require("nodemailer"); const urlList = [ "https://www.google.com", "https://www.mongodb.com", "https://www.mongoslsdb33.com", "https://www.google.comslflalfdkjlsdfj", ]; const transporter = nodemailer.createTransport({ host: "smtp.gmail.com", port: 587, auth: { user: "email", pass: "password", }, secure: false, }); function getStatus(url) { return new Promise((resolve, reject) => { request(url, function (error, response, body) { resolve({ site: url, status: !error && response.statusCode === 200 ? "OK" : `Down: ${error ? error.message : `Status Code ${response.statusCode}`}`, }); }); }); } let promiseList = urlList.map((url) => getStatus(url)); Promise.all(promiseList).then((resultList) => { // 过滤出所有访问失败的URL信息 const failedUrls = resultList.filter(result => result.status.startsWith("Down")); // 只有存在失效URL时才发送邮件 if (failedUrls.length > 0) { console.log("检测到失效URL:", failedUrls); // 生成邮件中的失效URL列表HTML const failedListHtml = failedUrls.map(item => `<li>${item.site}: ${item.status}</li>`).join(''); const message = { from: "from-email", to: "to-email", subject: "URL访问状态异常通知", html: `<h1>以下URL访问出现异常:</h1> <ul>${failedListHtml}</ul>`, }; transporter.sendMail(message, function (err, info) { if (err) { console.log("邮件发送失败:", err); } else { console.log("邮件发送成功:", info); } }); } else { console.log("所有URL访问正常"); } });
关键改动说明:
- 新增
failedUrls数组,通过filter方法一次性筛选出所有访问失败的URL记录 - 仅当
failedUrls不为空时,才执行邮件发送逻辑 - 用
map方法将所有失效URL拼接成有序列表的HTML片段,让邮件内容更清晰 - 优化了状态信息:当无网络错误但状态码非200时,显示具体状态码(原代码只处理了error场景,遗漏了状态码非200但无错误的情况)
额外提示:request库已停止维护,建议后续替换为axios或node-fetch等活跃维护的HTTP请求库。
内容的提问来源于stack exchange,提问作者ujjwal
相关产品推荐
相关产品推荐

