Ошибка Sendgrid 400 Неправильный запрос

Я получаю это сообщение об ошибке при попытке отправить электронное письмо через SendGrid:

400 { "errors": [ { "message": "Bad Request", "field": null, "help": null } ] } array(14) { [0]=> string(25) "HTTP/1.1 400 Bad Request " [1]=> string(14) "Server: nginx " [2]=> string(36) "Date: Sat, 11 Mar 2017 19:20:44 GMT " [3]=> string(31) "Content-Type: application/json " [4]=> string(19) "Content-Length: 63 " [5]=> string(23) "Connection: keep-alive " [6]=> string(22) "X-Frame-Options: DENY " [7]=> string(58) "Access-Control-Allow-Origin: https://sendgrid.api-docs.io " [8]=> string(35) "Access-Control-Allow-Methods: POST " [9]=> string(87) "Access-Control-Allow-Headers: Authorization, Content-Type, On-behalf-of, x-sg-elas-acl " [10]=> string(28) "Access-Control-Max-Age: 600 " [11]=> string(75) "X-No-CORS-Reason: https://sendgrid.com/docs/Classroom/Basics/API/cors.html " [12]=> string(1) " " [13]=> string(0) "" }

Вот мой код:

<?php

// If you are using Composer
require 'vendor/autoload.php';

use SendGrid\Mail;

$apiKey = 'mykey';
$sg = new \SendGrid($apiKey);
$email = new SendGrid\Email("Me", "[email protected]");

$mail = new SendGrid\Mail();
$mail->setFrom($email);
$mail->setSubject("Attachment Test");
$p = new \SendGrid\Personalization();
$p->addTo($email);
$c = new \SendGrid\Content("text/plain", "Hi");
$mail->addPersonalization($p);
$mail->addContent($c);

$att1 = new \SendGrid\Attachment();
$att1->setContent( file_get_contents("favicon.ico") );
$att1->setType("text/plain");
$att1->setFilename("1.txt");
$att1->setDisposition("attachment");
$mail->addAttachment( $att1 );

$response = $sg->client->mail()->send()->post($mail);

echo $response->statusCode() . "\n";
echo json_encode( json_decode($response->body()), JSON_PRETTY_PRINT) . "\n";
var_dump($response->headers());
?>

Не уверен, связано ли это с вложением. Мне удалось отправить электронное письмо с использованием другого кода, но я пытаюсь внедрить в него вложения, так что это новый код. Я не знаю много php, так что я немного растерялся, что означает эта ошибка.

2

Решение

Ошибка, которую вы получаете из-за вложения.

Содержимое файла должно быть base64 закодирован. В противном случае он будет искажать JSON, поскольку вы вводите случайные байты в тело запроса.

Вы можете увидеть это в полном примере почтового помощника для sendgrid-php, base64 Строка устанавливается в качестве содержимого вложения.
https://github.com/sendgrid/sendgrid-php/blob/master/examples/helpers/mail/example.php#L83

Как вы можете видеть в Attachment класс, содержимое просто устанавливается и сериализуется как строка в объекте JSON при сериализации класса:
https://github.com/sendgrid/sendgrid-php/blob/master/lib/helpers/mail/Mail.php#L670

Вам просто нужно использовать эту функцию: http://php.net/manual/en/function.base64-encode.php

Чтобы изменить строку:

$att1->setContent( file_get_contents("favicon.ico") );

Для того, чтобы:

$att1->setContent( base64_encode( file_get_contents("favicon.ico") ) );

Документация по отправке почты v3 находится здесь: https://sendgrid.com/docs/API_Reference/Web_API_v3/Mail/index.html

Если вы прокрутите вниз до объекта «attachments» и развернете поле «content», он покажет требования к нему, maily: The Base64 encoded content of the attachment.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]