Не удалось прочитать часть сообщения text/html
Я пытаюсь вытащить тему и тело письма с .Net. Кажется, что это ОК, за исключением text/html MessagePart. Я не уверен в кодировке и т.д. - кто-нибудь получил это нормально? Это ошибки для меня при попытке конвертировать.
Вот строковая строка для text/html Body Datap >
"PGRpdiBkaXI9Imx0ciI-dGV4dCBpbiBoZXJlPGJyPjwvZGl2Pg0K"
который выдает ошибку.
"Ввод не является допустимой строкой Base-64, так как он содержит не-базовый символ 64, более двух дополняющих символов или недопустимый символ среди дополняющих символов."
Вот код:
UsersResource.MessagesResource.GetRequest gr = gs.Users.Messages.Get(userEmail, TextBox1.Text);
gr.Format = UsersResource.MessagesResource.GetRequest.FormatEnum.Full;
Message m = gr.Execute();
foreach (MessagePart p in m.Payload.Parts)
{
if (p.MimeType == "text/html")
{
try
{
byte[] data = Convert.FromBase64String(p.Body.Data);
string decodedString = Encoding.UTF8.GetString(data);
Response.Write(decodedString);
}
catch (Exception ex) { }
}
}
Я ошибаюсь в декодировании
Спасибо за вашу помощь.
Ответы
Ответ 1
Данные тела, как представляется, имеют base64url-кодировку, а не base64-кодировку.
Разница заключается в использовании - и _, а не + и /, в кодировках алфавита из 64 символов.
Одним из решений является замена всех - и _ символов на + и/соответственно, прежде чем вызывать FromBase64String.
См. http://tools.ietf.org/html/rfc4648#section-5
Ответ 2
Вот код, который я закончил, используя:
foreach (MessagePart p in m.Payload.Parts)
{
if (p.MimeType == "text/html")
{
byte[] data = FromBase64ForUrlString(p.Body.Data);
string decodedString = Encoding.UTF8.GetString(data);
Response.Write(decodedString);
}
}
....
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());
}
Хорошая статья http://www.codeproject.com/Tips/76650/Base-base-url-base-url-and-z-base-encoding
Ответ 3
На этой странице https://developers.google.com/gmail/api/v1/reference/users/messages/attachments/get
вы можете обнаружить, что есть пример .NET с этим кодом для декодирования:
// Converting from RFC 4648 base64-encoding
// see http://en.wikipedia.org/wiki/Base64#Implementations_and_history
String attachData = attachPart.Data.Replace('-', '+');
attachData = attachData.Replace('_', '/');
byte[] data = Convert.FromBase64String(attachData);