Gmail API .NET: получить полное сообщение

Как получить полное сообщение, а не только метаданные, используя API Gmail?

У меня есть учетная запись службы, и я могу получить сообщение, но только в метаданных, в необработанном и минимальном форматах. Как получить полное сообщение в полном формате? Следующий код работает нормально

var request = service.Users.Messages.Get(userId, messageId);
request.Format = UsersResource.MessagesResource.GetRequest.FormatEnum.Metadata;
Message message = request.Execute();

Однако, когда я опускаю формат (следовательно, я использую формат по умолчанию, который является ПОЛНЫМ), или я изменяю формат на UsersResource.MessagesResource.GetRequest.FormatEnum.FullЯ получаю ошибку: Metadata scope doesn't allow format FULL

Я включил следующие области:

https://www.googleapis.com/auth/gmail.readonly, 
https://www.googleapis.com/auth/gmail.metadata,
https://www.googleapis.com/auth/gmail.modify,
https://mail.google.com/

Как я могу получить полное сообщение?

3 ответа

Решение

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

У пользователя из поста SO такая же ошибка.

Попробуйте это в первую очередь.

  1. Перейдите на https://myaccount.google.com/permissions.
  2. Выберите приложение, с которым вы работаете.
  3. Нажмите Удалить> ОК
  4. В следующий раз просто запросите, какие именно разрешения вам нужны.

Другое дело, попробуйте использовать gmailMessage.payload.parts[0].body.dataи чтобы расшифровать его в читаемый текст, сделайте следующее из SO сообщения:

import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.binary.StringUtils;

System.out.println(StringUtils.newStringUtf8(Base64.decodeBase64(gmailMessage.payload.parts[0].body.data)));

Вы также можете проверить это для дальнейшего использования.

Попробуй что-нибудь подобное

    public String getMessage(string user_id, string message_id)
    {
         Message temp =service.Users.Messages.Get(user_id,message_id).Execute();
         var parts = temp.Payload.Parts;
         string s = "";
         foreach (var part in parts) {
                byte[] data = FromBase64ForUrlString(part.Body.Data);
                s += Encoding.UTF8.GetString(data);
         }
        return s
       }

    public static byte[] FromBase64ForUrlString(string base64ForUrlInput)
        {
            int padChars = (base64ForUrlInput.Length % 4) == 0 ? 0 : (4 - (base64ForUrlInput.Length % 4));
            StringBuilder result = new StringBuilder(base64ForUrlInput, base64ForUrlInput.Length + padChars);
            result.Append(String.Empty.PadRight(padChars, '='));
            result.Replace('-', '+');
            result.Replace('_', '/');
            return Convert.FromBase64String(result.ToString());
        }
Другие вопросы по тегам