通过 Gmail 获取包含附件的邮件 API

Get messages which contain an attachment via gmail API

我正在构建一个基于 Gmail API 的应用程序。我可以看到当前收件箱中的所有邮件,但我需要将其限制为仅包含附件的邮件。我该怎么做?

这是我的 GoogleController.cs:

[HttpGet]
[Authorize]
public async Task<IActionResult> GetListEmail(string LabelId, string nameLabel)
{
    string UserEmail = User.FindFirst(c => c.Type == ClaimTypes.Email).Value;
    var service = GetService();
    List<My_Message> listMessages = new List<My_Message>();
    List<Message> result = new List<Message>();
    var emailListRequest = service.Users.Messages.List(UserEmail);
    emailListRequest.LabelIds = LabelId;
    emailListRequest.IncludeSpamTrash = false;
    emailListRequest.MaxResults = 1000;
    var emailListResponse = await emailListRequest.ExecuteAsync();

    if (emailListResponse != null && emailListResponse.Messages != null)
    {
        foreach (var email in emailListResponse.Messages)
        {
            var emailInfoRequest = service.Users.Messages.Get(UserEmail, email.Id);
            var emailInfoResponse = await emailInfoRequest.ExecuteAsync();
            if (emailInfoResponse != null)
            {
                My_Message message = new My_Message();
                message.Id = listMessages.Count + 1;
                message.EmailId = email.Id;
                foreach (var mParts in emailInfoResponse.Payload.Headers)
                {
                    if (mParts.Name == "Date")
                        message.Date_Received = mParts.Value;
                    else if (mParts.Name == "From")
                        message.From = mParts.Value;
                    else if (mParts.Name == "Subject")
                        message.Title = mParts.Value;
                }
                listMessages.Add(message);
            }
        }
    }
    ViewBag.Message = nameLabel;
    return View("~/Views/Home/Index.cshtml", listMessages);
}

使用这样的过滤器 => criteria.query="has:attachment"

另见此处 => https://developers.google.com/gmail/api/v1/reference/users/settings/filters#resource

要测试任何过滤器,您可以使用 GMail: image

我认为更简单的解决方案是在 Users.messages.list 端点中查询而不需要创建过滤器。

您实际上可以使用参数 q 像在 GMail 搜索框中一样进行查询,如果不熟悉可以查看 at the whole list of operators

事实上有一个使用这个查询参数的例子in the documentation:

using Google.Apis.Gmail.v1;
using Google.Apis.Gmail.v1.Data;

using System.Collections.Generic;

// ...

public class MyClass {

  // ...

  /// <summary>
  /// List all Messages of the user's mailbox matching the query.
  /// </summary>
  /// <param name="service">Gmail API service instance.</param>
  /// <param name="userId">User's email address. The special value "me"
  /// can be used to indicate the authenticated user.</param>
  /// <param name="query">String used to filter Messages returned.</param>
  public static List<Message> ListMessages(GmailService service, String userId, String query)
  {
      List<Message> result = new List<Message>();
      UsersResource.MessagesResource.ListRequest request = service.Users.Messages.List(userId);
      request.Q = query; // inform this with the right query

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

  // ...

}

所以对于你的情况,你只需要添加行

emailListRequest.Q = "has:attachment";

在执行请求之前,这样做不会为您的帐户创建一个完整的过滤器,所以这对您的情况来说可能更方便。