Strapi 自定义电子邮件模板

时间:2021-03-04 10:45:09

标签: html-email strapi

我使用 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中实现吗?

1 个答案:

答案 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);

  }); }