How to retrieve only unread emails with ruby mail gem?
This question was answered in Need help on reading emails with "mail" gem in ruby
However the answer was not accepted - don´t know why. Also the question did not mention "unread email" nor the [mail-gem] tag so it was not obvious to search.
The answer points to the solution on the ruby-gem issues report https://github.com/mikel/mail/issues/258
Using Ruby Mail Gem to read Email subjects
Eventually found the answer with the aid of this table : https://i.stack.imgur.com/qbe46.png
Changing the if statement to if !(email == []) did the trick
Thanks, everyone for helping me think it through.
Reading a Gmail Message with ruby-gmail
This probably isn't exactly the answer to your question, but I will tell you what I have done in the past. I tried using the ruby-gmail gem but it didn't do what I wanted it to do in terms of reading a message. Or, at least, I couldn't get it to work. Instead I use the built-in Net::IMAP
class to log in and get a message.
require 'net/imap'
imap = Net::IMAP.new('imap.gmail.com',993,true)
imap.login('<username>','<password>')
imap.select('INBOX')
subject_id = search_mail(imap, 'SUBJECT', '<mail_subject>')
subject_message = imap.fetch(subject_id,'RFC822')[0].attr['RFC822']
mail = Mail.read_from_string subject_message
body_message = mail.html_part.body
From here your message is stored in body_message
and is HTML. If you want the entire email body you will probably need to learn how to use Nokogiri to parse it. If you just want a small bit of the message where you know some of the surrounding characters you can use a regex to find the part you are interested in.I did find one page associated with the ruby-gmail gem that talks about using ruby-gmail to read a Gmail message. I made a cursory attempt at testing it tonight but apparently Google upped the security on my account and I couldn't get in using irb without tinkering with my Gmail configuration (according to the warning email I received). So I was unable to verify what is stated on that page, but as I mentioned my past attempts were unfruitful whereas Net::IMAP
works for me.
EDIT:
I found this, which is pretty cool. You will need to add in
require 'cgi'
to your class.I was able to implement it in this way. After I have my body_message
, call the html2text
method from that linked page (which I modified slightly and included below since you have to convert body_message to a string):
plain_text = html2text(body_message)
puts plain_text #Prints nicely formatted plain text to the terminal
Here is the slightly modified method:def html2text(html)
text = html.to_s.
gsub(/( |\n|\s)+/im, ' ').squeeze(' ').strip.
gsub(/<([^\s]+)[^>]*(src|href)=\s*(.?)([^>\s]*)\3[^>]*>\4<\/\1>/i,
'\4')
links = []
linkregex = /<[^>]*(src|href)=\s*(.?)([^>\s]*)\2[^>]*>\s*/i
while linkregex.match(text)
links << $~[3]
text.sub!(linkregex, "[#{links.size}]")
end
text = CGI.unescapeHTML(
text.
gsub(/<(script|style)[^>]*>.*<\/\1>/im, '').
gsub(/<!--.*-->/m, '').
gsub(/<hr(| [^>]*)>/i, "___\n").
gsub(/<li(| [^>]*)>/i, "\n* ").
gsub(/<blockquote(| [^>]*)>/i, '> ').
gsub(/<(br)(| [^>]*)>/i, "\n").
gsub(/<(\/h[\d]+|p)(| [^>]*)>/i, "\n\n").
gsub(/<[^>]*>/, '')
).lstrip.gsub(/\n[ ]+/, "\n") + "\n"
for i in (0...links.size).to_a
text = text + "\n [#{i+1}] <#{CGI.unescapeHTML(links[i])}>" unless
links[i].nil?
end
links = nil
text
end
You also mentioned in your original question that you got mumbo-jumbo with this step:email.message *returns mumbo-jumbo*
If the mumbo-jumbo is HTML, you can probably just use your existing code with this html2text method instead of switching over to Net::IMAP
as I had discussed when I posted my original answer.
Related Topics
Private Messages with Faye and Rails
How to Access a Toplevel Entity in Ruby, from Inside a Module Which Defines The Same Name
Using Update_Columns in Rails 3
Running "Bundle Install" Fails and Asks Me to Run "Bundle Install"
Rails Gem Prawn, Image and Anchor
Completely Random Identifier of a Given Length
How to Tell a Ruby Method to Expect a Specific Parameter Type
Dbi::Interfaceerror: Could Not Load Driver (Uninitialized Constant MySQL error)
Seed Images in Heroku with Paperclip
Sqlite3::Sqlexception: Duplicate Column Name While Migrating
Escaping Strings for Ruby Sqlite Insert
How to Directly Install a Gem from a Git Repository
Error Installing Rdoc Documentation: Incompatible Encoding Regexp Match
Rails: Before Process_Action Callback: Authenticate_User! Has Not Been Defined
Deleting Items from an Array Requires Multiple Passes to Remove Them All
Starting with Redmine Locally - How Easy Is Migration to Server Later