Я продолжаю получать InvalidArgumentException: Invalid resource type: boolean
из некоторых писем, отправляемых через Postmark. Некоторые работают, другие - нет. Я не вижу ничего другого между работающими электронными письмами и теми, у кого есть ошибки. Они работают с одним и тем же кодом с теми же параметрами.
Вот что я перехожу в 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
Некоторое время я искал Google и не нашел ничего, чтобы понять это.
Я посмотрел здесь: 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. Проблема 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"
},
}
Есть предположения?
Когда ваша ошибка не сразу очевидна, тогда вызов stak обычно проливает свет на то, что происходит неправильно. Это не исключение, и я должен был заметить это раньше.
Второй, чтобы последний элемент в стеке вызовов, где это пошло плохо.
$request->setBody(Stream::factory(json_encode($value)));
Здесь json_encode($value)
возвращает логическое значение. Используя json_last_error()
я смог определить, что проблема JSON_ERROR_UTF8
со смешанным кодированием символов (JSON_ERROR_UTF8
).
Где-то в пользовательском вводе были предоставлены пользовательские данные, которые были комбинацией UTF-8 и ISO-8895-1. Поскольку это было непоследовательно, некоторые электронные письма работали бы очень хорошо, в то время как другие были неудачными.
Я закончил тем, что мой $html_body
и $text_body
был UTF-8, и все начало работать.