这可能并不完全是您问题的答案,但我会告诉您我过去所做的事情。我尝试使用 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 来解析它。如果您只想要一小部分消息,其中您知道一些周围的字符,您可以使用正则表达式来查找您感兴趣的部分。
我确实找到了one page https://github.com/dcparker/ruby-gmail/issues/36与 ruby-gmail gem 相关,该 gem 讨论使用 ruby-gmail 读取 Gmail 消息。今晚我粗略地尝试了一下,但显然谷歌提高了我帐户的安全性,如果不修改我的 Gmail 配置,我就无法使用 irb(根据我收到的警告电子邮件)。所以我无法验证该页面上的内容,但正如我提到的,我过去的尝试没有成果,而Net::IMAP
对我有用。
编辑:
我发现this https://www.ruby-forum.com/topic/51108,这很酷。您需要添加
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(/( |\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
您在最初的问题中还提到,您在这一步中遇到了胡言乱语:
email.message *returns mumbo-jumbo*
如果 mumbo-jumbo 是 HTML,您可能可以仅将现有代码与此 html2text 方法一起使用,而不是切换到Net::IMAP
正如我在发布原始答案时所讨论的那样。