Sendgrid Web API v3 разные значения подстановки для каждого получателя

Я хочу отправлять персонализированные электронные письма с SendGrid. Все тело похоже, это просто 3-4 подстановки из одного слова в каждом письме, поэтому я подумал об использовании подстановок SendGrid

Боб ([email protected]) должен получить электронное письмо со словами «Привет, Боб, Лорем Ипсум»Алиса ([email protected]) должна получить электронное письмо со словами «Привет, Алиса, lorem ipsum»

Среда представляет собой CodeIgniter-Installation с использованиемпредоставил PHP-класс установлен композитором.

Проблемный вызов функцииaddSubstitution ($ key, $ value), что приводит к ошибке 400 (Bad Request). При отправке запросов без этого вызова все работает, как ожидалось (включая мои заполнители, конечно, не замененные). Я получаю чистую202, письма приходят. Текст ошибки, предоставленный SendMail:{"errors":[{"message":"Bad Request","field":null,"help":null}]} что не очень помогает.

Я думал о добавлении массива значений к ключу подстановки. Это скопировано сэтот а такжеэтот код (используя SMTP API в первом примере, непонятно, что во втором), но кажется, чтоvalue изaddSubstitution может обрабатывать только строки.

Чтобы было ясно: мне нужен этот функционал в его универсальном подходе. Моя проблема связана не только с именами получателей в приветствии, а также с персонализированной ссылкой для отмены подписки и т. Д. Я добавляю эту подсказку, потому что ответ типа «используй Sendgrid-Marketing-API и загружай своих получателей раньше» не отвечает моим потребностям ,

Мой PHP-скрипт (облегченная версия):

// General

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

$recipients = array(
    array(
        'email' => '[email protected]',
        'name' => 'Bob'
    ),
    array(
        'email' => '[email protected]',
        'name' => 'Alice'
    )
);

$mail = new \SendGrid\Mail();

$from = new \SendGrid\Email('myname', '[email protected]');
$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 () в быстрых и длинных циклах.

Обновить: Поскольку я копаю глубже и глубже, мое решение должно работать идеально.Это так ответ имеет точно такой же подход. Но почему я все еще получаю 400-ошибку? Остальная часть кода работает, как показывает простая попытка без подстановочной части.

Редактировать: Результирующий JSON PHP-скрипта

{
  "from": {
    "name": "myname",
    "email": "[email protected]"
  },
  "personalizations": [
    {
      "to": [
        {
          "email": "[email protected]"
        },
        {
          "email": "[email protected]"
        }
      ],
      "substitutions": {
        "-name-": [
          "Bob",
          "Alice"
        ]
      }
    }
  ],
  "subject": "New mail",
  "content": [
    {
      "type": "text/plain",
      "value": "Hi -name-, lorem ipsum"
    }
  ]
}

Обновить: Следующийлучший ответ это решение моей проблемы (проверено):

[...]

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

Ответы на вопрос(1)

Ваш ответ на вопрос