2016-11-02 4 views
4

Я хочу отправить персонализированные письма с помощью 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 в первом примере, непонятно, что во втором), но кажется, что valueaddSubstitution может обрабатывать строки только.

Чтобы быть ясным: мне нужна эта функциональность в ее общем подходе. Моя проблема связана не только с именами получателей в приветствии, а также с персонализированной ссылкой на отмену подписки и т. Д. Я добавляю этот намек, потому что ответ вроде «использовать 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); 
+0

Вы используете v3 или SMTP? Вы ссылаетесь на ссылки SMTP API, но v3 обрабатывает вещи по-разному. Попробуйте это: https://sendgrid.com/docs/Classroom/Send/v3_Mail_Send/personalizations.html – bwest

+0

Можете ли вы разместить полезную нагрузку JSON, которую генерирует код? – bwest

+0

@bwest Я использую Web Api v3, но документация по этой теме (разные значения подстановки для каждого получателя) содержится только в документах SMTP-API, поэтому мои ссылки. Кстати. Это также относится к вашей ссылке. Я приложил полученный JSON к моему вопросу, любую идею ?. –

ответ

4

В версии 3, substitution значения не могут быть массивами. Персонализация отличается от устаревшего API SMTP, хотя концепции одинаковы.

Per this example ваша полезная нагрузка должна выглядеть следующим образом:

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

Это изменение было сделано, чтобы сделать его легче смотреть на одном объекте персонализации и увидеть все метаданные для этой конкретной электронной почты, а также уменьшить количество ошибок которые были распространены из-за попытки поддерживать согласованные индексы в массивах, а не использовать структурированные данные.

+0

Полностью пропущен заголовок раздела doc, поскольку я понимаю, что мы говорим об одном и том же электронном письме с разными заменами, а не о двух электронных письмах (я знаю, что они технически приводят к такому). Во всяком случае, это вещь документа. Ваше решение работает, спасибо! Я обновлю свой вопрос с окончательным решением для будущих поисковиков Google. –

+1

Да, я согласен с тем, что документы не подходят для обычных случаев использования. Я позволил команде docs знать, и они собираются взглянуть. – bwest

Смежные вопросы