繁体   English   中英

预订提醒 Nodemailer node-cron MongoDB

[英]Booking reminder Nodemailer node-cron MongoDB

我在发送预订提醒 email 时遇到问题。 我使用 nodemailer 和 node-cron。 它运作良好。 我想从数据库中读取日期,例如在预订前一周发送 email。 我不知道该怎么做。 我的 model:

  start_time: {
    type: String,
    required: true,
  },
  hour: {
    type: String,
    required: true,
  },
  courtId: {
    type: String,
    required: true,
  },
  userId: {
    type: ObjectId,
    ref: 'userModel',
    required: true,
  },
});

在此处输入图像描述

const cron = require('node-cron');
const nodemailer = require('nodemailer');
const { getMaxListeners } = require('../config/database');

const sendEmail = function () {
  const transporter = nodemailer.createTransport({
    service: 'gmail',
    auth: {
      user: `${process.env.EMAIL_ADDRESS}`,
      pass: `${process.env.EMAIL_PASSWORD}`,
    },
  });

  const mailOptions = {
    from: `${process.env.EMAIL_ADDRESS}`,
    to: `${''}`,
    subject: 'Link To Reset Password',
    text:
      'wiadomosć',
  };

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

module.exports.task = function () {
  cron.schedule('00 * * * * *', () => {
    console.log('send');
    //sendEmail();
  });
};

我认为开始时间解析到日期? 一周后怎么看这个预订?

model:***(我将 start_time 更改为类型:日期并添加了 email_sent)

  start_time: {
    type: Date,
    required: true,
  },
  email_sent: {
   type:Boolean,
   default:"false",
   required:true
   },
  hour: {
    type: String,
    required: true,
  },
  courtId: {
    type: String,
    required: true,
  },
  userId: {
    type: ObjectId,
    ref: 'userModel',
    required: true,
  },
});

服务器:

cron.schedule('00 * * * * *', () => {
Modal.find({}).
  then(allUsers => {
   for(let user of allUsers){              
    if(Date.now() < (user.start_time - (24*60*60*1000) * 7) && user.email_sent === false){
     //sendEmail();
     // here you need to update user.email_sent: true. and save.
    }
   }
  })
});

*我也建议这样做,只找到 email_sent: false。 您可以使用 mongoose 查看如何操作。 (那么你不需要在 if 语句中检查它) *Model.find({ email_sent: "false" })

我只是在我的脑海中做了它,我没有检查,你可能会遇到的错误:

  1. 您将需要转换 start_time
  2. 检查 boolean email_sent 你如何获得它(作为字符串或布尔值)它将影响 if 语句。

这只是如何实现它的想法。 我没有测试代码。 请尝试代码,如果您遇到任何问题,请告诉我

我正在将字符串解析为 DATE。 2021-1-16 至 2021-01-15T23:00:00.000Z

const nodemailer = require('nodemailer');
const { getMaxListeners } = require('../config/database');
const reservationModel = require('../models/reservationModel');

const sendEmail = function () {
  const transporter = nodemailer.createTransport({
    service: 'gmail',
    auth: {
      user: `${process.env.EMAIL_ADDRESS}`,
      pass: `${process.env.EMAIL_PASSWORD}`,
    },
  });

  const mailOptions = {
    from: `${process.env.EMAIL_ADDRESS}`,
    to: `${''}`,
    subject: 'Link To Reset Password',
    text: 'wiadomosć',
  };

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

module.exports.task = function () {
  cron.schedule('00 * * * * *', () => {
    console.log('scheduled');
    reservationModel.find({ email_sent: false }).then(allReservation => {
      for (let result of allReservation) {
        let date = new Date(result.start_time);
        console.log(date);
        if (Date.now() < date - 24 * 60 * 60 * 1000 * 7) {
          console.log('send');
          sendEmail();
        }
      }
    });
  });
};

邮件从未发送 2021-01-15T23:00:00.000Z - 字符串到日期 1610277840044 Date.now()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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