2012-07-31 163 views
2

我必須在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 

非常感謝指引我進入正確的方向。

回答

0

請試試這個..

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

+0

謝謝,但我相信有方法嵌入到郵件寶石,我想使用它們。 – 2012-07-31 09:42:52

+1

嗯..我想,沒有選擇使讀/未讀郵件使用gem郵件。我們需要實現這一點。如果您使用Gmail作爲您的郵件客戶端,那麼您可以使用ruby-gmail gem(https://github.com/dcparker/ruby-gmail)。它正在工作使讀/未讀郵件。我會去閱讀任務閱讀/未讀郵件(郵件寶石)。 – 2012-07-31 11:21:32

+0

感謝您的回覆。我現在有點困惑 - 是不是郵件寶石廣泛使用和良好證明的寶石?如果是這樣,爲什麼沒有選項可以將郵件標記爲已讀/未讀?對我來說似乎很奇怪。 – 2012-07-31 11:37:57

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 
0

試試這個:

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