Valor de substituição diferente da API da Web Sendgrid v3 para cada destinatário

Quero enviar e-mails personalizados com o SendGrid. Todo o corpo é semelhante, são apenas 3-4 subestações de uma palavra em cada email, então pensei em usar as substituições do SendGrid

Bob ([email protected]) deve receber um e-mail dizendo "Olá, Bob, lorem ipsum"Alice ([email protected]) deve receber um e-mail dizendo "Olá Alice, lorem ipsum"

O ambiente é uma instalação do CodeIgniter usando ofornecido PHP-Class instalado pelo compositor.

A chamada de função problemática éaddSubstitution (chave $, valor $), o que leva a um erro 400 (solicitação incorreta). Ao enviar as solicitações sem essa ligação, tudo funciona como esperado (incluindo meus espaços reservados não substituídos, é claro). Estou ficando limpo202, os e-mails estão chegando. O texto do erro fornecido pelo SendMail é{"errors":[{"message":"Bad Request","field":null,"help":null}]} o que não ajuda muito.

Pensei em adicionar uma matriz de valores à chave de substituição. Isso é copiado deesta eesta código (usando a API SMTP no primeiro exemplo, não está claro o que no segundo), mas parece que ovalue doaddSubstitution só pode lidar com seqüências de caracteres.

Para ser claro: eu preciso dessa funcionalidade em sua abordagem genérica. Meu problema não se refere apenas aos nomes dos destinatários na saudação, também a um link de cancelamento personalizado, etc. Estou adicionando esta dica porque uma resposta como "use a Sendgrid-Marketing-API e carregue seus destinatários antes" não atende minhas necessidades .

Meu script PHP (versão light):

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

Minha abordagem geralmente está errada? Existe outra funcionalidade semelhante no SendGrid que atenda às minhas necessidades?

Chamar a API SMTP, que parece ter a funcionalidade necessária, não é alternativa, pois não quero chamar php mail () em loops rápidos e longos.

Atualizar: À medida que vou cavando cada vez mais fundo, minha solução deve funcionar perfeitamente.Esta resposta SO tem exatamente a mesma abordagem. Mas por que ainda estou recebendo o erro 400? O restante do código funciona, como uma tentativa simples, sem a parte de substituição mostrada.

Editar: O JSON resultante do PHP-Script

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

Atualizar: Segueresposta de bwests esta é a solução para o meu problema (testado):

[...]

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

questionAnswers(1)

yourAnswerToTheQuestion