【发布时间】:2016-11-02 14:50:08
【问题描述】:
我想用 SendGrid 发送个性化的电子邮件。整个正文都差不多,每封邮件只有3-4个单词替换,所以我想到了使用SendGrid替换
- Bob (bob@example.com) 应该收到一封电子邮件,上面写着“Hi Bob,lorem ipsum”
- Alice (alice@example.com) 应该收到一封电子邮件,上面写着“嗨 Alice,lorem ipsum”
环境是 CodeIgniter-Installation,使用由 composer 安装的provided PHP-Class。
有问题的函数调用是addSubstitution($key, $value),导致错误400(错误请求)。在没有此调用的情况下提交请求时,一切都按预期工作(当然包括我的占位符未替换)。我得到了一个干净的202,电子邮件正在到达。
SendMail 提供的错误文本是{"errors":[{"message":"Bad Request","field":null,"help":null}]},这并没有多大帮助。
我想为替换键添加一个值数组。这是从this 和this 代码复制而来的(在第一个示例中使用了SMTP API,在第二个示例中不清楚),但似乎addSubstitution 的value 只能处理字符串。
明确一点:我需要此功能的通用方法。我的问题不仅涉及问候语中的收件人姓名,还涉及个性化的退订链接等。我添加此提示是因为“使用 Sendgrid-Marketing-API 并在之前上传您的收件人”之类的答案不能满足我的需求.
我的 PHP 脚本(精简版):
// General
$sg = new \SendGrid('api_key');
$recipients = array(
array(
'email' => 'bob@example.com',
'name' => 'Bob'
),
array(
'email' => 'alice@example.com',
'name' => 'Alice'
)
);
$mail = new \SendGrid\Mail();
$from = new \SendGrid\Email('myname', 'myname@mycompany.com');
$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 错误?其余代码可以正常工作,就像没有替换部分的简单尝试一样。
编辑: PHP 脚本的结果 JSON
{
"from": {
"name": "myname",
"email": "myname@mycompany.com"
},
"personalizations": [
{
"to": [
{
"email": "bob@example.com"
},
{
"email": "alice@example.com"
}
],
"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 处理方式不同。试试这个:sendgrid.com/docs/Classroom/Send/v3_Mail_Send/…
-
您能发布代码生成的 JSON 有效负载吗?
-
@bwest 我正在使用 Web Api v3,但有关此主题的文档(每个收件人的不同替换值)仅在 SMTP-API 文档中找到,因此我的链接。顺便说一句:您的链接也是如此。我将生成的 JSON 附加到我的问题中,有什么想法吗?。