使用ruby-gmail阅读Gmail邮件

时间:2014-11-21 01:12:14

标签: ruby rubygems gmail

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

  • 身体 或

  • 受试者

的Gmail邮件。

在查看文档后,发现here,我找不到任何内容!

.message类部分中有一个Gmail::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,"如上所述
  3. 有人在SO上提出这个问题,但没有得到答案。

4 个答案:

答案 0 :(得分:6)

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

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

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

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

编辑: 我找到了this,这很酷。您需要添加

require 'cgi'

到你的班级。

我能够以这种方式实现它。获得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(/(&nbsp;|\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

你在原来的问题中也提到你在这一步中得到了mumbo-jumbo:

email.message *returns mumbo-jumbo*

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

答案 1 :(得分:3)

没关系,这是:

email.subject
email.body
傻了我

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

答案 2 :(得分:2)

主题,文本正文和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

答案 3 :(得分:1)

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