【问题标题】:Using dynamic HTML templates in Meteor emails在 Meteor 电子邮件中使用动态 HTML 模板
【发布时间】:2013-07-24 15:11:01
【问题描述】:

有没有办法将 Meteor 模板呈现为电子邮件的 HTML 正文?

例如,如果我想在该电子邮件中显示收集数据或生成动态链接。

【问题讨论】:

    标签: meteor


    【解决方案1】:

    是的,这是可能的,这里我为这个常见问题提供了一个客户端解决方案。

    首先,您应该定义一个简单的模板作为您的电子邮件 html 正文:

    <template name="shareEmailContent">
      <p>{{message}}</p>
      <a href="{{url}}">{{title}}</a>
    </template>
    

    然后您可以使用Email.send(请参阅Email.send at docs.meteor.com,您需要一些适当的配置,例如添加电子邮件智能包并设置MAIL_URL)以电子邮件发送模板渲染的结果。 Email.send 只适用于服务器,因此您必须定义一个可从客户端调用的服务器方法。

    服务器端:

    Meteor.methods({
      sendShareEmail:function(options){
        // you should probably validate options using check before actually
        // sending email
        check(options,{
          from:String,
          // etc...
        });
        Email.send(options);
      }
    });
    

    客户端:

    var dataContext={
      message:"You must see this, it's amazing !",
      url:"http://myapp.com/content/amazingstuff",
      title:"Amazing stuff, click me !"
    };
    var html=Blaze.toHTMLWithData(Template.shareEmailContent,dataContext);
    var options={
      from:"sender@domain.com",
      to:"receiver@domain.com",
      subject:"I want to share this with you !",
      html:html
      })
    };
    Meteor.call("sendShareEmail",options);
    

    如 cmets 中所述,您还可以决定在服务器上呈现电子邮件模板。尚不支持服务器端渲染,但您仍然可以使用第三方模板包完成。

    编辑 06/09/2014:更新为使用最新的 Blaze Meteor 0.9.1 API

    【讨论】:

    • 问题是模板只在客户端工作,所以这只有在您愿意让所有用户都可以查看所有电子邮件模板时才有用。
    • 你是对的,如果你想在服务器端生成你的电子邮件模板(这很有意义),你必须使用这个包,例如:github.com/EventedMind/meteor-handlebars-server
    • 是的,这就是我最终所做的。工作得很好!但是,是的,当它在 Meteor 中得到原生支持时会很好。
    • 对于那些想要在 Blaze (>0.8.0) 中生成客户端电子邮件模板的人,请参阅github.com/meteor/meteor/issues/2007
    • 我更新了答案以反映 Blaze API 中的这些变化,谢谢。
    【解决方案2】:

    流星 1.0。如果您想从您的服务器发送模板电子邮件:

    1.安装流星包邮箱:

    meteor add email

    meteor add blaze

    2.在sendgrid 创建一个电子邮件帐户,或者从您的电子邮件提供商处获取 smtp 参数。我没有用gmail测试。但是使用 sendmail,它是直截了当的!

    3.在/server/smtp.js中配置smtp设置:

    Meteor.startup(
    function (){
        process.env.MAIL_URL = 'smtp://<username>:<password>@smtp.sendgrid.net:587';
    }
    

    );

    4.您可以在 server.js 上使用以下内容:

    myfunction(){
       var html = Blaze.toHTML(Blaze.With(data, function() { return Template.my_template; }));
       Email.send({
                from: "My company name <noreply@mycompany.com>",
                to: "john.doe@gmail.com",
                subject: "Any subject...",
                html: html
            });
       }
    

    5.在/client/template/my_template.html中创建你的模板:

    <template name="my_template">
        Hello <b>{{name}}</b>
    </template>
    

    注意这里的 {{name}} 指的是 data 中定义的属性,定义为 data = {name: "John"}。下面的模板会输出为:“Hello John”,所有的html标签都会保存到变量html中。

    6.在服务器代码中的任何位置调用 myfunction()。瞧!电子邮件将被发送。如果您没有收到这封电子邮件,请确保它没有进入您的垃圾邮件。

    此方法仍然需要模板在客户端。

    【讨论】:

    • Template 没有在服务器上定义?
    • 我们也在服务器上收到Template is not definederror。
    • 你们试过安装SSR包了吗? github.com/meteorhacks/meteor-ssr
    • 使用 Meteor 1.3,它无需安装 SSR 包即可工作。我正在使用 Blaze Components,但我认为它不相关。无论如何,请记住电子邮件模板必须位于服务器可访问的文件夹中,显然。
    • 我在 Meteor 1.3 上尝试过这个,但我也收到一条错误消息。找不到 Template.xxx -> 属性 xxx。如果我尝试包含 html 模板,则会收到无法找到模块 xxx.html 的错误消息。我尝试了不同的位置,但似乎没有任何效果。有什么想法吗?
    【解决方案3】:

    接受的答案使用客户端代码。如果您正在寻找构建电子邮件模板,客户端代码可能不安全。 有一个用于服务器端渲染模板的包(meteor-ssr),您可以使用它。

    【讨论】:

      【解决方案4】:

      正如@pahan 提到的,服务器端渲染包可能是您最好的选择。这是我使用的一个很好的教程:https://themeteorchef.com/tutorials/using-the-email-package

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-26
        • 1970-01-01
        • 2010-12-16
        • 2016-08-03
        • 2015-06-10
        • 2022-01-20
        • 1970-01-01
        • 2017-09-22
        相关资源
        最近更新 更多