2013-05-13 2 views
0

Я пытаюсь прочитать письмо от GMail с помощью gmail-xoauth Gem. Я хочу прочитать письмо и оставить его непрочитанный статус.Прочтите почту Gmail XOAUTH без указания ее на чтение

Во-первых, я пробовал читать только заголовок. Работает.

imap = Net::IMAP.new('imap.gmail.com', 993, usessl = true, certs = nil, verify = false) 
imap.authenticate('XOAUTH2', email, access_token) 
imap.select('INBOX') 
imap.search(["SINCE", since]).each do |message_id| 

    msg = imap.fetch(message_id,'RFC822.HEADER')[0].attr['RFC822.HEADER'] 
    mail = Mail.read_from_string msg 
    puts mail.subject 
end 

Теперь я хочу, чтобы прочитать тело/текст письма без маркировки его читать.

ответ

2

На основании documentation вам необходимо использовать метод store. В документации говорится:

магазин (набор, Attr, флаги)

Посылает команду STORE, чтобы изменить данные, связанные с сообщениями в почтовом ящике, в частности, их флаги. Параметр set - это число или массив чисел или объект Range. Каждый номер представляет собой порядковый номер сообщения. attr - это имя элемента данных для хранения: «FLAGS» означает замену списка флагов сообщения на предоставленный; «+ FLAGS» означает добавить предоставленные флаги; и '-FLAGS' означает их удаление. flags - список флагов.

Возвращаемое значение представляет собой массив Net :: IMAP :: FetchData. Например:

p imap.store(6..8, "+FLAGS", [:Deleted]) 
#=> [#<Net::IMAP::FetchData seqno=6, attr={"FLAGS"=>[:Seen, :Deleted]}>, \\ 
#<Net::IMAP::FetchData seqno=7, attr={"FLAGS"=>[:Seen, :Deleted]}>, \\ 
#<Net::IMAP::FetchData seqno=8, attr={"FLAGS"=>[:Seen, :Deleted]}>] 

Таким образом, вы должны удалить :Seen пометка

imap.store(message_id, "-FLAGS", [:Seen]) 
+0

Спасибо. Это помогает. Наряду с этим imap.fetch (message_id, «FLAGS») [0] .attr ["FLAGS"] позволяет узнать текущий статус чтения/непрочитанных. – Alagu

2

Это возможно быть очень поздно, но я оставлю это здесь для кого-то еще, что спотыкается на это. Если, по какой-либо причине вы хотите, чтобы прочитать электронную почту и оставить всасываемого флаги, использование:

imap.examine('INBOX') 

вместо:

imap.select('INBOX') 

От Net::IMAP doc

Посылает команду EXAMINE для выбора почтового ящика для доступа к сообщениям в почтовом ящике. Выполняет то же самое, что и select(), за исключением того, что выбранный почтовый ящик идентифицируется как доступный только для чтения.

+0

Это лучший ответ – stuartchaney

Смежные вопросы