使用 pm2 和 nodemailer 每天发送一次电子邮件

使用 pm2 和 nodemailer 每天发送一次电子邮件

我们正在使用一台Ubuntu 18.04服务器来pm2安排node.js启动时启动后端,并有一个工作nodemailer脚本,该脚本向我们的团队成员发送一封电子邮件,其中包含服务器上某些资源的状态。

如果使用 手动启动,此脚本将有效node script.js。如果使用 启动,pm2 start script.js它将持续发送电子邮件而不会停止。我认为这是因为pm2在脚本完成后重新启动脚本可以保持其正常运行。经过一番搜索,我找到了该--no-restart选项,我只需使用 运行一次即可

`pm2 start script.js --no-autorestart`

由于目标是每天 09:00 发送电子邮件,并且pm2具有集成cron功能,因此我尝试运行

pm2 start reportOfflineDevices.js --no-autorestart --cron "0 9 * * *"

但它没有发送任何电子邮件。经过进一步搜索,我发现它pm2仅使用其cron功能来重新启动正在运行的进程。由于我包含了该--no-autorestart选项,因此在它运行一次后,它被列为pm2 status已停止,因此不会重新启动。

最后,我尝试了一种简单的方法,while(1);在脚本末尾添加一个以使其保持运行,但它甚至不会发送电子邮件,并top显示脚本占用了 100% 的 CPU 资源。事后看来,我想这是有道理的……

最后,我要么找到一种方法来保持脚本正常运行而不消耗 CPU 资源,要么忘掉它pm2,只使用普通的旧版本cron。您觉得呢?

我在这里发布了我的脚本的简化的最小工作示例(如果在传输器中配置了正确的服务器和身份验证)。

const fetch = require("node-fetch");
const moment = require('moment');
const nodemailer = require('nodemailer');

const report = async () => {
    var transporter = nodemailer.createTransport({
        auth: {
            user: '[email protected]',
            pass: 'password'
        },
        host: 'our.server.blabla',
        port: 465,
        secure: true
    });

    var sendToEngineering = {
        from: '[email protected]',
        to: '[email protected]',
        subject: 'Report',
        text: "report"
    };

    transporter.sendMail(sendToEngineering, function (error, info) {
        if (error) {
            return error;
        } else {
            return 'Email sent: ' + info.response;
        }
    });
}
report();

答案1

看起来真的很有趣,但我要做的是将其创建为一个快速应用程序并添加 node-cron 包,然后您可以按如下方式更改代码:


const fetch = require("node-fetch");
const moment = require('moment');
const nodemailer = require('nodemailer');

const express = require("express");
const cron = require("node-cron");

// setup your express server as an app
var app = express();

const report = async () => {
    var transporter = nodemailer.createTransport({
        auth: {
            user: '[email protected]',
            pass: 'password'
        },
        host: 'our.server.blabla',
        port: 465,
        secure: true
    });

    var sendToEngineering = {
        from: '[email protected]',
        to: '[email protected]',
        subject: 'Report',
        text: "report"
    };

    transporter.sendMail(sendToEngineering, function (error, info) {
        if (error) {
            return error;
        } else {
            return 'Email sent: ' + info.response;
        }
    });
}

// start scheduling the execution of your function on a daily basis use
// https://crontab.guru to determine your timings
// don't forget that these times are ofcourse based on the server times so you need 
// to change it for your timezone
cron.schedule("0 8 * * *, function() {
    report();
});

app.listen(3129);

// next line is to ensure it executes atleast once when restarting pm2
report();

这样,您的报告功能应该每天执行一次,如果您的服务器/应用程序需要更新,您可以轻松重新启动服务器并接收邮件以确保没有问题。

相关内容