Добавление сообщения об ошибке Gmail «Количество частей полезной нагрузки отличается от ожидаемого» - PullRequest
0 голосов
/ 26 мая 2020

Я добавляю сообщение в папку Gmail, используя этот (пример) URL:

https://www.googleapis.com/gmail/v1/users/user@domain.com/messages/import?uploadType=multipart

Тело запроса выглядит так:

--test_abc123
Content-Type: application/json; charset=UTF-8

{
 "labelIds": [ "Label_525" ],
 "raw": "RnJvbTogIlNlY3RpZ28gQ2VydGlmaWNh..."
}

--test_abc123--

Необработанные данные стандартное сообщение MIME в кодировке base64, которое мне кажется нормальным. Результатом этого POST является HTTP-ошибка 400 с ответом об ошибке «Количество частей полезной нагрузки отличается от ожидаемого 2. Количество частей полезной нагрузки запроса: 1».

Я могу предоставить исходный текст MIME, если это полезно, но позвольте Подчеркну, что я без проблем запускаю этот код несколько лет. Я пробовал разные сообщения, чтобы проверить это, но похоже, что Google что-то изменил, чтобы сломать мое программное обеспечение.

Google возражает против моих сырых данных или что-то насчет кодировки MIME? Есть идеи, в чем может быть проблема?

---- Приложение ---- Я получил несколько рабочих сообщений, похоже, все они содержат изображения или вложения данных. Однако я действительно не вижу никаких проблем с сообщениями, которые не работают - я могу импортировать их в Office 365 или Thunderbird или что-нибудь еще, и они отображаются нормально. В качестве теста я попытался импортировать сообщение ниже, которое было взято из MIME RF C. Он терпит неудачу с той же ошибкой. Я думаю, что Google что-то изменил, чтобы сделать свой парсер MIME очень суетливым, но я не понимаю, как исправить мои входные данные.

From: Nathaniel Borenstein <nsb@bellcore.com>
To:  Ned Freed <ned@innosoft.com>
Subject: Sample message
MIME-Version: 1.0
Content-type: multipart/mixed; boundary="simple boundary"

This is the preamble.  It is to be ignored, though it
is a handy place for mail composers to include an
explanatory note to non-MIME compliant readers.
--simple boundary

This is implicitly typed plain ASCII text.
It does NOT end with a linebreak.
--simple boundary
Content-type: text/plain; charset=us-ascii

This is explicitly typed plain ASCII text.
It DOES end with a linebreak.

--simple boundary--
This is the epilogue.  It is also to be ignored.

Приложение 2: Я попробовал простую загрузку (используя контент- введите заголовок message / rfc822), и это сработало, за исключением того, что сообщение не было помечено. Как мне указать, какой ярлык я хочу применить к сообщению? Первоначально я пытался следовать документации здесь ссылка , которая говорит мне создать тело json, которое я дал выше. Это позволяет мне указать метку. Но я не могу использовать это тело в простой загрузке. Тип содержимого либо недействителен, либо Gmail импортирует просто тело json, оно не анализирует необработанные данные. Если бы вы могли указать мне на конкретный пример c, показывающий URI, тело сообщения, заголовки http (а не java код), это было бы очень полезно для меня.

Ответы [ 2 ]

1 голос
/ 28 мая 2020

Хорошо, неважно, я заставил его работать, добавив пустую часть message / rfc822 в тело многостраничной загрузки. Это устраивает Google, и пустая часть игнорируется в пользу необработанных данных.

0 голосов
/ 27 мая 2020

Вы выполняете составную загрузку, см. здесь :

Тело запроса отформатировано как составной / связанный тип контента [RFC2387], а содержит ровно две части . Части обозначаются граничной строкой, а за последней граничной строкой ставятся два дефиса.

Вот почему это работает только для ваших сообщений с изображениями или вложениями, поскольку ваше сообщение

--test_abc123

- это только одна часть.

Раньше не проверялось, выполняется ли это условие, поэтому вы могли избежать использования multipart для сообщений, состоящих из одной части.

Но теперь это невозможно, поэтому, если у вас есть одночастное сообщение, вы должны использовать Простую загрузку .

Если вы не знаете заранее, сколько частей имеет ваше сообщение, вы всегда можете сначала попробовать составное, реализовав оператор try...catch и в случае сбоя реализовать простой запрос загрузки в пределах catch.

...