我正在从ruby-gmail gem中寻找一个实例方法,它允许我阅读以下任何一个:
一封Gmail邮件。
在查阅了文档之后,找到了这里,我什么也找不到!?
在.message类部分中找到了一个Gmail::Message实例方法;但是,由于缺少一个更好的术语,它只返回给身体的电子邮件“mumbo-头”。
我的尝试:
#!/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现在:
email.read不工作email.message返回了上面提到的"mumbo-jumbo“。其他人问了这个问题,但没有得到答案。
发布于 2014-11-21 04:55:50
这可能不是你问题的确切答案,但我会告诉你我过去做过什么。我尝试使用红宝石gmail宝石,但它没有做我希望它在阅读信息方面所做的事情。或者,至少,我不能让它起作用。相反,我使用内置的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宝石相关的一页,它讨论了如何使用ruby来读取Gmail消息。今晚我做了一个粗略的尝试来测试它,但显然Google提高了我帐户上的安全性,如果不修改我的Gmail配置,我就无法使用irb (根据我收到的警告邮件)。因此,我无法验证页面上的内容,但正如我提到的,我过去的尝试是无效的,而Net::IMAP对我来说是有效的。
编辑:我找到了这,这很酷。您将需要添加
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是HTML,那么您可能只需使用现有的代码来使用这个html2text方法,而不是像我在发布最初的答案时讨论过的那样切换到Net::IMAP。
发布于 2014-11-21 01:26:40
不介意,它是:
email.subject
email.body我真傻
好的,那么我如何在“可读性”文本中获得主体呢?没有所有的编码内容和html?
发布于 2017-04-14 23:22:04
主题、文本正文和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
endhttps://stackoverflow.com/questions/27052580
复制相似问题