2014-09-05 1 views
4

Я повсюду повсюду и продолжаю работать в тупиках.-Converting Gmail MessageParts в читаемый текст

Я пытаюсь использовать API Google для загрузки gmail в плагин C#, а затем поместить его в созданный класс объектов почты, который может понять родительская программа.

Я получил возможность загружать сообщения, и я могу получить все, кроме фактического тела электронной почты, которое глубоко погружено в структуру MessagePart полезной нагрузки.

Что мне нужно - это способ преобразования частей полезной нагрузки в Richtext или HTML, если это возможно, или чистый текст, если нет.

На данный момент мне не нужно, чтобы какие-либо вложения изображений проходили, просто текст в теле.

GmailService gs = new GmailService(new Google.Apis.Services.BaseClientService.Initializer() { ApplicationName = Constant.clientId, HttpClientInitializer = credential }); 

UsersResource.MessagesResource messagesResource = gs.Users.Messages; 
IList<Message> messages = messagesResource.List(userGmail.Value).Execute().Messages; 
foreach (Message message in messages) 
{ 
    String messageID = message.Id; 
    ReceivedGmail check = ObjectSpace.RetrieveObjectByKeyProperty<ReceivedGmail>(messageID); 

    if (check == null) 
    { 
     messagesResource.Get(userGmail.Value, messageID).Format = UsersResource.MessagesResource.GetRequest.FormatEnum.Raw; 

     Message mail = messagesResource.Get(userGmail.Value, messageID).Execute(); 
     MessagePart mailbody = mail.Payload; 

     ReceivedGmail gmail = new ReceivedGmail() { User = User.CurrentUser, Unread = true, mailID = messageID }; 

     //Get all the header information from the message (Date, Emails, etc.) and add to gmail object. 

     //gmail.body = ?????; 

     ObjectSpace.StoreObject<ReceivedGmail>(gmail); 
    } 
} 

Любая помощь о том, как получить данные, которые мне нужно добавить в gmail.body, будет с благодарностью.

ответ

7

Хорошо намного больше поиска и чеканка и более тупиков, пока, наконец, ...

Поскольку я имел строку MIME, мне просто нужно сделать несколько замен, а затем декодировать его с помощью base64

Так решение ...

public static String GetMimeString(MessagePart Parts) 
    { 
     String Body = ""; 

     if (Parts.Parts != null) 
     { 
      foreach (MessagePart part in Parts.Parts) 
      { 
       Body = String.Format("{0}\n{1}", Body, GetMimeString(part)); 
      } 
     } 
     else if (Parts.Body.Data != null && Parts.Body.AttachmentId == null && Parts.MimeType == "text/plain") 
     { 
      String codedBody = Parts.Body.Data.Replace("-", "+"); 
      codedBody = codedBody.Replace("_", "/"); 
      byte[] data = Convert.FromBase64String(codedBody); 
      Body = Encoding.UTF8.GetString(data); 
     } 

     return Body; 
0

Вот @Stephen Hammond решение в Objective C (испытанные & работы):

NSString *body = [self getMimeString:message.payload]; 

- (NSString*)getMimeString:(GTLRGmail_MessagePart*)parts { 
    NSString *body = @""; 

    if (parts.parts) { 
     for (GTLRGmail_MessagePart *part in parts.parts) { 
      body = [NSString stringWithFormat:@"%@\n%@", body, [self getMimeString:part]]; 
     } 
    } 
    else if (parts.body.data && !parts.body.attachmentId && [parts.mimeType.lowercaseString isEqualToString:@"text/plain"]) { 
     NSString *base64String = [parts.body.data stringByReplacingOccurrencesOfString:@"-" withString:@"+"]; 
     base64String = [base64String stringByReplacingOccurrencesOfString:@"_" withString:@"/"]; 

     NSData *decodedData = [[NSData alloc] initWithBase64EncodedString:base64String options:0]; 
     body = [[NSString alloc] initWithData:decodedData encoding:NSUTF8StringEncoding]; 

    } 

    return body; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^