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