【问题标题】:Attaching labels to messages in Gmail via IMAP using code使用代码通过 IMAP 将标签附加到 Gmail 中的邮件
【发布时间】:2011-01-28 03:44:24
【问题描述】:

关于 Gmail 标签 - 从技术上讲,它们是什么。我的意思是通过 imap 连接我可以访问 gmail 邮箱并浏览电子邮件但是假设我希望创建一个标签并将其附加到电子邮件中,因为我使用代码循环它们 - 我如何在代码中做到这一点?我正在使用 php - 和 Zend 框架。

编辑 ===

感谢您的回复,因此现在很清楚标签在这方面被视为文件夹,但是我尝试了 Zend_Mail_Storage_Imap 类函数,结果很有趣。如果我尝试 Zend_Mail_Storage_Imap:moveMessage 函数 - 它会从任何地方删除消息并在其上附加一个标签,这意味着如果我希望将标签 foo 附加到我的消息中,它将从收件箱中删除它并附加标签 foo。但是,如果我使用 Zend_Mail_Storage_Imap::copyMessage 就可以了。

但是我在这里想知道,这不是真的会复制消息,而您最终会在这里得到不止一个重复的消息吗?

另外,如果我需要选择所有带有特定标签的邮件,或者在这种情况下是在特定文件夹中的邮件,该怎么办?

【问题讨论】:

  • Re: copyMessage 会复制消息吗?不在 GMail 中。 GMail 将“文件夹”重新定义为标签。所以消息不会重复。而是应用或移除标签。要选择具有特定标签的所有消息,请使用 imap 操作 select(label) 选择“文件夹”,然后使用 imap 搜索以检索“文件夹”中消息的消息 ID——具有所需标签的消息跨度>
  • 非常棒,效果很好 - 但是如果我想选择收件箱中所有未标记特定标签的电子邮件.. 我该怎么做?

标签: php email zend-framework gmail imap


【解决方案1】:

我在这里聚会很晚了,但人们可能会发现来自https://developers.google.com/gmail/imap_extensions 的这些信息很有用:

出于 IMAP 的目的,Gmail 将标签视为文件夹。因此,可以使用作用于文件夹的标准 IMAP 命令CREATERENAMEDELETE 修改标签。系统标签是由 Gmail 创建的标签,在标签列表中保留并以“[Gmail]”或“[GoogleMail]”为前缀。使用XLIST 命令获取邮箱的完整标签列表。

可以通过使用X-GM-LABELS 属性和FETCH 命令来检索给定消息的标签。该属性以ASTRINGs 列表的形式返回,并根据需要以UTF-7 编码。 ASTRING 是 RFC 定义的 atomstring

以下是使用FETCH 命令检索多条消息的X-GM-LABELS 的调用记录示例:

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 (Success)

标签可以使用STORE 命令与X-GM-LABELS 属性一起添加到消息中。以下是演示向消息添加标签的示例脚本:

a011 STORE 1 +X-GM-LABELS (foo)
* 1 FETCH (X-GM-LABELS (\Inbox \Sent Important "Muy Importante" foo))
a011 OK STORE (Success)

X-GM-LABELS 属性也可以在SEARCHUID SEARCH 命令中使用,以查找具有给定标签的文件夹中所有邮件的序列号或UIDs。以下是使用SEARCH 命令检索多条消息的序列号的调用记录示例:

a012 SEARCH X-GM-LABELS foo
* SEARCH 1 2
a012 OK SEARCH (Success)

【讨论】:

    【解决方案2】:

    Gmail 支持按邮件存储标签:

    a011 STORE 1 +X-GM-LABELS (foo)
    * 1 FETCH (X-GM-LABELS (\Inbox \Sent Important "Muy Importante" foo))
    a011 OK STORE (Success)
    

    来自他们的 API 工具网站:http://code.google.com/apis/gmail/imap/#x-gm-labels

    【讨论】:

      【解决方案3】:

      【讨论】:

      • imap_mail_move 将应用标签,并从收件箱中删除邮件(存档邮件)。如果您想应用标签,请使用imap_mail_copy,但仍将邮件保留在收件箱中。
      • 发现很困难,感谢您的输入 - 查看我的更新!
      【解决方案4】:

      Re:关于 Gmail 标签 - 从技术上讲,它们是什么。

      由于 IMAP 没有“标签”的概念,因此在 GMail“标签”和 IMAP“文件夹”之间或多或少有一个映射 Here 是我在上面找到的最好的文档。但真正帮助我创建与 GMail 的程序化 IMAP 交互的是实验。

      例如,预设标签的 IMAP 文件夹名称为

      Human name -- IMAP Folder name
      Drafts -- [Gmail]/Drafts
      Sent Mail -- [Gmail]/Sent Mail
      Spam -- [Gmail]/Spam
      Starred -- [Gmail]/Starred
      Trash -- [Gmail]/Trash
      

      添加--

      Re:创建一个标签并将其附加到电子邮件,因为我使用代码循环它们 - 我如何在代码中做到这一点?

      要创建标签,请使用 Imap 的“创建文件夹”操作。

      使用 Imap 复制操作为消息添加标签。

      要从 GMail 收件箱中删除邮件,我 90% 确定您添加了 IMAP 标志“已删除”。 -- 但是请先尝试一下。我不清楚设置删除标志时删除了哪些标签。在我的测试中,当我应用已删除标志时,邮件只有 1 个标签(收件箱)。

      这是我用于将 GMail 邮件从收件箱移动到垃圾箱文件夹的代码:

      # Ruby code...
      imap.store(message_id, "+FLAGS", [:Deleted]) # rm inbox label
      imap.copy(message_id, "[Gmail]/Trash")       # add trash label
      

      【讨论】:

      • 嗯,所以基本上标签映射到 IMAP 文件夹 - 很酷 - 所以如果我要使用我自己的 php 代码将标签“应用”到 Gmail 中的邮件......我会怎么做?跨度>
      • 不幸的是,我不熟悉 php imap 库。它应该公开“创建文件夹”、“复制到文件夹”等各种 Imap 程序。
      猜你喜欢
      • 1970-01-01
      • 2013-02-06
      • 2011-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-09
      • 2018-11-02
      相关资源
      最近更新 更多