Неверное значение для ошибки 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,'-');
Затем вы отправляете это как необработанные данные. Видимо, здесь нет искажения содержимого сообщения.