我使用 nodemailer 提交电子邮件并从我的本地主机运行。我在以下目录中手动创建了电子邮件服务 /api/email/services/Email.js
const nodemailer = require('nodemailer');
const transporter = nodemailer.createTransport({
host: 'example.com',
port: 587,
secure: false,
auth: {
user: 'user',
pass: 'password',
},
});
module.exports = {
send: (from, to, subject, html) => {
const options = {
from,
to,
subject,
html
};
return transporter.sendMail(options);
},
};
这样我就可以像 strapi.services.email.send(from, email, subject, html);
通常,我在要在电子邮件服务中传递的代码行 const html = '<p>Email testing</p>'
中编写我的 html 模板。但我不想对来自不同控制器的每个电子邮件提交都这样做。
因此,我在 /config/email-templates/custom-email.html
中创建了一个 html 模板,并尝试将其命名为 const html = path.join(__dirname + '/../../../config/email-templates/custom-email.html');
。
当我运行它时,可以成功发送电子邮件,但无法呈现 html。它不是呈现的 html,而是将 custom-email.html
的完整路径显示为电子邮件消息。这种方法可以在trapi中实现吗?
答案 0 :(得分:2)
您需要传递实际内容,而不是传递文件的路径。在第一种情况 const html = '<p>Email testing</p>'
中,您实际上是在传递内容,但在第二种情况下,您正在传递文件路径。
修改后的发送方法可能如下所示:
send: (from, to, subject, htmlpath) => {
const readHTMLFile = (path, callback)=> {
fs.readFile(path, {encoding: "utf-8"}, function (err, html) {
if (err)
return callback(err);
else
return callback(null, html);
});
}
readHTMLFile(htmlpath, function(err, html) {
const options = {
from,
to,
subject,
html
};
return transporter.sendMail(options);
}); }