如何在 Java 中使用 Gmail API 导入邮件

How to import a message with the Gmail API in Java

我研究过这个页面: https://developers.google.com/gmail/api/v1/reference/users/messages/import

我有一些消息将在我的 Android 程序中跟踪。我将记录我将要删除的邮件,并且我想将那些计划删除的邮件导入一个新文件夹(在 Gmail 中 API 文件夹称为标签)。

我试过测试表格:

            POST https://www.googleapis.com/gmail/v1/users/omitted%40gmail.com/messages/import?deleted=false&internalDateSource=dateHeader&neverMarkSpam=true&processForCalendar=false&key={YOUR_API_KEY}
            {
             "payload": {
              "body": {
               "data": "hellio"
              }
             }
            }

回复:

        400 OK
        - SHOW HEADERS -
        {
         "error": {
          "errors": [
           {
            "domain": "global",
            "reason": "invalidArgument",
            "message": "'raw' RFC822 payload message string or uploading message via /upload/* URL required"
           }
          ],
          "code": 400,
          "message": "'raw' RFC822 payload message string or uploading message via /upload/* URL required"
         }
        }

发送请求时出现问题,但我完全不确定这是什么意思。我需要的是一些 Java 发送一个请求,该请求将导入一条消息,我可以在其中指定正文、接收日期和主题行。可能吗?

谢谢。

P.S。我只是想删除附件而不是整个邮件,但在阅读 Gmail API 文档后,我发现这是不可能的,只能通过 IMAP 进行。我问这个问题的原因是我不必将我的整个程序移动到 IMAP。

您的代码已经非常接近了。您需要做的是写一封符合 RFC 2822 standard 的邮件,并对邮件进行 Base64 编码并使其 URL 安全(将所有 + 替换为 - 和所有/_) 在插入之前。

你比我更擅长 Java,但如果我在浏览器的开发者控制台中做出正确的消息,它可能看起来像这样:

var encodedMail = btoa(
  "Date: Thu, 1 Jan 1970 12:00:00 -0000\n" +
  "From: emtholin@gmail.com\n" +
  "To: emtholin@gmail.com\n" +
  "Subject: Example Subject\n\n" +

  "This is the body of the mail"
).replace(/\+/g, '-').replace(/\//g, '_');

然后我将插入此邮件与您发出的相同请求:

POST https://www.googleapis.com/gmail/v1/users/me/messages?internalDateSource=dateHeader&key={YOUR_API_KEY}

{
 "raw": "RGF0ZTogVGh1LCAxIEphbiAxOTcwIDEyOjAwOjAwIC0wMDAwCkZyb206IGVtdGhvbGluQGdtYWlsLmNvbQpUbzogZW10aG9saW5AZ21haWwuY29tClN1YmplY3Q6IEV4YW1wbGUgU3ViamVjdAoKVGhpcyBpcyB0aGUgYm9keSBvZiB0aGUgbWFpbA=="
}

如您所见,效果很好!