发送完整格式的HTML电子邮件

时间:2015-04-08 13:19:43

标签: meteor

我试图通过meteor发送完整形式且合规的HTML电子邮件,其中应包含doctype和html标签:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

我已经遵循了这个解决方案:Using dynamic HTML templates in Meteor emails

大部分都有效,但Meteor无法处理doctype和html,抛出此错误:

While building the application:
email/client/templates/receipt.html:2: Unexpected Doctype
...l1-transitional.dtd"> <html xmlns="http:/...
^

我猜Meteor想要包装自己的标签,但是如何覆盖它呢?

2 个答案:

答案 0 :(得分:3)

Meteor Blaze不喜欢呈现HTML或DOCTYPE,但你可以欺骗它来渲染开始和结束标签以包装这样的模板:

var dataContext = {
    htmlHead: '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml">',
    htmlFoot: '</html>'
}

var html = Blaze.toHTMLWithData(Template.email, dataContext);

注意doctype之后缺少一个新行,我发现这是避免编译错误所必需的,虽然我无法验证这是一个可重现的警告。

在您的模板中,只需指定带有三个括号的变量:

{{{htmlHead}}}
...
{{{htmlFoot}}}

这会产生一个完全形成的输出,准备与Email.send

一起发送

感谢Meteor Hacks提供了引发这一想法的相关解决方案。

答案 1 :(得分:1)

虽然动态模板是一种可能的解决方案,但SSR(服务器端渲染)确实使电子邮件管理变得容易。我有我的应用程序设置,以便样板标题来自一个模板,而电子邮件的正文内容来自第二个。这使我的所有电子邮件模板都非常简单,并允许我集中控制来自我的应用程序的所有电子邮件的外观:

在server / config.js中我定义:

Accounts.getTemplate = function(templatePath){ 
  return Assets.getText('email.html')+Assets.getText(templatePath)+"</body></html>";
};

其中 email.html 是样板模板,其中包含<!DOCTYPE html...前导码等内容。请注意,在将样板模板与特定模板合并之后,我将附加"</body></html>",以便每个特定模板都不需要关闭文档。它只是使特定模板中的HTML更清晰,模板DRY。 email.html 以及我所有的特定模板都位于 / private 子目录中。

当我需要发送电子邮件时,我使用SSR:

SSR.compileTemplate('myTemplateName',Accounts.getTemplate('myTemplateName.html'));
var html = SSR.render("myTemplateName",{ key1: value1, key2: value2, ... });
Email.send( {from: sender, to: recipient, subject: subject, html: html});
相关问题