简体   繁体   中英

nodemailer is sending email for each invalid url

I have created a script in node.js which basically fetch some urls and get their http status codes. If the http status code are not equal to 200 and I want to send mail using nodemailer. (In the email I want to also send the url that is down).

Currently if 2 urls are down, nodemailer is sending 2 seperate e-mails. I only want to send one e-mail which will contain all the invalid urls.

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.message,
      });
    });
  });
}

let promiseList = urlList.map((url) => getStatus(url));

Promise.all(promiseList).then((resultList) => {
  resultList.forEach((result) => {
    if (result.status.startsWith("Down")) {
      console.log(result);
      const message = {
        from: "from-email",
        to: "to-email",
        subject: "Subject",
        html: `<h1>Following URLs have issues:</h1>
            <p>${result} is down</p>`,
      };

      transporter.sendMail(message, function (err, info) {
        if (err) {
          console.log(err);
        } else {
          console.log(info);
        }
      });
    } else {
      return;
    }
  });
});

This can be a guide to your solution.

let promiseList = urlList.map((url) => getStatus(url));

//return a list of only the sites in an array with status of Down
const returnListOfUrls = Promise.all(promiseList).then((resultList) => {
  const listWithDownStatus = resultList.map((result) => result.status.startsWith("Down") && result.site).filter(Boolean)
  return listWithDownStatus
 });

//Once the urls have all been resolved, send mail outside of loop
const runNodeMailer = () => {
  returnListOfUrls.then(res =>{
      const message = {
        from: "from-email",
        to: "to-email",
        subject: "Subject",
        html: `<h1>Following URLs have issues:</h1>
            <p>${res.join(', ')} is down</p>`,
      };
  
  console.log(res, '---', message);
  })
}

runNodeMailer()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM