我想用SendGrid發送個性化的電子郵件。整個身體是相似的,它只是一個3-4個字,substitions在每封郵件,所以我想用SendGrid換人Sendgrid Web API v3每個收件人的不同替代值
- 鮑勃([email protected])應該得到一個電子郵件,說「嗨鮑勃, Lorem存有」
- 愛麗絲([email protected])應該得到一個電子郵件,說‘你好,愛麗絲,Lorem存有’
環境是使用由作曲家安裝provided PHP-Class一個笨的安裝。
有問題的函數調用是addSubstitution($key, $value),這導致錯誤400(錯誤請求)。在沒有這個調用的情況下提交請求時,一切都按預期工作(包括我的佔位符未被替換)。我得到一個乾淨的202
,電子郵件到達。 SendMail提供的錯誤文本是{"errors":[{"message":"Bad Request","field":null,"help":null}]}
,這沒有多大幫助。
我想爲替代鍵添加一個值的數組。這是從this和this代碼複製的(使用第一個示例中的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郵件()。
更新:隨着我越來越深入,我的解決方案應該完美運作。 This SO answer具有完全相同的方法。但爲什麼我仍然得到400錯誤?代碼的其餘部分工作,作爲一個簡單的嘗試沒有替代部分顯示。
編輯:所導致的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"
}
]
}
更新的JSON:以下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到我的問題,任何想法? –