Mailjet:通过 vars 提供的数组值使电子邮件在发送时被阻止

Mailjet: Array value provided through vars makes email being blocked on sending

我正在为 Mailjet 编写一个用 MJML 编写的电子邮件模板,该模板使用通过 Vars 提供的数组值来生成发件人希望从邮件收件人那里收到的项目列表。数组中的所有值都是纯文本值。

传递给 API 请求的数据如下所示:

{
    "FromEmail":"sender@email.com",
    "FromName":"Chris Crumble",
    "Subject":"Data Request",
    "MJ-TemplateID":"200000",
    "MJ-TemplateLanguage":true,
    "Recipients":[
        {
            "Email":"recipient@email.com",
            "Name":"Hans Henson"
        }
    ],
    "Vars":{
        "mailTitle":"Data Request",
        "userName":"Chris Crumble",
        "imageUrl":"http://my.host.com/image.jpg",
        "userBirthDate":"1.3.1982",
        "recipientName":"Hans Henson",
        "uploadUrl":"https://my.upload.com/",
        "authVideoUrl":"https://my.authvideo.com",
        "records":["Document A","Document B"],
        "authPhone":"113777840097"
    }
}

模板使用 var:records 是这样的:

        ...
        </mj-text>
        <mj-raw> {% if var:records:false %} </mj-raw>
        <mj-text>
          <p>
            I, <strong>{{var:userName}}, born on {{var:userBirthDate}}</strong> am asking you to provide the following documents:
          </p>
        </mj-text>
        <mj-raw> {% for item in var:records %} </mj-raw>
        <mj-text>
          {{item}}
        </mj-text>
        <mj-raw> {% endfor %} </mj-raw>
        <mj-raw> {% else %} </mj-raw>
        <mj-text>
          <p>
            I, <strong>{{var:userName}}, born on {{var:userBirthDate}}</strong>, am asking you to provide all my existing documents.
          </p>
        </mj-text>
        <mj-raw> {% endif %} </mj-raw>
        <mj-text>
          ...

只要随请求发送的数据中未设置 var:records,邮件就会按预期发送。一旦请求提供了一个(非空)数组值,邮件就会在发送时被 Mailjet 阻止,而不会提供任何进一步的原因信息。

不知道如何让它工作。

更新:

感谢 Zhivko 对 Mailjet 提供的错误报告机制的提示,我能够更深入地了解问题。

模板产生以下错误:

expression parsing error ## Unknown identifier: var:records:false ## near ## var:records:false ##

这对我来说仍然没有任何意义,因为提到的行是一个 if 条件,默认值 false 是为 var:records 没有值的情况定义的由 api 请求提供。 此外,只有在 Vars 中明确设置值并且 不是 为空时,模板才会产生此错误。 到目前为止,我的测试让我猜测它可能与提供的值是一个 array 值有关,因为如果该值是普通的 ,该行不会引起任何问题字符串.

消息可能由于模板语言错误而被阻止。要接收有关错误的详细信息,请使用 Mailjet 启用 error reporting mechanism. If you have troubles debugging the error message, open a support ticket 以深入调查特定模板。

据我所知,Mailjet 不允许将数组作为个性化变量。

DataType: the type of data that is being stored (this can be either a str, int, float or bool)

https://dev.mailjet.com/guides/#manage-contacts

我遇到了同样的问题,在他们的 Slack 上询问了 MJML 团队后,我添加了一个答案。只需使用 defined() 方法:

示例:

{% if defined(var:employees) %}
  My employees :
  <ul>
    {% for employee in var:employees %}
      <li>{{employee.firstname}} {{employee.lastname}}</li>
    {% endfor %}
  </ul>
{% endif %}

这个方法是正确的,MJML 的核心维护者只是说:

It's not publicly documented yet

PS :他们的 Slack 是问这类问题的好地方,我在几分钟内得到了回复。 (mjml.slack.com)

解决方案:

<% if(typeof bar !== 'undefined') { %>
    variable 'bar' is defined in payload:
    <b><%= bar %></b>
<% } else {%>
    variable 'bar' is not defined in payload
<% }%>