Я хочу отправить персонализированные письма с помощью SendGrid. Все тело похоже, это всего 3-4 однословные-substitions в каждой почте, так что я думал использовать SendGrid заменSendgrid Web API v3 различное значение замены для каждого получателя
- Боб ([email protected]) должны получить сообщение о том, «Привет Боб, Lorem Ipsum»
- Алиса ([email protected]) должны получить сообщение о том,„Привет Алиса, Lorem Ipsum“
среда является CodeIgniter-установка с помощью provided PHP-Class устанавливается композитором.
Вызов проблемной функции: addSubstitution($key, $value), что приводит к ошибке 400 (неверный запрос). При отправке запросов без этого звонка все работает так, как ожидалось (включая мои заполнители, которые, естественно, не были заменены). Я получаю чистый 202
, письма поступают. Текст ошибки, предоставленный SendMail, - {"errors":[{"message":"Bad Request","field":null,"help":null}]}
, что не очень помогает.
Я думал о добавлении массива значений в ключ замены. Это скопировано из this и this (с использованием SMTP API в первом примере, непонятно, что во втором), но кажется, что value
addSubstitution
может обрабатывать строки только.
Чтобы быть ясным: мне нужна эта функциональность в ее общем подходе. Моя проблема связана не только с именами получателей в приветствии, а также с персонализированной ссылкой на отмену подписки и т. Д. Я добавляю этот намек, потому что ответ вроде «использовать API-интерфейс Sendgrid-Marketing и загружать получателей раньше» не отвечает моим потребностям ,
Мой 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() в быстрых и длинных циклах.
Обновление: Поскольку я копаю все глубже и глубже, мое решение должно работать отлично. This SO answer имеет точно такой же подход. Но почему я все еще получаю ошибку 400? Остальная часть кода работает, как простая попытка без показа замещения.
Edit: В результате 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"
}
]
}
Обновление: После bwests answer этого решения для моей проблемы (проверено):
[...]
$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);
Вы используете v3 или SMTP? Вы ссылаетесь на ссылки SMTP API, но v3 обрабатывает вещи по-разному. Попробуйте это: https://sendgrid.com/docs/Classroom/Send/v3_Mail_Send/personalizations.html – bwest
Можете ли вы разместить полезную нагрузку JSON, которую генерирует код? – bwest
@bwest Я использую Web Api v3, но документация по этой теме (разные значения подстановки для каждого получателя) содержится только в документах SMTP-API, поэтому мои ссылки. Кстати. Это также относится к вашей ссылке. Я приложил полученный JSON к моему вопросу, любую идею ?. –