You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化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));

关键优化点

  1. 修正状态判断逻辑:原脚本仅判断请求错误,忽略了「无错误但状态码非200」的情况,现在统一将非200的情况标记为失效。
  2. 增加邮件发送判断:通过失效URL列表的长度决定是否发送邮件,避免空内容邮件。
  3. 优化邮件内容展示:用列表形式展示失效URL,可读性更强。

内容的提问来源于stack exchange,提问作者ujjwal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 14:45:30