【问题标题】:Gmail API read messageGmail API 已读邮件
【发布时间】:2017-12-19 20:45:15
【问题描述】:

我正在尝试使用 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 变量获取值:

        body    "DQpLaW5kIFJlZ2FyZHMsDQoNCldpbGwNCg0KV2lsbCBLZWx0eQ0KMzIzLjI1Mi44Njk5DQp3a2VsdHlAZ21haWwuY29tIDxtYWlsdG86d2tlbHR5QGdtYWlsLmNvbT4NCmh0dHBzOi8vd3d3LmZhY2Vib29rLmNvbS9iaWdibHVlZG93bnRvd24gPGh0dHBzOi8vd3d3LmZhY2Vib29rLmNvbS9iaWdibHVlZG93bnRvd24-DQp3d3cubWV0cm9saWZlcHJvcGVydGllcy5jb20gPGh0dHA6Ly93d3cubWV0cm9saWZlcHJvcGVydGllcy5jb20vPg0KDQpCZWdpbiBmb3J3YXJkZWQgbWVzc2FnZToNCg0KRnJvbTogIkNSRVhpIiA8bm90aWZpY2F0aW9uc0BjcmV4aS5jb20-DQpTdWJqZWN0OiBJbmR1c3RyaWFsIENSRSBBc3NldHMgRm9yIFNhbGUgfCBHcmVhdCBPaGlvIExvY2F0aW9ucyB8IEVhc3kgQWNjZXNzIHwgTkFJIFNwcmluZw0KRGF0ZTogSnVseSAxNCwgMjAxNyBhdCA5OjAxOjQwIEFNIFBEVA0KVG86IHdrZWx0eUBnbWFpbC5jb20NClJlcGx5LVRvOiBpbmZvQGNyZXhpLmNvbQ0KDQogPGh0dHA6Ly9lbWFpbC1saW5rcy5jcmV4aS5jb20vd2YvY2xpY2s_dXBuPWpvS3FmZnZFU3Y1RDU2eXI3cmpPd2lBREcwN3p4ek1EdnI0ZnNsdEY5QWJIT1Z1V2JrU0ZhWXN4aTNXY2hucE11SmhUTUlDZjQ3WVo5bDBoY0RtSGZ2NFl0VXJoN1g2TDh2ZzdMQnlkZi0yQmZzOFZSYVk5UGJyYzg4YjdsT1NRUDZfMGxhbklERktDMWU0bHUtMkZZZjdLNjA1d2ZJOWZHdXp2amlNdjYwUERQNFVCTzd5cjRBTHVjTW8tMkZpRDFadXFSTUV5Z2RISVBhRGU3M2FGeGhLS1hBaS0yRlo5UlVzVFhzampqVS0yRndZN1lIa045M1BQRnlaNEQ1QTBQRHlzSElxMWdIYlQtMkJJRWYtMkZRMDBUQU8yV0lMNC0yQlFVU2hueDlhVnhWSXc5NjRFYmNta0FVVDB5SWhqTXl5Mm9na29FWTR5QWZ1czhUQWVJZDBsU0RXMVBMQi0yQmctMkYxMUJRY3gzYWRoYmJxcG1Ma2FGdTdXU3U1STFkQmJjaXN5bW5tcHIyWXVpdTNOdHdiOFpsTm5jLTJGSDdrdThYU3FxTVdIOHhsWFA2Ykp0VTdVYVN4M2IxcVBITlNDblNDYWRhSkEyeEw0MVlGMjFlTm8wcEZXWTVVQk9LengzYkctMkI4V0g2QXpNR1FkNDJhZS0yRkFMN3c1VkxrSlZ1LTJGdTFlR0lNYjBkV3VmdnZkemlXVjgtMkZHcy0yQks1a3BYUi0yQmJhTUwzUE5NTFhpMWRHUjhEWEZndzh1WGZMSFdNUmc0R2Y2MWMwb2JNUEQtMkI4c1QtMkJ1NTFtRj4JDQogDQogPGh0dHA6Ly9lbWFpbC1saW5rcy5jcmV4aS5jb20vd2YvY2xpY2s_dXBuPVVnWW9yUXo0"  string

有人知道为什么吗?

谢谢

【问题讨论】:

    标签: c# gmail-api


    【解决方案1】:

    改变这一行

    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));
    
    }
    

    另外,要处理多部分且不返回多部分,您可以使用以下代码:

    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);
    }
    

    【讨论】:

    • Base64UrlDecode 方法太复杂了。为什么不使用 Convert.FromBase64String() ?
    • 搜索了几个小时后,这是唯一对我有用的东西。
    • @AlexDrenea 已经很长时间了,但我想当我在玩它时,对于某些消息,gmail 没有返回邮件正文,我想显示一条消息。我认为它仍然会发生。没有进一步调查为什么 gmail 不会为某些人返回邮件正文。
    【解决方案2】:

    正文是 Base64 编码的。

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

    【讨论】:

      【解决方案3】:

      您应该使用readMessage.GetRaw() 方法。下面看如何解码base64字符串:

      byte[] data = Convert.FromBase64String(readMessage.GetRaw());
      string messageString = Encoding.UTF8.GetString(data);
      

      参见参考文献https://developers.google.com/gmail/api/v1/reference/users/messages/get

      【讨论】:

        猜你喜欢
        • 2017-07-27
        • 2015-01-15
        • 2016-05-23
        • 2016-07-07
        • 2018-06-22
        • 2016-07-30
        • 2011-12-02
        • 2014-04-19
        • 2020-04-28
        相关资源
        最近更新 更多