如何在 Mailjet v3 PHP 包装器中获取联系人 ID?
How to get Contact ID in Mailjet v3 PHP wrapper?
我使用 Mailjet api 将提交的电子邮件存储在 Mailjet 列表中。当有 Mailjet 0.1 版本 API(当时没有任何 PHP 包装器但很容易与他们的示例一起使用)时,这工作正常,但是当他们将 API 更改为版本时3 在将新联系人添加到联系人列表时,他们的 PHP 包装器不会 return 任何联系人 ID。我之前提出了一个类似的问题如何让 Mailjet 工作,但现在这个问题出现在新版本 3 中。
这里又是更正后的代码,
*Assume that the shown email is a new contact that's not already created in Mailjet.
$mj = new Mailjet();
$contact_params = array("method" => "POST", "Email" => "abc@gmail.com");
$contact = $mj->contact($contact_params);
$add_params = array(
"method" => "POST",
"ContactID" => $contact,
"ListID" => _MAILJET_LIST,
"IsActive" => "True"
);
$mj->listrecipient($add_params);
开发者@Gormador 说使用 $contact->Data[0]->ID
作为联系人 ID 但它仍然 return 为 NULL。
尝试将已创建的联系人添加到列表(调试模式设置为 2)时出现此错误。
array(3) { ["ContactID"]=> NULL ["ListID"]=> string(1) "2"
["IsActive"]=> string(4) "True" } string(105) "{ "ErrorInfo" : "",
"ErrorMessage" : "Invalid data: \"null\" is an invalid integer",
"StatusCode" : 400 }"
上一题:Mailjet: Adding email to list does not work
已更新:包含更正的完整代码,
$mj = new Mailjet();
$add_email = "testing" . rand(0, 1000) . "@gmail.com";
$contact_params = array("method" => "POST", "Email" => $add_email);
$mj->contact($contact_params);
$viewContact = array("method" => "VIEW","unique" => $add_email);
$contact = $mj->contact($viewContact);
$add_params = array( "method" => "POST", "ContactID" => $contact->Data[0]->ID, "ListID" => 1, "IsActive" => "True" );
$mj->listrecipient($add_params);
编辑:
此问题不一定特定于您尝试实现的目标。
虽然,我们的 1.0.6 包装器中肯定存在错误。
在包装器代码中,我们使用 json_decode()
函数的第 4 个参数,它仅在 PHP 5.4 中引入(参见“Changelog”部分 here)。
解决此问题的两种方法:
- 要么将系统的 PHP 版本更新到 >= 5.4
- 或者(在我们引入修复之前),在本地修改包装器以不使用该选项(参见 here),这很可能带来新问题,不是推荐的修复方法.
希望这对您有所帮助。我们当然很感激这引起了我们的注意:)
编辑2:
为了澄清,这里是第二种方法在代码方面的含义:
$this->_response = json_decode($buffer, false, 512, JSON_BIGINT_AS_STRING);
//Becomes
$this->_response = json_decode($buffer, false, 512);
应该消除警告和解决问题。这不是很好吗? ;-)
因为我真的无法在我这边重现你的问题,这里有一个问题:
当您发出以下代码时,您尝试创建的联系人是否列在响应中?
或者,转到 here 获取您帐户的联系人列表。
$mj = new Mailjet($apiKey, $secretKey);
$contact = $mj->contact();
var_dump($contact);
如果是,这就是我在 response on your other question 中写的内容不起作用的原因。
但是为什么呢?
嗯,您正在尝试创建一个已在您的帐户中列出的联系人。创建联系人的过程并不一定意味着必须将其分配给联系人列表。
修复
获取现有联系人的 ID 而不是在将其添加到列表之前创建它:
$mj = new Mailjet($apiKey, $secretKey);
$viewContact = [
"method" => "VIEW",
"unique" => "gaetan.philippot@gmail.com"
];
$contact = $mj->contact($viewContact);
echo "Contact ID: ".$contact->Data[0]->ID."\n";
// Then proceed as described in my original answer.
或者通过web interface删除它,然后再按照我的回答尝试。
(点击联系人的邮箱,然后点击头像旁边的黄色菜单,再点击删除。)
那个能解决您的问题吗? :-)
$email = 'youname@yourcompany.com'
$mj = new \Mailjet\Client(MAIL_LOGIN, API_KEY);
$response = $mj->get(\Mailjet\Resources::$Contact, ['id' => $email]);
$contactID = $response->success() ? $response->getData()[0]['ID'] : null;
我使用 Mailjet api 将提交的电子邮件存储在 Mailjet 列表中。当有 Mailjet 0.1 版本 API(当时没有任何 PHP 包装器但很容易与他们的示例一起使用)时,这工作正常,但是当他们将 API 更改为版本时3 在将新联系人添加到联系人列表时,他们的 PHP 包装器不会 return 任何联系人 ID。我之前提出了一个类似的问题如何让 Mailjet 工作,但现在这个问题出现在新版本 3 中。
这里又是更正后的代码,
*Assume that the shown email is a new contact that's not already created in Mailjet.
$mj = new Mailjet();
$contact_params = array("method" => "POST", "Email" => "abc@gmail.com");
$contact = $mj->contact($contact_params);
$add_params = array(
"method" => "POST",
"ContactID" => $contact,
"ListID" => _MAILJET_LIST,
"IsActive" => "True"
);
$mj->listrecipient($add_params);
开发者@Gormador 说使用 $contact->Data[0]->ID
作为联系人 ID 但它仍然 return 为 NULL。
尝试将已创建的联系人添加到列表(调试模式设置为 2)时出现此错误。
array(3) { ["ContactID"]=> NULL ["ListID"]=> string(1) "2"
["IsActive"]=> string(4) "True" } string(105) "{ "ErrorInfo" : "",
"ErrorMessage" : "Invalid data: \"null\" is an invalid integer",
"StatusCode" : 400 }"
上一题:Mailjet: Adding email to list does not work
已更新:包含更正的完整代码,
$mj = new Mailjet();
$add_email = "testing" . rand(0, 1000) . "@gmail.com";
$contact_params = array("method" => "POST", "Email" => $add_email);
$mj->contact($contact_params);
$viewContact = array("method" => "VIEW","unique" => $add_email);
$contact = $mj->contact($viewContact);
$add_params = array( "method" => "POST", "ContactID" => $contact->Data[0]->ID, "ListID" => 1, "IsActive" => "True" );
$mj->listrecipient($add_params);
编辑:
此问题不一定特定于您尝试实现的目标。
虽然,我们的 1.0.6 包装器中肯定存在错误。
在包装器代码中,我们使用 json_decode()
函数的第 4 个参数,它仅在 PHP 5.4 中引入(参见“Changelog”部分 here)。
解决此问题的两种方法:
- 要么将系统的 PHP 版本更新到 >= 5.4
- 或者(在我们引入修复之前),在本地修改包装器以不使用该选项(参见 here),这很可能带来新问题,不是推荐的修复方法.
希望这对您有所帮助。我们当然很感激这引起了我们的注意:)
编辑2:
为了澄清,这里是第二种方法在代码方面的含义:
$this->_response = json_decode($buffer, false, 512, JSON_BIGINT_AS_STRING);
//Becomes
$this->_response = json_decode($buffer, false, 512);
应该消除警告和解决问题。这不是很好吗? ;-)
因为我真的无法在我这边重现你的问题,这里有一个问题:
当您发出以下代码时,您尝试创建的联系人是否列在响应中?
或者,转到 here 获取您帐户的联系人列表。
$mj = new Mailjet($apiKey, $secretKey);
$contact = $mj->contact();
var_dump($contact);
如果是,这就是我在 response on your other question 中写的内容不起作用的原因。
但是为什么呢?
嗯,您正在尝试创建一个已在您的帐户中列出的联系人。创建联系人的过程并不一定意味着必须将其分配给联系人列表。
修复
获取现有联系人的 ID 而不是在将其添加到列表之前创建它:
$mj = new Mailjet($apiKey, $secretKey);
$viewContact = [
"method" => "VIEW",
"unique" => "gaetan.philippot@gmail.com"
];
$contact = $mj->contact($viewContact);
echo "Contact ID: ".$contact->Data[0]->ID."\n";
// Then proceed as described in my original answer.
或者通过web interface删除它,然后再按照我的回答尝试。
(点击联系人的邮箱,然后点击头像旁边的黄色菜单,再点击删除。)
那个能解决您的问题吗? :-)
$email = 'youname@yourcompany.com'
$mj = new \Mailjet\Client(MAIL_LOGIN, API_KEY);
$response = $mj->get(\Mailjet\Resources::$Contact, ['id' => $email]);
$contactID = $response->success() ? $response->getData()[0]['ID'] : null;