can*_*ute 2 ruby gmail rubygems
我正在寻找ruby-gmailgem中的一个实例方法,它允许我读取:
身体或
学科
的Gmail邮件.
在查看了这里找到的文档后,我找不到任何东西!?
.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
Run Code Online (Sandbox Code Playgroud)
现在:
email.read它不工作email.message 返回上面提到的"mumbo-jumbo" 有人在SO上提出这个问题,但没有得到答案.
这可能不是你问题的答案,但我会告诉你我过去做了什么.我尝试使用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
Run Code Online (Sandbox Code Playgroud)
从这里您的消息存储在body_messageHTML中.如果你想要整个电子邮件正文,你可能需要学习如何使用Nokogiri来解析它.如果您只想要了解一些您知道某些周围字符的消息,可以使用正则表达式来查找您感兴趣的部分.
我确实找到了一个与ruby-gmail gem关联的页面,该页面讨论了使用ruby-gmail来读取Gmail消息.今晚我粗略地尝试了测试它,但显然谷歌提高了我的帐户的安全性,我无法使用irb而不修改我的Gmail配置(根据我收到的警告电子邮件).所以我无法验证该页面上的内容,但正如我所提到的,我过去的尝试是无用的,而Net::IMAP对我有用.
编辑:我发现了这个,这很酷.你需要加入
require 'cgi'
Run Code Online (Sandbox Code Playgroud)
到你的班级.
我能够以这种方式实现它.在我拥有之后body_message,html2text从该链接页面调用该方法(我稍微修改并包含在下面,因为您必须将body_message转换为字符串):
plain_text = html2text(body_message)
puts plain_text #Prints nicely formatted plain text to the terminal
Run Code Online (Sandbox Code Playgroud)
这是稍加修改的方法:
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
Run Code Online (Sandbox Code Playgroud)
您在原始问题中也提到过,您通过此步骤获得了mumbo-jumbo:
email.message *returns mumbo-jumbo*
Run Code Online (Sandbox Code Playgroud)
如果mumbo-jumbo是HTML,你可以使用这个html2text方法使用现有代码,而不是Net::IMAP像我在发布原始答案时所讨论的那样切换.