5

我正在开发可以确定电子邮件位于哪个 Gmail 选项卡下的应用程序(即SocialPromotions等)。有没有办法确定使用 Javamail API 将电子邮件放入哪个 Gmail 选项卡?还是有其他一些应用程序可以确定这一点?

提前致谢。

4

2 回答 2

1

无法使用 Javamail API 确定类别/选项卡,因为 Google 不会将信息与 IMAP 协议集成。类别/选项卡只能通过 Google 专有的 GMail API 获得。

Gmail 中的类别设置图片

在标签下的 GMail 设置中,我可以通过单击类别旁边的“显示”来让类别显示为 GMail Web 客户端中的文件夹,但是它们没有出现在 IMAP 请求中。它必须是设计使然,因为没有为类别提供“在 IMAP 中显示”选项。

在现有答案中提到 GMail IMAP 扩展可用于访问 X-GM-THRID 和 X-GM-LABELS

这些扩展在 Google 的 GMail IMAP 文档中进行了解释: https ://developers.google.com/gmail/imap/imap-extensions

  1. X-GM-LABELS ->“出于 IMAP 的目的,Gmail 将标签视为文件夹。”

    a010 提取 1:4(X-GM-标签)

    • 1 FETCH (X-GM-LABELS (\Inbox \Sent Important "Muy Importante"))
    • 2 FETCH (X-GM-LABELS (foo))
    • 3 取(X-GM-标签())
    • 4 FETCH (X-GM-LABELS (\Drafts)) a010 OK FETCH (成功)
  2. X-GM-THRID -> “Gmail 提供了一个线程 ID,以与在 Gmail 网络界面中相同的方式关联消息组。”

    a008 提取 1:4 (X-GM-THRID)

    • 1 提取(X-GM-THRID 1278455344230334865)
    • 2 取(X-GM-THRID 1266894439832287888)
    • 3 取(X-GM-THRID 1266894439832287888)
    • 4 FETCH (X-GM-THRID 1266894439832287888) a008 OK FETCH (成功)

但是这些扩展都没有指定电子邮件所属的类别。

然而,有两种替代解决方案可以让 Javamail 间接处理类别:

  1. 使用将标签与每个类别相关联的过滤器 -> 为每个类别创建一个 IMAP 文件夹
  2. 创建一个过滤器并将其与“跳过收件箱”相关联,以排除某些电子邮件进入 IMAP 请求(如果这是您的目标)

将类别更改为标签/IMAP 文件夹的过程:

  1. 转到 GMail 设置
  2. 点击“查看所有设置”
  3. 单击“过滤器和阻止的地址”
  4. 点击“创建新过滤器”
  5. 在“包括单词”行上输入“类别:主要”
  6. 点击“创建过滤器”
  7. 勾选“应用标签”
  8. 选择“新标签...”
  9. 输入标签名称 [这将是 IMAP 文件夹名称]

该过程的屏幕截图:

程序

跳过收件箱的过程

  1. 与上述相同的程序
  2. 在第 7 步中,选择“跳过收件箱”而不是“应用标签”

要过滤的可能类别列表:

  • 类别:初级
  • 类别:社交
  • 类别:促销
  • 类别:论坛
  • 类别:更新
于 2020-08-17T13:07:10.063 回答
0

JavaMail API 和 Gmail API 的标准 IMAP/SMTP 功能已经足够,甚至可以处理标签。但要获取自定义 Gmail 属性 X-GM-THRID 和 X-GM-LABELS,请查看Gmail Imap Extensions

为了从 Gmail 中获取邮件列表,您必须实现标准的 javamail 配置文件获取:

folder.fetch(msgs, stdFetchProfile);

现在要从 Gmail 中获取标签/标签/标签列表,请使用以下方法调用自定义方法IMAPFolder’s doCommand()

final MessageSet[] mSets = MessageSet.createMessageSets(mns);
((IMAPFolder) folder).doCommand(new IMAPFolder.ProtocolCommand() {
    @Override
    public Object doCommand(IMAPProtocol p) throws ProtocolException {
        try {
            Response[] r = p.fetch(mSets, "X-GM-LABELS X-GM-THRID");
            for (int i = 0; i < r.length; i++) {
                if (!FetchResponse.class.isInstance(r[i]))
                    continue;

                // Got a FetchResponse.
                GmailFetchResponse gfr = new GmailFetchResponse(
                                ((FetchResponse) r[i]).toString());
                // Use gfr.getNumber() to get the msg number
                for (int j = 0; j < gfr.getItemCount(); j++) {
                    Item item = gfr.getItem(j);
                    if (X_GM_LABELS.class.isInstance(item))
                        // get the labels
                        ((X_GM_LABELS) item).x_gm_labels);
                }
            }
        } catch (ProtocolException e) {
            logError(e.getMessage(), e);
        }
        return null;
    }
});

然后您需要使用java-gmail-imap ' parse() 方法进行重新解析。

上面的实现在以下链接中得到了很好的解释。

使用 javamail 获取 Gmail 标签

施希尔

于 2014-03-20T12:44:36.587 回答