Неверное значение для ошибки ByteString при вызове API отправки Gmail с кодировкой Base64 <или>

Действительно застрял на этом и выдернул мои волосы, пытаясь понять, что делать, искал везде и пробовал все, но все еще застрял. Буду признателен за любую оказанную помощь.

Итак, я вызываю API отправки сообщений Gmail:

https://www.googleapis.com/gmail/v1/users/me/messages/send

Я передаю следующее закодированное в base64 необработанное сообщение:

VG86IGVjaG9zaWduLnNmZGMucWFAZ21haWwuY29tDQpTdWJqZWN0OiBSZTogd2UgaGF2ZSBhIGNvb2wgcHJvZHVjdA0KSW4tUmVwbHktVG86IDxDQUFMRnBBSmc1aTJlQ1p4T2dQWlhUdnNaN0J5M0gzNlRCMkNQYTdoVEtzTXh2bXZfT3dAbWFpbC5nbWFpbC5jb20 + DQpSZWZlcmVuY2VzOiA8Q0FBTEZwQUpnNWkyZUNaeE9nUFpYVHZzWjdCeTNIMzZUQjJDUGE3aFRLc014dm12X093QG1haWwuZ21haWwuY29tPg0KDQoxMTozNg ==

Который декодирует в:

To: echosign.sfdc.qa@gmail.com
Subject: Re: we have a cool product
In-Reply-To: <CAALFpAJg5i2eCZxOgPZXTvsZ7By3H36TB2CPa7hTKsMxvmv_Ow@mail.gmail.com>
References: <CAALFpAJg5i2eCZxOgPZXTvsZ7By3H36TB2CPa7hTKsMxvmv_Ow@mail.gmail.com>

11:36

Я получаю ошибку:

Код состояния: 400 и статус: Неверный запрос и ответ: { "error": { "errors": [ { "domain": "global", "reason": "invalid", "message": "Недопустимое значение для ByteString

Проблема меньше чем < и больше чем > символы в заголовках In-Reply-To и References. Мне нужны эти заголовки, потому что я пытаюсь, чтобы электронное письмо пришло как ответ в ветке. Я пытался опустить < а также > но ответ тогда не нить.

Спасибо

5 ответов

Решение

Если вы используете PHP, попробуйте это (в противном случае попробуйте конвертировать его на любой язык, который вы используете)

Вызовите нижеприведенную функцию в вашем сообщении MIME, прежде чем устанавливать его для свойства raw.

private function base64url_encode($mime) {
    return rtrim(strtr(base64_encode($mime), '+/', '-_'), '=');
}

Из Google Gmail Rest API (отправка сообщений):

"Полное сообщение электронной почты в строке формата RFC 2822 и base64url. Возвращено в ответах messages.get и drafts.get, когда задан параметр format=RAW".

Кодировка base64url отличается от кодировки base64.

в python библиотека base64 предлагает b64encode() и urlsafe_b64encode(). Если вы не используете urlsafe_b64encode(), вы получите эту ошибку не всегда, поэтому она может пройти простое модульное тестирование, но вскоре завершится неудачей.

В Google Apps Script следующее исправляет проблему

var draftBody = Utilities.base64EncodeWebSafe(raw);

Не использовать var draftBody = Utilities.base64Encode(raw);

Google API декодирует с urlsafe_b64decode, Попробуй использовать urlsafe_b64encode (кодировать строки, используя URL-безопасный алфавит, который использует - вместо + а также _ вместо / в стандартном алфавите Base64.)

В вашем примере я вижу один + Это означает, что вы использовали стандартный Base64.

После того, как вы закодируете свое сообщение через base64Encode, как здесь (при условии google script):

var draftBody =  Utilities.base64Encode(message_content_string);

Вы должны конвертировать все '/' а также '+' символы, которые не являются веб-безопасными и приведут к ошибке "Недопустимое значение для ByteString". Вы можете сделать это следующим образом:

draftBody = draftBody.replace(/\//g,'_').replace(/\+/g,'-');

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

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