Недопустимое значение для ошибки ByteString при вызове API-интерфейсов gmail с кодировкой base64 <или>
Действительно застрял на этом и вытащил мои волосы, пытаясь понять, что делать, обыскивал везде и пытался все, но все еще застрял. Любая помощь очень ценится.
Итак, я вызываю API-адрес отправки Gmail:
https://www.googleapis.com/gmail/v1/users/me/messages/send
Я передаю следующее исходное сообщение с кодировкой base64:
VG86IGVjaG9zaWduLnNmZGMucWFAZ21haWwuY29tDQpTdWJqZWN0OiBSZTogd2UgaGF2ZSBhIGNvb2wgcHJvZHVjdA0KSW4tUmVwbHktVG86IDxDQUFMRnBBSmc1aTJlQ1p4T2dQWlhUdnNaN0J5M0gzNlRCMkNQYTdoVEtzTXh2bXZfT3dAbWFpbC5nbWFpbC5jb20 + DQpSZWZlcmVuY2VzOiA8Q0FBTEZwQUpnNWkyZUNaeE9nUFpYVHZzWjdCeTNIMzZUQjJDUGE3aFRLc014dm12X093QG1haWwuZ21haWwuY29tPg0KDQoxMTozNg ==
Что декодирует:
To: [email protected]
Subject: Re: we have a cool product
In-Reply-To: <[email protected]om>
References: <[email protected]om>
11:36
Я получаю сообщение об ошибке:
Код состояния: 400 и статус: Плохой запрос и ответ: { "error": { "errors": [{ "domain": "global", "reason": "invalid", "message": "Invalid value для ByteString
Проблема заключается в символах меньше <
и больше >
в заголовках In-Reply-To and References. Мне нужны эти заголовки, потому что я пытаюсь, чтобы письмо пришло как ответ на поток. Я попытался оставить <
и >
, но ответ затем не вписывается.
Спасибо
Ответы
Ответ 1
Если вы используете PHP, попробуйте это (в противном случае попробуйте преобразовать его на любой язык, который вы используете)
Вызовите функцию ниже в своем сообщении mime, прежде чем устанавливать ее в исходное свойство.
private function base64url_encode($mime) {
return rtrim(strtr(base64_encode($mime), '+/', '-_'), '=');
}
Ответ 2
Из gmail gmail rest api (отправка сообщений):
"Все сообщение электронной почты в кодированной RFC 2822 и base64url. Возвращается в ответах messages.get и drafts.get, когда предоставляется параметр format = RAW."
base64 url кодировка не совпадает с кодировкой base64.
в python, библиотека base64 предлагает b64encode() и urlsafe_b64encode(). Если вы не используете urlsafe_b64encode(), вы получите эту ошибку не все время, чтобы она могла пройти простой unit test, но она скоро закончится.
Ответ 3
В Google Apps Script исправлены проблемы
var draftBody = Utilities.base64EncodeWebSafe(raw);
Не используйте var draftBody = Utilities.base64Encode(raw);
Ответ 4
Google API декодирует с помощью urlsafe_b64decode
. Попробуйте использовать urlsafe_b64encode
(кодировать строки, используя безопасный для URL-адрес алфавит, который вместо +
и _
вместо /
использует -
) вместо стандартного алфавита Base64.)
В вашем примере я вижу один +
, который означает, что вы использовали стандартный Base64.
Ответ 5
После вы кодируете содержимое своего сообщения через base64Encode
, как здесь (при условии, что google script):
var draftBody = Utilities.base64Encode(message_content_string);
вам нужно преобразовать все символы '/'
и '+'
, которые не являются "безопасными для веб-страниц" , и будут вызывать ошибку "Недопустимое значение для ByteString". Вы можете сделать это следующим образом:
draftBody = draftBody.replace(/\//g,'_').replace(/\+/g,'-');
Затем вы отправляете его как необработанные данные. По-видимому, здесь нет искажений содержимого сообщений.