Подтвердить что ты не робот

Недопустимое значение для ошибки 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. Мне нужны эти заголовки, потому что я пытаюсь, чтобы письмо пришло как ответ на поток. Я попытался оставить < и >, но ответ затем не вписывается.

Спасибо

4b9b3361

Ответ 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,'-');

Затем вы отправляете его как необработанные данные. По-видимому, здесь нет искажений содержимого сообщений.