使用ruby-gmail阅读Gmail邮件

我正在寻找ruby-gmail gem中的一个实例方法,它允许我读取:

  • 身体或

  • 学科

的Gmail邮件。

在查看了这里找到的文档后,我找不到任何东西!?

Gmail::Message类部分中有一个.message实例方法; 但是,由于缺乏一个更好的术语,它只会为身体发送电子邮件“mumbo-jumbo”。

我的尝试:

 #!/usr/local/bin/ruby require 'gmail' gmail = Gmail.connect('username', 'password') emails = gmail.inbox.emails(:from => 'someone@mail.com') emails.each do |email| email.read email.message end 

现在:

  1. email.read不起作用
  2. email.message返回上面提到的“mumbo-jumbo”

有人在SO上提出这个问题,但没有得到答案。

这可能不是你问题的答案,但我会告诉你我过去做了什么。 我尝试使用ruby-gmail gem,但它在阅读消息方面没有做我想做的事情。 或者,至少,我无法让它发挥作用。 相反,我使用内置的Net::IMAP类登录并获取消息。

 require 'net/imap' imap = Net::IMAP.new('imap.gmail.com',993,true) imap.login('','') imap.select('INBOX') subject_id = search_mail(imap, 'SUBJECT', '') subject_message = imap.fetch(subject_id,'RFC822')[0].attr['RFC822'] mail = Mail.read_from_string subject_message body_message = mail.html_part.body 

从这里,您的消息存储在body_message并且是HTML。 如果你想要整个电子邮件正文,你可能需要学习如何使用Nokogiri来解析它。 如果您只想要了解一些您知道某些周围字符的消息,可以使用正则表达式来查找您感兴趣的部分。

我确实找到了一个与ruby-gmail gem关联的页面 ,该页面讨论了使用ruby-gmail来读取Gmail消息。 我今晚粗略地尝试了测试它,但显然谷歌提高了我的帐户的安全性,我无法使用irb而没有修改我的Gmail配置(根据我收到的警告电子邮件)。 所以我无法validation该页面上的内容,但正如我所提到的,我过去的尝试都没有用,而Net::IMAP对我有用。

编辑:我发现了这个 ,这很酷。 你需要加入

 require 'cgi' 

到你的class级。

我能够以这种方式实现它。 在我拥有body_message ,从该链接页面调用html2text方法(我稍微修改并包含在下面,因为你必须将body_message转换为字符串):

 plain_text = html2text(body_message) puts plain_text #Prints nicely formatted plain text to the terminal 

这是稍加修改的方法:

 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(/]*)>/i, "___\n"). gsub(/]*)>/i, "\n* "). gsub(/]*)>/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 

您在原始问题中也提到过您在此步骤中获得了mumbo-jumbo:

 email.message *returns mumbo-jumbo* 

如果mumbo-jumbo是HTML,你可以使用你的现有代码和这个html2text方法,而不是像我在发布原始答案时所讨论的那样切换到Net::IMAP

没关系,它是:

 email.subject email.body 

傻我

好的,那么如何让身体处于“可读”的文本中呢? 没有所有编码的东西和HTML?

主题,文本正文和HTML正文:

 email.subject if email.message.multipart? text_body = email.message.text_part.body.decoded html_body = email.message.html_part.body.decoded else # Only multipart messages contain a HTML body text_body = email.message.body.decoded html_body = text end 

附件:

 email.message.attachments.each do |attachment| path = "/tmp/#{attachment.filename}" File.write(path, attachment.decoded) # The MIME type might be useful content_type = attachment.mime_type end 
 require 'gmail' gmail = Gmail.connect('username', 'password') emails = gmail.inbox.emails(:from => 'someone@mail.com') emails.each do |email| puts email.subject puts email.text_part.body.decoded end