2016-11-02 30 views
4

我想用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}]},這沒有多大幫助。

我想爲替代鍵添加一個值的數組。這是從thisthis代碼複製的(使用第一個示例中的SMTP API,不清楚第二個代碼中的內容),但似乎valueaddSubstitution只能處理字符串。

要清楚:我需要這個功能的通用方法。我的問題不僅僅涉及問候語中的收件人姓名,還包括個性化的取消訂閱鏈接等。我添加了這個提示,因爲「使用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); 
+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

在v3中, substitution值不能是數組。雖然概念相同,但個性化設置與傳統的SMTP API不同。

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

完全錯誤地理解了該文檔部分的標題,因爲我的理解是我們正在討論具有不同替換的同一封電子郵件,而不是兩封電子郵件(我知道它們在技術上導致了這種情況)。無論如何,這是一個文件的事情。您的解決方案有效,謝謝!我將用未來谷歌搜索者的最終解決方案更新我的問題。 –

+1

是的,我同意這些文檔對於常見用例不是很好。我已經讓文檔團隊知道了,他們會去看看。 – bwest

相關問題