【问题标题】:Mail gem: how to set an email to "read"?邮件宝石:如何将电子邮件设置为“阅读”?
【发布时间】:2015-02-13 09:51:15
【问题描述】:

我必须用 Ruby 编写一个电子邮件导入器,我偶然发现了用于 Ruby 1.9 的非常漂亮的 Mail gem。我知道如何遍历未读消息,但我不知道如何将它们标记为已读(文档很详尽,但我真的不知道要注意什么):

Mail.defaults do
  retriever_method :imap,
    address:    email_account.email_server.host,
    port:       email_account.email_server.port,
    user_name:  email_account.address,
    password:   email_account.password,
    enable_ssl: email_account.email_server.ssl
end

emails = Mail.find(
  what: :first,
  count: 3,
  order: :asc
)

emails.each do |email|
  # Do some stuff and then mark as read!
end

非常感谢您为我指明了正确的方向。

【问题讨论】:

    标签: ruby email gem


    【解决方案1】:

    做起来很简单

    Mail.defaults do
        retriever_method :imap,
        address:    email_account.email_server.host,
        port:       email_account.email_server.port,
        user_name:  email_account.address,
        password:   email_account.password,
        enable_ssl: email_account.email_server.ssl
    end
    
    Mail.find(what: :first, count: 3, order: :asc) do |email, imap, uid|
        # Do some stuff
        # ..
        # mark as read
        imap.uid_store( uid, "+FLAGS", [Net::IMAP::SEEN] )
    end
    

    【讨论】:

      【解决方案2】:

      请试试这个..

      Mark IMAP Email as Read/Unread (Seen/Unseen):

      require 'chilkat'
      
      imap = Chilkat::CkImap.new()
      
      #  Anything unlocks the component and begins a fully-functional 30-day trial.
      success = imap.UnlockComponent("Anything for 30-day trial")
      if (success != true)
          print imap.lastErrorText() + "\n";
          exit
      end
      
      #  Connect to an IMAP server.
      success = imap.Connect("mail.chilkatsoft.com")
      if (success != true)
          print imap.lastErrorText() + "\n";
          exit
      end
      
      #  Login
      success = imap.Login("myLogin","myPassword")
      if (success != true)
          print imap.lastErrorText() + "\n";
          exit
      end
      
      #  Select an IMAP mailbox
      success = imap.SelectMailbox("Inbox")
      if (success != true)
          print imap.lastErrorText() + "\n";
          exit
      end
      
      #  Set PeekMode so that downloaded messages are not
      #  automatically marked as seen.
      imap.put_PeekMode(true)
      
      #  The NumMessages property contains the number of messages
      #  in the currently selected mailbox.
      numMsgs = imap.get_NumMessages()
      if (numMsgs == 0)
          exit
      end
      
      for i in 1 .. numMsgs
          #  Download each email by sequence number (not UID)
      
          # email is a CkEmail
          email = imap.FetchSingle(i,false)
          if (email == nil )
              print imap.lastErrorText() + "\n";
              exit
          end
      
          #  If desired, mark the email as SEEN.  There are two
          #  ways to do it:
      
          #  1) Set the flag directly by using the sequence number
          #  Indicate that we are passing a sequence number and
          #  not a UID:
          bIsUid = false
          #  Set the SEEN flag = 1 to mark the email as SEEN,
          #  or set it to 0 to mark it as not-seen.
          success = imap.SetFlag(i,bIsUid,"SEEN",1)
          if (success != true)
              print imap.lastErrorText() + "\n";
              exit
          end
      
          #  2) Alternatively, we can use the email object.
          #  When an email is downloaded from the IMAP server
          #  Chilkat will add a "ckx-imap-uid" header to the email.
          #  This makes it possible to know the UID associated with
          #  the email.  (This is not the sequence number, which may change
          #  from session to session, but the UID which does not change.
          #  The SetMailFlag method is identical to SetFlag, except
          #  it gets the UID from the ckx-imap-uid header.
          #  For example:
          success = imap.SetMailFlag(email,"SEEN",1)
          if (success != true)
              print imap.lastErrorText() + "\n";
              exit
          end
      
      end
      
      #  Disconnect from the IMAP server.
      imap.Disconnect()
      

      或者试试这个..

      Mark All Unread Mail As Read In Ruby

      【讨论】:

      • 谢谢,但我确信 Mail gem 中嵌入了一些方法,我想使用它们。
      • 嗯.. 我认为,没有选项可以使用 gem Mail 读取/未读邮件。我们需要实现这一点。如果您使用 gmail 作为您的邮件客户端,那么您可以使用 ruby​​-gmail gem (github.com/dcparker/ruby-gmail)。它正在工作,使阅读/未读邮件。我会去处理已读/未读邮件的任务(邮件宝石)。
      • 感谢您的回复。我现在有点困惑 - Mail 宝石不是一种广泛使用且经过充分验证的宝石吗?如果是这样,为什么没有选项将邮件标记为已读/未读?对我来说似乎很奇怪。
      • 我找到了这个:imap.uid_store(uid, "+FLAGS", [:Seen]),我可以使用它。但我不知道如何访问 Mail gem 的 imap 对象。
      • 是的,当然。你说的对。您只找到 imap#uid_store 语法。尚未实现已读/未读(已见/未见)功能。请参阅以下链接。 tinypaste.com/8c8a6b22
      【解决方案3】:

      试试这个:

      Mail.find(keys: ['NOT','SEEN']) do |email, imap, uid|
        imap.uid_store(uid, "+FLAGS", [:Seen])
      end
      

      【讨论】:

        猜你喜欢
        • 2017-06-22
        • 2013-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-08
        • 2021-11-01
        • 2011-03-21
        • 1970-01-01
        相关资源
        最近更新 更多