feat: complete day 4
This commit is contained in:
@@ -0,0 +1,66 @@
|
||||
const db = require("../models");
|
||||
const nodemailer = require("nodemailer");
|
||||
require("dotenv").config();
|
||||
|
||||
(async () => {
|
||||
try {
|
||||
const EmailQueue = db.email_queue;
|
||||
const Email = db.email;
|
||||
const User = db.user;
|
||||
const today = new Date();
|
||||
today.setHours(0, 0, 0, 0);
|
||||
const tomorrow = new Date(today);
|
||||
tomorrow.setDate(today.getDate() + 1);
|
||||
|
||||
// 1. Get all email_queue entries for today and not sent
|
||||
const queues = await EmailQueue.findAll({
|
||||
where: {
|
||||
send_at: { $gte: today, $lt: tomorrow },
|
||||
status: 0,
|
||||
},
|
||||
});
|
||||
if (!queues.length) {
|
||||
console.log("No emails to send today.");
|
||||
return;
|
||||
}
|
||||
|
||||
// 2. Setup nodemailer with Mailtrap
|
||||
const transporter = nodemailer.createTransport({
|
||||
host: process.env.MAILTRAP_HOST,
|
||||
port: process.env.MAILTRAP_PORT,
|
||||
auth: {
|
||||
user: process.env.MAILTRAP_USER,
|
||||
pass: process.env.MAILTRAP_PASS,
|
||||
},
|
||||
});
|
||||
|
||||
let sentCount = 0;
|
||||
for (const queue of queues) {
|
||||
// 3. Get user and email
|
||||
const user = await User.findByPk(queue.user_id);
|
||||
const email = await Email.findByPk(queue.email_id);
|
||||
if (!user || !email) continue;
|
||||
// 4. Replace template
|
||||
let body = email.body
|
||||
.replace(/\{\{\{NAME\}\}\}/g, user.name)
|
||||
.replace(/\{\{\{EMAIL\}\}\}/g, user.email);
|
||||
// 5. Send email
|
||||
await transporter.sendMail({
|
||||
from: "noreply@example.com",
|
||||
to: user.email,
|
||||
subject: email.subject,
|
||||
html: body,
|
||||
});
|
||||
// 6. Mark as sent
|
||||
queue.status = 1;
|
||||
queue.updated_at = new Date();
|
||||
await queue.save();
|
||||
sentCount++;
|
||||
}
|
||||
console.log(`Sent ${sentCount} emails.`);
|
||||
process.exit(0);
|
||||
} catch (err) {
|
||||
console.error("Error in email_sending cronjob:", err);
|
||||
process.exit(1);
|
||||
}
|
||||
})();
|
||||
Reference in New Issue
Block a user