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