Sendgrid Web API v3为每个收件人提供不同的替换值

Col*_*Muc 4 php email sendgrid

我想用SendGrid发送个性化的电子邮件.整个身体是相似的,每封邮件只有3-4个单词替换,所以我想到使用SendGrid替换

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

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

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

我想到为替换键添加一个值数组.这是从复制这个这个代码(使用SMTP API中的第一个例子,目前还不清楚在第二),但似乎,那valueaddSubstitution只能处理字符串.

要明确:我需要这个功能的通用方法.我的问题不仅涉及问候语中的收件人姓名,还有个性化的取消订阅链接等.我正在添加此提示,因为"使用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);
Run Code Online (Sandbox Code Playgroud)

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

调用似乎具有所需功能的SMTP-API是无可替代的,因为我不希望在快速和长循环中调用php mail().

更新:随着我越来越深入,我的解决方案应该完美无缺.这个答案的答案完全相同.但为什么我仍然得到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"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

更新:以下bwests回答这是我的问题(测试)的解决方案:

[...]

$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);
Run Code Online (Sandbox Code Playgroud)

bwe*_*est 5

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

根据此示例, 您的有效负载应如下所示:

{
  "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"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

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

  • 是的,我同意这些文档对常见用例不利.我让文档团队知道了,他们会去看一看. (2认同)