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 такая же ошибка.
Попробуйте это в первую очередь.
- Перейдите на https://myaccount.google.com/permissions.
- Выберите приложение, с которым вы работаете.
- Нажмите Удалить> ОК
- В следующий раз просто запросите, какие именно разрешения вам нужны.
Другое дело, попробуйте использовать 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());
}