我可以使用gmail api和c#从gmail中读取消息吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我可以使用gmail api和c#从gmail中读取消息吗?相关的知识,希望对你有一定的参考价值。

我想使用c#和gmail api读取我的Gmail帐户中的所有邮件。 我可以这样做吗? 我在Gmail API上阅读了很多文章,但我无法阅读消息。 另外,我想阅读一些消息或标题。 如果有人可以帮助我,我会很高兴:)

我使用这段代码:

public static List<Message> ListMessages(GmailService service, String userId)
    {
        List<Message> result = new List<Message>();
        UsersResource.MessagesResource.ListRequest request = service.Users.Messages.List(userId);

        do
        {
            try
            {
                ListMessagesResponse response = request.Execute();
                result.AddRange(response.Messages);
                request.PageToken = response.NextPageToken;
            }
            catch (Exception e)
            {
                Console.WriteLine("An error occurred: " + e.Message);
            }
        } while (!String.IsNullOrEmpty(request.PageToken));

        return result;
    }

还有这个:

foreach (var item in ListMessages(service,"me"))
                MessageBox.Show(item.Snippet);

但结果我有空消息框。

答案

是的,你说你做的话应该没问题。我建议多阅读一下文档。

首先,您需要进行身份验证 - 以下显示如何使用服务帐户执行此操作(此处更多详细信息https://developers.google.com/gmail/api/auth/web-server

                    serviceAccountEmail = primaryLink.serviceEmailAddress;
                    certificate = new X509Certificate2(AppDomain.CurrentDomain.BaseDirectory + "certs//" + primaryLink.certificate, primaryLink.certificatePassword, X509KeyStorageFlags.Exportable);

                    try
                    {
                        credential = new ServiceAccountCredential(
                        new ServiceAccountCredential.Initializer(serviceAccountEmail)
                        {
                            User = z.us.emailAccount,
                            Scopes = new[] { "https://www.googleapis.com/auth/userinfo.email", "https://www.googleapis.com/auth/userinfo.profile", "https://mail.google.com/" }
                        }.FromCertificate(certificate));

                        if (credential.RequestAccessTokenAsync(CancellationToken.None).Result)
                        {
                            gs = new GmailService(
                            new Google.Apis.Services.BaseClientService.Initializer()
                            {
                                ApplicationName = "Example",
                                HttpClientInitializer = credential
                            });
                        }
                        else
                        {
                            throw new Exception("gmail authentication Error.");
                        }
                    }
                    catch (Exception ex)
                    {
                        throw ex;
                    }
                    ListMessagesResponse respM = reqM.Execute();
                    if (respM.Messages != null)
                    {   
                         foreach (Message m in respM.Messages)
                         {}
                    } 

获得消息列表后,您可以遍历消息并使用MIME解析器或遍历消息结构以获取标题,正文等。

这个论坛有很多帖子都会介绍如何做到这一点。

另一答案

我搜索了一个完整的例子,没有运气,但这是我的工作示例。基于https://developers.google.com/gmail/api/guides

  1. 认证:https://developers.google.com/gmail/api/auth/web-server
  2. 获取所有电子邮件
  3. 通过Id循环浏览所有电子邮件,并请求消息等。

这是获取第一封电子邮件地址的代码段,但您可以简单地遍历所有的findIds以获取所有电子邮件,并使用message.snippet获取正文:

            List<string> foundIds = new List<string>();
            string outputDir = "/EXAMPLE/EXAMPLE/"; // your preferred Dir to save attachments to



            List<Google.Apis.Gmail.v1.Data.Thread> resultThread = new List<Google.Apis.Gmail.v1.Data.Thread>();
            UsersResource.ThreadsResource.ListRequest requestThread = service.Users.Threads.List("me");


            do
            {
                try
                {
                    ListThreadsResponse responseThread = requestThread.Execute();
                    resultThread.AddRange(responseThread.Threads);

                    foreach (var item in responseThread.Threads )
                    {
                        foundIds.Add(item.Id);
                    }

                    requestThread.PageToken = responseThread.NextPageToken;
                }
                catch (Exception e)
                {
                    Console.WriteLine("An error occurred: " + e.Message);
                }
            } while (!String.IsNullOrEmpty(requestThread.PageToken));

            try
            {
                Message message = service.Users.Messages.Get("me", foundIds[0]).Execute();
                IList<MessagePart> parts = message.Payload.Parts;
                foreach (MessagePart part in parts)
                {
                    if (!String.IsNullOrEmpty(part.Filename))
                    {
                        String attId = part.Body.AttachmentId;
                        MessagePartBody attachPart = service.Users.Messages.Attachments.Get("me", foundIds[0], attId).Execute();

                        // Converting from RFC 4648 base64 to base64url encoding
                        // see http://en.wikipedia.org/wiki/Base64#Implementations_and_history
                        String attachData = attachPart.Data.Replace('-', '+');
                        attachData = attachData.Replace('_', '/');

                        byte[] data = Convert.FromBase64String(attachData);
                        File.WriteAllBytes(Path.Combine(outputDir, part.Filename), data);
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("An error occurred: " + e.Message);
            }
另一答案

@BlackCat,你的ListMessages看起来不错。现在,要获取消息体,您必须解码MimeType“text / plain”或“text / html”。例如:

public static void GetBody(GmailService service, String userId, String messageId, String outputDir)
    {
        try
        {
            Message message = service.Users.Messages.Get(userId, messageId).Execute();
            Console.WriteLine(message.InternalDate);
            if (message.Payload.MimeType == "text/plain")
            {
                byte[] data = FromBase64ForUrlString(message.Payload.Body.Data);
                string decodedString = Encoding.UTF8.GetString(data);
                Console.WriteLine(decodedString);
            }
            else
            {
                IList<MessagePart> parts = message.Payload.Parts;
                if (parts != null && parts.Count > 0)
                {
                    foreach (MessagePart part in parts)
                    {
                        if (part.MimeType == "text/html")
                        {
                            byte[] data = FromBase64ForUrlString(part.Body.Data);
                            string decodedString = Encoding.UTF8.GetString(data);
                            Console.WriteLine(decodedString);
                        }
                    }
                }
            }
            Console.WriteLine("----");
        }
        catch (Exception e)
        {
            Console.WriteLine("An error occurred: " + e.Message);
        }
    }

以上是关于我可以使用gmail api和c#从gmail中读取消息吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用 IMAP(javamail API)从 gmail 访问电子邮件

在C#中从Gmail阅读电子邮件

Gmail现在支持安排电子邮件,如何使用gmail rest api工作,还是api支持此功能?

带有 MimeKit、C# Winforms 和 Google API 的 Gmail 草稿(带附件的 HTML)

是否有可能使用gmail -API从一个特定的发件人处收到最近5封电子邮件

从 Gmail 中检索未读电子邮件 - JavaMail API + IMAP