Sendgrid Web API v3每个收件人

时间:2016-11-02 14:50:09

标签: php email sendgrid

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

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

环境是CodeIgniter-Installation,使用作曲家安装的provided PHP-Class

有问题的函数调用是addSubstitution($key, $value),这会导致错误400(错误请求)。在没有此调用的情况下提交请求时,一切都按预期工作(包括我的占位符当然不能替换)。我得到一个干净的202,电子邮件到了。 <_1}}由SendMail提供的错误文本无效。

我想过为替换键添加一个值数组。这是从thisthis代码中复制的(在第一个示例中使用SMTP API,不清楚第二个中的内容),但似乎是{"errors":[{"message":"Bad Request","field":null,"help":null}]} value只能处理字符串。

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

我的PHP脚本(简易版):

addSubstitution

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

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

更新:随着我越来越深入,我的解决方案应该完美无缺。 This SO answer具有完全相同的方法。但为什么我仍然得到400错误?其余的代码可以工作,只需要一个没有替换部分的简单尝试。

编辑: PHP脚本生成的JSON

// 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);

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

{
  "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"
    }
  ]
}

1 个答案:

答案 0 :(得分:5)

在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"
    }
  ]
}

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