我试图通过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想要包装自己的标签,但是如何覆盖它呢?
答案 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});