javascript - Nodemailer 和 HTML 模板 - 遍历数组中的项目
问题描述
我已经开始使用 Nodemailer 并且可以发送电子邮件了。我决定使用 HTML 作为一种格式,并且包括 CSS 的引导程序。我所有的模板变量都得到了正确的插值,但我需要遍历一个数组并显示这些项目。我目前无法执行此操作,并且需要一些帮助。
router.post('/', auth.isAuthenticated, async (req, res) => {
try {
// Add request to new object - to save
let request = new Request(req.body);
// Save request
let savedRequest = await request.save();
// Get request ID and save to associated project
let project = await Project.findByIdAndUpdate(
request.project,
{
$push: { requests: savedRequest._id }
},
{ new: true }
);
// If notifyPM is true, send request to project manager
if (req.body.notifyPM) {
let mailOptions = {
from: process.env.NODEMAILER_EMAIL,
to: savedRequest.projectManager.email,
subject: `PROJECT REQUEST FOR -- ${project.projectTitle} -- FROM -- ${savedRequest.userName}`,
html: `
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css">
<title>Request</title>
</head>
<body>
<script>
${savedRequest.requestItems}.forEach(myFunction);
function myFunction(item, index) {
document.getElementById("requestContainer").innerHTML += index + ":" + item + "<br>";
}
</script>
<div class="container mt-3">
<div class="row">
<div class="col-sm">
<div class="card">
<div class="card-header bg-light text-dark">
<h3><strong>Project: </strong>${project.projectTitle}</h3>
<h4><strong>From: </strong>${savedRequest.userName}</h4>
</div>
<div class="card-body border border-light">
<div class="row">
<div class="col-sm">
<table class="table">
<thead>
<th>Department</th>
<th>Job Type</th>
<th>Episode</th>
</thead>
<tbody>
<tr>
<td>${savedRequest.department}</td>
<td>${savedRequest.jobType}</td>
<td>${savedRequest.episode}</td>
</tr>
</tbody>
</table>
</div>
</div>
<div class="row">
<div class="col-sm">
<h5>Request Items</h5>
<div id="requestContainer"></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
`
};
transporter.sendMail(mailOptions, function(error, info) {
if (error) {
console.log(error);
} else {
console.log('Email sent: ' + info.response);
}
});
}
res.status(200).json({
message: 'Request saved successfully',
request: savedRequest
});
} catch (error) {
res.status(500).json({
message: 'Error saving request'
});
}
});
解决方案
这是我的 EJS 渲染(省略了 HTML)
// Render EJS
const data = await ejs.renderFile(
__dirname + '/workOrderEmailTemplate.ejs',
{
user: wo.user,
finalDuration: wo.finalDuration,
title: wo.projectTitle,
showCode: wo.showCode,
episode: wo.episode,
woNumber: wo.workOrderNumber,
location: wo.location,
services: wo.services,
clientPresent: wo.clientPresent,
woType: wo.workOrderType,
notes: wo.notes
}
);
const mailOptions = {
from: process.env.NODEMAILER_EMAIL,
to: wo.projectManagerEmail,
subject: `WORK ORDER for -- ${wo.projectTitle} -- from -- ${wo.user}`,
html: data
};
transporter.sendMail(mailOptions, function(err, info) {
if (err) {
console.log('Error in SendMail function', err);
} else {
console.log('Message sent: ' + info.response);
}
});
推荐阅读
- javascript - 获取导出组件的当前状态值
- python - 如何使用自定义模型从 YoloV5 推理中获取边界框坐标?
- c - 使用 gmock 模拟 c 风格的函数
- javascript - PDF-LIB 从现有 PDF 添加文本和图像
- html - 你如何打破html中的一串空白?
- bash - 我的 bash 脚本有什么问题,为什么它不起作用?
- r - 如何使用while循环计算一个值的平均值?
- c# - IIS 上托管的 ASP.NET Core:如何获取 app.pool 标识的用户目录?
- vuejs2 - 在测试期间更改 Vue“提供”数据
- ffmpeg - 如何将 ffmpeg 命令转换为使用 ffmpy?