Postmark/Guzzle InvalidArgumentException: неверный тип ресурса: логический

Я продолжаю получать InvalidArgumentException: Invalid resource type: boolean из некоторых писем, отправляемых через почтовую марку. Некоторые работают, другие нет. Я не вижу ничего отличного между электронными письмами, которые работают, и теми, в которых есть ошибки. Они запускают один и тот же код с одинаковыми параметрами.

Вот что я передаю в Postmark:

$client = new PostmarkClient($config->postmark->token);
$sendResult = $client->sendEmail(
  $config->postmark->sender,
  $recipient,
  $subject,
  $html_body,
  $text_body,
  null, true, null, null, null, null, $attachments
);

Вот стек вызовов:

vendor/guzzlehttp/streams/src/Stream.php in factory at line 85
throw new \InvalidArgumentException('Invalid resource type: ' . $type);

vendor/guzzlehttp/guzzle/src/Message/MessageFactory.php in applyOptions at line 345
$request->setBody(Stream::factory(json_encode($value)));

vendor/guzzlehttp/guzzle/src/Message/MessageFactory.php in createRequest at line 98
$this->applyOptions($request, $options);

vendor/guzzlehttp/guzzle/src/Client.php in createRequest at line 120
return $this->messageFactory->createRequest($method, $url, $options);

vendor/wildbit/postmark-php/src/Postmark/PostmarkClientBase.php in processRestRequest at line 101
$request = $client->createRequest($method, $url, $options);

vendor/wildbit/postmark-php/src/Postmark/PostmarkClient.php in sendEmail at line 61
return new DynamicResponseModel($this->processRestRequest('POST', '/email', $body));

library/send_mail.php in send_mail at line 86

Я гуглил некоторое время и не нашел ничего, что могло бы это понять.

Я посмотрел здесь: https://laracasts.com/discuss/channels/general-discussion/mandrill-trouble-invalid-resource-type-boolean и здесь: https://laracasts.com/forum/?p=2325-problems-using-mandrill/0 но у них обоих были проблемы с Laravel+Mandrill, но я использую Postmark, а не фреймворк. У нас, однако, есть общие черты. В обоих этих постах говорилось, что они справились с этим путем обновления или переустановки своего Guzzle.

Кажется, я запускаю "рабочую" версию Guzzle. GitHub Выпуск #628 для Guzzle, кажется, именно то, что я вижу, но эта проблема говорит, что это было исправлено в 4.0.2, я на Guzzle 5.3:

От моего composer.lock на сервере:

{
  "name": "guzzlehttp/guzzle",
  "version": "5.3.0"
},
...
{
  "name": "guzzlehttp/streams",
  "version": "3.0.0"
},
...
{
  "name": "wildbit/postmark-php",
  "version": "dev-master",
  "source": {
      "type": "git",
      "url": "https://github.com/wildbit/postmark-php",
      "reference": "2eabc627c3f2a693b986e51d2f892cc2e2d065b3"
  },
  "require": {
    "guzzlehttp/guzzle": "~5.1",
    "php": ">=5.4.0"
  },
}

Какие-нибудь мысли?

1 ответ

Решение

Если ваша ошибка не сразу очевидна, то call stak обычно проливает свет на то, что происходит не так. Это не исключение, и я должен был заметить это раньше.

Второй, последний элемент в стеке вызовов - это то, где это пошло плохо.

$request->setBody(Stream::factory(json_encode($value)));

Вот, json_encode($value) возвращает логическое значение. С помощью json_last_error() Я был в состоянии определить, что проблема была со смешанной кодировкой символов (JSON_ERROR_UTF8).

Где-то в пользовательском вводе были предоставленные пользователем данные, представляющие собой смесь UTF-8 и ISO-8895-1. Поскольку это было непоследовательным, некоторые электронные письма работали бы просто отлично, в то время как другие терпели неудачу.

Я заставил себя $html_body а также $text_body быть UTF-8 и все начало работать.

Другие вопросы по тегам