Отправка SendGrid нескольким получателям с использованием api v3 и библиотеки PHP в функции Wordpress - PullRequest
0 голосов
/ 21 ноября 2018

Я использую SendGrid v3 api с библиотекой php, чтобы попытаться отправить нескольким получателям как часть функции WordPress.Я могу успешно отправлять электронные письма, используя образец кода SendGrid и жесткое кодирование нескольких получателей.Тем не менее, когда я запрашиваю базу данных, чтобы попытаться создать список адресов электронной почты: он всегда завершается с ошибкой 400.Вот код SendGrid, с которым я работаю.Он отлично работает с живыми данными и жестко закодирован.Тем не менее, я не могу правильно построить массив $ tos из моего запроса к базе данных.Я прочитал документацию и все учебники, которые я могу найти.Я также связывался с поддержкой Sendgrid.

$email = new \SendGrid\Mail\Mail(); 
$email->setFrom("test@example.com", "Example User");
$tos = [ 
    "test+test1@example.com" => "Example User1",
    "test+test2@example.com" => "Example User2",
    "test+test3@example.com" => "Example User3"
];
$email->addTos($tos);
$email->setSubject("Sending with SendGrid is Fun");
$email->addContent("text/plain", "and easy to do anywhere, even with PHP");
$email->addContent(
"text/html", "<strong>and easy to do anywhere, even with PHP</strong>"
);
$sendgrid = new \SendGrid(getenv('SENDGRID_API_KEY'));
try {
    $response = $sendgrid->send($email);
    print $response->statusCode() . "\n";
    print_r($response->headers());
    print $response->body() . "\n";
} catch (Exception $e) {
    echo 'Caught exception: '.  $e->getMessage(). "\n";
}

Вот мой запрос WordPress: $ send = $ wpdb-> get_results ("SELECT * FROM test");

Как мне правильнозакодировать переменную $ tos из моего запроса к базе данных, чтобы $ email-> addTos ($ tos) не выдавал ошибку?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 19 июня 2019

Я думаю, что у @Jamie_D есть некоторое недопонимание о методе addTos, потому что в настоящее время, 19 июня 2019 года, я использую метод addTos, и он отлично работает,

Редактировать: и теперь сотрудник sendgrid также подтвердил, что он видит эту ссылку: https://github.com/sendgrid/sendgrid-php/issues/127#issuecomment-508330993

при первом использовании я получил ошибки, поэтому я отладил и напечатал некоторую переменную в библиотеке sendgrid, и у меня естьВозможно, вы также упускаете эту точку, поэтому вы получаете ошибку.

в массиве $tos вы должны предоставить ассоциативный массив, в котором электронная почта должна быть ключами, а имя пользователя должно бытьзначения , см. пример ниже:

Синтаксис:

$tos = [ 
        //user emails       =>  user names  
        "user1@example.com" => "Example User1",
        "user2@example.com" => "Example User2",
        "user3@example.com" => "Example User3"
    ];
    $email->addTos($tos);

Пример с использованием таблицы wp_users:

$tos = array();
$userResults = $wpdb->get_results( "SELECT `user_email`, `user_nicename` FROM `wp_users`", ARRAY_A );
foreach($userResults as $user){
    $tos[$user['user_email']]= $user['user_nicename'];
}
$email->addTos($tos);

попробуйте, это точно сработает, а если нет, то скажите мне в комментариях, спасибо.

0 голосов
/ 21 ноября 2018

Согласно этой странице , функция addTos не работает и больше не поддерживается в API SendGrid: «Метод addTos() был перемещен в addTo() и в настоящее время не поддерживает передачу массивов в».

Следовательно:

Использование базы данных test:

$email = new \SendGrid\Mail\Mail(); 
$email->setFrom("test@example.com", "Example User");

$userResults = $wpdb->get_results( "SELECT `email` FROM `test`", ARRAY_A ); //Select as Associative Array
foreach($userResults as $userKey => $userValue){
  $userEmail = $userValue['email']);
  if ( is_email( $userEmail ) ) {  //Validate  properly formatted email structure
      $email->addTo($userValue['email']);  // If you hade a name column you could use: $email->addTo($userValue['email'], $userValue['name']);
  }
}

$email->setSubject("Sending with SendGrid is Fun");
$email->addContent("text/plain", "and easy to do anywhere, even with PHP");
$email->addContent(
"text/html", "<strong>and easy to do anywhere, even with PHP</strong>"
);
$sendgrid = new \SendGrid(getenv('SENDGRID_API_KEY'));
try {
    $response = $sendgrid->send($email);
    print $response->statusCode() . "\n";
    print_r($response->headers());
    print $response->body() . "\n";
} catch (Exception $e) {
    echo 'Caught exception: '.  $e->getMessage(). "\n";
}

Использование базы данных wp_users:

$userResults = $wpdb->get_results( "SELECT `user_email`, `user_nicename` FROM `wp_users`", ARRAY_A );
foreach($userResults as $userKey => $userValue){
    $email->addTo($userValue['user_email'], $userValue['user_nicename']);
}
...