使用javamail api确定放置电子邮件的Gmail标签

时间:2013-07-24 18:13:14

标签: java tabs gmail javamail

我正在制作应用程序,可以确定电子邮件所在的Gmail标签页(即社交,促销等)。有没有办法确定使用javamail api将电子邮件放入哪个Gmail标签?或者是否有其他一些应用程序可以确定这个?

提前致谢。

2 个答案:

答案 0 :(得分:1)

由于Google不会将信息与IMAP协议集成在一起,因此无法使用Javamail API确定类别/标签。类别/标签只能通过Google专有的GMail API使用。

Image of categories settings in 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->“ Gmail出于IMAP的目的将标签视为文件夹。”

    a010 FETCH 1:4(X-GM-LABELS)

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

    a008 FETCH 1:4(X-GM-THRID)

    • 1个FETCH(X-GM-THRID 1278455344230334865)
    • 2个FETCH(X-GM-THRID 1266894439832287888)
    • 3个FETCH(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. 在“包含单词”行中,输入“ category:primary”
  6. 点击“创建过滤器”
  7. 勾选“应用标签”
  8. 选择“新标签...”
  9. 输入标签名称 [这将是IMAP文件夹名称]

该过程的屏幕截图:

Procedure

跳过收件箱的过程

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

要过滤的可能类别的列表:

  • 类别:主要
  • 类别:社交
  • 类别:促销
  • 类别:论坛
  • 类别:更新

答案 1 :(得分:0)

JavaMail API的标准IMAP / SMTP功能&即使处理标签,Gmail API也足够了。但要获取自定义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()方法进行重新解析。

以上链接极好地解释了以上实施。

Getting Gmail labels using javamail

Shishir