【问题标题】:Sendgrid Web API v3 different substitution value for each recipientSendgrid Web API v3 为每个收件人提供不同的替换值
【发布时间】:2016-11-02 14:50:08
【问题描述】:

我想用 SendGrid 发送个性化的电子邮件。整个正文都差不多,每封邮件只有3-4个单词替换,所以我想到了使用SendGrid替换

  • Bob (bob@example.com) 应该收到一封电子邮件,上面写着“Hi Bob,lorem ipsum”
  • Alice (alice@example.com) 应该收到一封电子邮件,上面写着“嗨 Alice,lorem ipsum”

环境是 CodeIgniter-Installation,使用由 composer 安装的provided PHP-Class

有问题的函数调用是addSubstitution($key, $value),导致错误400(错误请求)。在没有此调用的情况下提交请求时,一切都按预期工作(当然包括我的占位符未替换)。我得到了一个干净的202,电子邮件正在到达。 SendMail 提供的错误文本是{"errors":[{"message":"Bad Request","field":null,"help":null}]},这并没有多大帮助。

我想为替换键添加一个值数组。这是从thisthis 代码复制而来的(在第一个示例中使用了SMTP API,在第二个示例中不清楚),但似乎addSubstitutionvalue 只能处理字符串。

明确一点:我需要此功能的通用方法。我的问题不仅涉及问候语中的收件人姓名,还涉及个性化的退订链接等。我添加此提示是因为“使用 Sendgrid-Marketing-API 并在之前上传您的收件人”之类的答案不能满足我的需求.

我的 PHP 脚本(精简版):

// General

$sg = new \SendGrid('api_key');

$recipients = array(
    array(
        'email' => 'bob@example.com',
        'name' => 'Bob'
    ),
    array(
        'email' => 'alice@example.com',
        'name' => 'Alice'
    )
);

$mail = new \SendGrid\Mail();

$from = new \SendGrid\Email('myname', 'myname@mycompany.com');
$mail->setFrom($from);

$mail->setSubject('New mail');

$content = new \SendGrid\Content('text/plain', 'Hi -name-, lorem ipsum');
$mail->addContent($content);

// Personalizations
$personalization = new \SendGrid\Personalization();

$substitutions_name = array();

foreach ($recipients as $recipient) {
    $email = new \SendGrid\Email(null, $recipient['email']);
    $personalization->addTo($email);
    array_push($substitutions_name, $recipient['name']);
}

$personalization->addSubstitution('-name-', $substitutions_name);

$mail->addPersonalization($personalization);

$response = $sg->client->mail()->send()->post($mail);

我的方法通常是错误的吗? SendGrid 中是否还有其他类似的功能可以满足我的需求?

调用似乎具有所需功能的 SMTP-API 是别无选择的,因为我不想在快速和长时间的循环中调用 php mail()。

更新:随着我越来越深入地挖掘,我的解决方案应该可以完美运行。 This SO answer 具有完全相同的方法。但是为什么我仍然收到 400 错误?其余代码可以正常工作,就像没有替换部分的简单尝试一样。

编辑: PHP 脚本的结果 JSON

{
  "from": {
    "name": "myname",
    "email": "myname@mycompany.com"
  },
  "personalizations": [
    {
      "to": [
        {
          "email": "bob@example.com"
        },
        {
          "email": "alice@example.com"
        }
      ],
      "substitutions": {
        "-name-": [
          "Bob",
          "Alice"
        ]
      }
    }
  ],
  "subject": "New mail",
  "content": [
    {
      "type": "text/plain",
      "value": "Hi -name-, lorem ipsum"
    }
  ]
}

更新:关注bwests answer,这是我的问题的解决方案(已测试):

[...]

$content = new \SendGrid\Content('text/plain', 'Hi -name-, lorem ipsum');
$mail->addContent($content);

foreach ($recipients as $recipient) {
    $personalization = new \SendGrid\Personalization();
    $email = new \SendGrid\Email(null, $recipient['email']);
    $personalization->addTo($email);
    $personalization->addSubstitution('-name-', $recipient['name']);
    $mail->addPersonalization($personalization);
}

$response = $sg->client->mail()->send()->post($mail);

【问题讨论】:

  • 您使用的是 v3 还是 SMTP?您正在引用 SMTP API 链接,但 v3 处理方式不同。试试这个:sendgrid.com/docs/Classroom/Send/v3_Mail_Send/…
  • 您能发布代码生成的 JSON 有效负载吗?
  • @bwest 我正在使用 Web Api v3,但有关此主题的文档(每个收件人的不同替换值)仅在 SMTP-API 文档中找到,因此我的链接。顺便说一句:您的链接也是如此。我将生成的 JSON 附加到我的问题中,有什么想法吗?。

标签: php email sendgrid


【解决方案1】:

在 v3 中,substitution 值不能是数组。个性化设置与旧版 SMTP API 不同,但概念相同。

根据this example 您的有效负载应如下所示:

{
  "from": {
    "name": "myname",
    "email": "myname@mycompany.com"
  },
  "personalizations": [
    {
      "to": [
        {
          "email": "alice@example.com"
        }
      ],
      "substitutions": {
        "-name-": "Alice"
      }
    },
    {
      "to": [
        {
          "email": "bob@example.com"
        }
      ],
      "substitutions": {
        "-name-": "Bob"
      }
    }    
  ],
  "subject": "New mail",
  "content": [
    {
      "type": "text/plain",
      "value": "Hi -name-, lorem ipsum"
    }
  ]
}

进行此更改是为了更轻松地查看单个个性化对象并查看该特定电子邮件的所有元数据,并减少由于尝试跨数组维护一致索引而不是使用结构化数据而导致的常见错误.

【讨论】:

  • 完全误解了该文档部分的标题,因为我的理解是我们正在谈论具有不同替换的同一电子邮件,而不是两封电子邮件(我知道它们在技术上会导致这种情况)。无论如何,这是一个文档的事情。您的解决方案有效,谢谢!我将为未来的谷歌搜索者提供最终解决方案来更新我的问题。
  • 是的,我同意这些文档不适用于常见用例。我已经让文档团队知道了,他们会看看的。
猜你喜欢
  • 2018-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-08
  • 2017-12-09
  • 2020-04-15
相关资源
最近更新 更多