2017-07-14 89 views
1

我正尝试使用gmail api阅读电子邮件。但是正文消息的格式是不可读的。Gmail API阅读消息

static void Main(string[] args) 
    { 
     UserCredential credential; 

     using (var stream = 
      new FileStream("client_secret.json", FileMode.Open, FileAccess.Read)) 
     { 
      string credPath = System.Environment.GetFolderPath(
       System.Environment.SpecialFolder.Personal); 
      credPath = Path.Combine(credPath, ".credentials/gmail-dotnet-quickstart.json"); 

      credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
       GoogleClientSecrets.Load(stream).Secrets, 
       Scopes, 
       "user", 
       CancellationToken.None, 
       new FileDataStore(credPath, true)).Result; 
      Console.WriteLine("Credential file saved to: " + credPath); 
     } 

     // Create Gmail API service. 
     var service = new GmailService(new BaseClientService.Initializer() 
     { 
      HttpClientInitializer = credential, 
      ApplicationName = ApplicationName, 
     }); 


     UsersResource.MessagesResource.ListRequest request = service.Users.Messages.List("me"); 
     IList<Message> messages = request.Execute().Messages; 
     if (messages != null && messages.Count > 0) 
     { 
      foreach (var messageItem in messages) 
      { 
       var readMessage = service.Users.Messages.Get("me", messageItem.Id).Execute(); 
       var body = readMessage.Payload.Parts[0].Body.Data; 
      } 
     } } 

当调试我的测试应用,身体变量得到值:

 body "DQpLaW5kIFJlZ2FyZHMsDQoNCldpbGwNCg0KV2lsbCBLZWx0eQ0KMzIzLjI1Mi44Njk5DQp3a2VsdHlAZ21haWwuY29tIDxtYWlsdG86d2tlbHR5QGdtYWlsLmNvbT4NCmh0dHBzOi8vd3d3LmZhY2Vib29rLmNvbS9iaWdibHVlZG93bnRvd24gPGh0dHBzOi8vd3d3LmZhY2Vib29rLmNvbS9iaWdibHVlZG93bnRvd24-DQp3d3cubWV0cm9saWZlcHJvcGVydGllcy5jb20gPGh0dHA6Ly93d3cubWV0cm9saWZlcHJvcGVydGllcy5jb20vPg0KDQpCZWdpbiBmb3J3YXJkZWQgbWVzc2FnZToNCg0KRnJvbTogIkNSRVhpIiA8bm90aWZpY2F0aW9uc0BjcmV4aS5jb20-DQpTdWJqZWN0OiBJbmR1c3RyaWFsIENSRSBBc3NldHMgRm9yIFNhbGUgfCBHcmVhdCBPaGlvIExvY2F0aW9ucyB8IEVhc3kgQWNjZXNzIHwgTkFJIFNwcmluZw0KRGF0ZTogSnVseSAxNCwgMjAxNyBhdCA5OjAxOjQwIEFNIFBEVA0KVG86IHdrZWx0eUBnbWFpbC5jb20NClJlcGx5LVRvOiBpbmZvQGNyZXhpLmNvbQ0KDQogPGh0dHA6Ly9lbWFpbC1saW5rcy5jcmV4aS5jb20vd2YvY2xpY2s_dXBuPWpvS3FmZnZFU3Y1RDU2eXI3cmpPd2lBREcwN3p4ek1EdnI0ZnNsdEY5QWJIT1Z1V2JrU0ZhWXN4aTNXY2hucE11SmhUTUlDZjQ3WVo5bDBoY0RtSGZ2NFl0VXJoN1g2TDh2ZzdMQnlkZi0yQmZzOFZSYVk5UGJyYzg4YjdsT1NRUDZfMGxhbklERktDMWU0bHUtMkZZZjdLNjA1d2ZJOWZHdXp2amlNdjYwUERQNFVCTzd5cjRBTHVjTW8tMkZpRDFadXFSTUV5Z2RISVBhRGU3M2FGeGhLS1hBaS0yRlo5UlVzVFhzampqVS0yRndZN1lIa045M1BQRnlaNEQ1QTBQRHlzSElxMWdIYlQtMkJJRWYtMkZRMDBUQU8yV0lMNC0yQlFVU2hueDlhVnhWSXc5NjRFYmNta0FVVDB5SWhqTXl5Mm9na29FWTR5QWZ1czhUQWVJZDBsU0RXMVBMQi0yQmctMkYxMUJRY3gzYWRoYmJxcG1Ma2FGdTdXU3U1STFkQmJjaXN5bW5tcHIyWXVpdTNOdHdiOFpsTm5jLTJGSDdrdThYU3FxTVdIOHhsWFA2Ykp0VTdVYVN4M2IxcVBITlNDblNDYWRhSkEyeEw0MVlGMjFlTm8wcEZXWTVVQk9LengzYkctMkI4V0g2QXpNR1FkNDJhZS0yRkFMN3c1VkxrSlZ1LTJGdTFlR0lNYjBkV3VmdnZkemlXVjgtMkZHcy0yQks1a3BYUi0yQmJhTUwzUE5NTFhpMWRHUjhEWEZndzh1WGZMSFdNUmc0R2Y2MWMwb2JNUEQtMkI4c1QtMkJ1NTFtRj4JDQogDQogPGh0dHA6Ly9lbWFpbC1saW5rcy5jcmV4aS5jb20vd2YvY2xpY2s_dXBuPVVnWW9yUXo0" string 

有谁知道为什么吗?

谢谢

回答

3

改变这一行

var body = readMessage.Payload.Parts[0].Body.Data; 

var body = Base64UrlDecode(readMessage.Payload.Parts[0].Body.Data); 

并在代码中添加这个方法:

public static string Base64UrlDecode(string input) 
{ 
    if (string.IsNullOrWhiteSpace(input)) 
     return "<strong>Message body was not returned from Google</strong>"; 

    string InputStr = input.Replace("-", "+").Replace("_", "/"); 
    return System.Text.Encoding.UTF8.GetString(Convert.FromBase64String(InputStr)); 

} 

而且,自己处理,没有的multipart的回报,你可以使用此代码:

if (ml.Payload.Parts != null) { 
    foreach (void bParts_loopVariable in ml.Payload.Parts) { 
     bParts = bParts_loopVariable; 
     if (bParts.MimeType == "text/html") { 
      if (bParts.Body != null) { 
       dynamic mp = bParts.Body; 
       if (mp != null) { 
        return Base64UrlDecode(mp.Data); 

       } 
      } 
     } 
    } 
} else { 
    return Base64UrlDecode(ml.Payload.Body.Data); 
} 
+0

这Base64UrlDecodemethod的方式复杂。为什么不使用Convert.FromBase64String()? – AlexDrenea

+0

找了几个小时后,这是唯一对我有用的东西。 –

+0

@AlexDrenea它已经很长一段时间了,但我想当我玩它的时候,对于一些消息,gmail没有返回mailbody,我想显示一条消息。我认为它仍然发生。没有进一步调查为什么gmail不会为某些人返回邮件正文。 –

0

身体是Base64编码。

您需要调用Convert.FromBase64String(string)来获取纯文本。