如何优化URL校验脚本:仅在存在失效URL时触发Nodemailer发件
URL可用性校验脚本优化
问题说明
我编写了一个校验URL列表可用性的脚本:返回HTTP 200判定为正常,非200则判定失效,同时用Nodemailer实现了邮件推送失效URL列表的功能。当前存在的问题是所有URL均有效时,脚本仍会发送空内容的邮件。
需要实现的逻辑:
- 仅当存在失效URL时,发送包含失效列表的邮件
- 所有URL均有效时,要么发送「无失效URL」的提示邮件,要么直接终止脚本不发送任何邮件
优化方案
场景1:仅在存在失效URL时发送邮件
核心逻辑是获取失效URL列表后,判断列表长度,只有长度大于0时才触发邮件发送。同时修复了原脚本中「非200状态码被误判为正常」的问题。
修改后的完整代码:
const request = require("request"); const nodemailer = require("nodemailer"); // 需要校验的URL列表 const urlList = [ "https://google.com/", "https://googglslfdkfl.com/", ]; // 邮件服务配置 const transporter = nodemailer.createTransport({ host: "smtp.gmail.com", port: 587, auth: { user: "你的邮箱地址", pass: "邮箱授权码/密码", }, secure: false, }); // 获取单个URL的访问状态 function getStatus(url) { return new Promise((resolve, reject) => { request(url, function (error, response, body) { // 修正判断逻辑:无错误且状态码为200才判定正常,否则标记为失效 const isOk = !error && response?.statusCode === 200; resolve({ site: url, status: isOk ? "OK" : `Down: ${error ? error.message : `状态码 ${response.statusCode}`}`, }); }); }); } // 执行校验并处理邮件发送 Promise.all(urlList.map(url => getStatus(url))) .then(resultList => { // 筛选出所有失效的URL const failedUrls = resultList .filter(item => item.status.startsWith("Down")) .map(item => item.site); // 仅当有失效URL时发送邮件 if (failedUrls.length > 0) { const mailOptions = { from: "发送方邮箱", to: "接收方邮箱", subject: "URL可用性告警:存在失效链接", html: `<h1>以下URL无法正常访问:</h1> <ul>${failedUrls.map(url => `<li>${url}</li>`).join("")}</ul>`, }; transporter.sendMail(mailOptions, (err, info) => { err ? console.error("邮件发送失败:", err) : console.log("邮件发送成功:", info); }); } else { console.log("所有URL均正常,无需发送邮件"); } }) .catch(err => console.error("URL校验过程出错:", err));
场景2:两种情况都发送邮件(失效列表/正常提示)
如果需要无论结果如何都发送邮件通知,可根据失效URL列表的长度生成不同的邮件内容:
修改后的完整代码:
const request = require("request"); const nodemailer = require("nodemailer"); // 需要校验的URL列表 const urlList = [ "https://google.com/", "https://googglslfdkfl.com/", ]; // 邮件服务配置 const transporter = nodemailer.createTransport({ host: "smtp.gmail.com", port: 587, auth: { user: "你的邮箱地址", pass: "邮箱授权码/密码", }, secure: false, }); // 获取单个URL的访问状态 function getStatus(url) { return new Promise((resolve, reject) => { request(url, function (error, response, body) { const isOk = !error && response?.statusCode === 200; resolve({ site: url, status: isOk ? "OK" : `Down: ${error ? error.message : `状态码 ${response.statusCode}`}`, }); }); }); } // 执行校验并处理邮件发送 Promise.all(urlList.map(url => getStatus(url))) .then(resultList => { const failedUrls = resultList .filter(item => item.status.startsWith("Down")) .map(item => item.site); let mailOptions; if (failedUrls.length > 0) { mailOptions = { from: "发送方邮箱", to: "接收方邮箱", subject: "URL可用性告警:存在失效链接", html: `<h1>以下URL无法正常访问:</h1> <ul>${failedUrls.map(url => `<li>${url}</li>`).join("")}</ul>`, }; } else { mailOptions = { from: "发送方邮箱", to: "接收方邮箱", subject: "URL可用性通知:所有链接正常", html: "<h1>所有URL均能正常访问,无失效链接</h1>", }; } transporter.sendMail(mailOptions, (err, info) => { err ? console.error("邮件发送失败:", err) : console.log("邮件发送成功:", info); }); }) .catch(err => console.error("URL校验过程出错:", err));
关键优化点
- 修正状态判断逻辑:原脚本仅判断请求错误,忽略了「无错误但状态码非200」的情况,现在统一将非200的情况标记为失效。
- 增加邮件发送判断:通过失效URL列表的长度决定是否发送邮件,避免空内容邮件。
- 优化邮件内容展示:用列表形式展示失效URL,可读性更强。
内容的提问来源于stack exchange,提问作者ujjwal
相关产品推荐
相关产品推荐

