Как отправить автоматическую электронную почту в узле js за 24 часа до фиксированной даты?

#node.js #email #schedule

#node.js #Адрес электронной почты #Расписание

Вопрос:

Я хочу реализовать настройку в своем приложении node, чтобы сервер мог отправлять электронные письма нескольким людям за 24 часа до определенной даты. Эта дата поступает из базы данных.

Например: дата 25 декабря, поэтому мне нужно, чтобы мой сервер отправлял письма группе клиентов 24 декабря. Как мне закодировать его сегодня, чтобы он отправлял почту в будущем?

(Мое приложение node размещено на VPS, поэтому оно будет работать всегда.)

Ответ №1:

Вы можете использовать модули расписания узлов. https://www.npmjs.com/package/node-schedule

 var schedule = require('node-schedule');
var date = new Date(2020, 12, 24, 5, 30, 0);

var j = schedule.scheduleJob(date, function(y){ });
 

Или вы можете сделать это по старинке. Что-то вроде.

 const then = "2020-12-24 05:00:00";

const inter = setInterval(() => {
    const now = new Date();
    if (Date.parse(now) > Date.parse(then)) {
       clearInterval(inter);
    }
}, 1000 * 60 * 60 );
 

Редактировать:

У вас может быть что-то вроде.

 const schedules = {};

function dbUpdate() {
    const somedate = new Date();
    const userid = getUpdatedUser();
    cancelSchedule(userid);
    createSchedule(userid, somedate);
}

function createSchedule(userid, somedate) {
    const date = new Date(somedate);
    schedules[userid] = schedule.scheduleJob(date, function(y){ });
}

function cancelSchedule(userid) {
    schedules[userid].cancel();
}
 

Не проверено, но что-то в этом роде

Комментарии:

1. Я понял базу, но у меня были сомнения. Что произойдет, если я запущу сервер сегодня и перезапущу его между ними? Повлияет ли это каким-либо образом на запланированное задание? Кроме того, во 2-м подходе, не будет ли это, если оператор будет выполняться каждый раз после 24 декабря? Я хочу, чтобы электронное письмо отправлялось только один раз, и в этом случае будут отправляться электронные письма после каждого (1000*60*60 ) время после 24 декабря.

2. Нет, расписание будет выполняться при каждом перезапуске сервера. Да, но вы можете использовать clearInterval, когда выполняется оператор. developer.mozilla.org/en-US/docs/Web/API /…

3. Привет, у меня возникли проблемы с планировщиком узлов. Мне нужно запустить его для списка пользователей, и этот список может изменяться / обновляться в БД. Итак, я поместил планировщик в setInterval на 1 час, чтобы он получал обновленные данные из БД, но, к сожалению, теперь он складывает задания каждый час, но мне это нужно, чтобы перепланировать задание для пользователей, у которых уже есть набор заданий. Как я могу этого добиться?

4. Не ставьте расписание в интервал. Он сделает это за вас. просто запустите необходимый код в расписании

5. Но как только мой планировщик выполнит задание для каждого пользователя, что, если список обновится в моей БД? Задания уже назначены в соответствии со старым списком пользователей. Я хочу, чтобы он получал обновленный список из базы данных и устанавливал задания для новых добавленных пользователей без необходимости перезагрузки сервера.