2014-11-21 109 views
2

我要尋找從ruby-gmail寶石的實例方法,讓我可以讀取這兩種:閱讀Gmail郵件與紅寶石的Gmail

  • 身體 或

  • 主題

Gmail郵件。

經過審查文檔,發現here,我找不到任何東西!?

Gmail::Message類節中找到了一個.message實例方法;但由於缺乏更好的術語,它只會返回給身體的電子郵件「mumbo-jumbo」。

我嘗試:

#!/usr/local/bin/ruby 
require 'gmail' 

gmail = Gmail.connect('username', 'password') 

emails = gmail.inbox.emails(:from => '[email protected]') 

emails.each do |email| 
    email.read 
    email.message 
end 

現在:

  1. email.read這樣做, 「天書」,上面

有人提到工作

  • email.message回報其他人問這個questi在SO上,但沒有得到答案。

  • +0

    你能告訴我們什麼email.message回報? – pjd 2014-11-23 04:08:00

    +0

    我實際上使用了:email.html_part.body.decoded,然後Nokogiri來解析HTML!簡單 – cannotcompute 2014-11-25 00:46:54

    回答

    5

    這可能不完全是你的問題的答案,但我會告訴你我過去做了什麼。我嘗試使用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與ruby-gmail gem關聯,使用ruby-gmail閱讀Gmail郵件。我今天晚上進行了一次粗略的嘗試,但顯然谷歌加強了我帳戶的安全性,而且我沒法修改我的Gmail配置(根據我收到的警告郵件)而無法使用irb。所以我無法驗證該頁面上顯示的內容,但正如我所提到的,我過去的嘗試是不成熟的,而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 
    

    您還在,你有天書,這一步你原來的問題提到:

    email.message *returns mumbo-jumbo* 
    

    如果天書是HTML,您可能只需使用您的現有代碼與此html2text方法,而不是切換到Net::IMAP,因爲我發佈我的原始答案時已討論過。

    3

    沒關係,它是:

    email.subject 
    email.body 
    

    我傻

    OK,讓我怎麼弄身在 「可讀」 的文字?沒有所有的編碼的東西和HTML?

    +2

    你好,請你告訴我你是如何找到這些方法的? – mickael 2015-09-03 11:56:54

    +0

    通常[RTFM](http://www.rubydoc.info/gems/gmail/Gmail/Message)。 但由於該手冊相當簡單: 'puts [email.message.methods - Object.new.methods] [0] .sort.inspect' – Gawin 2017-04-14 23:26:19

    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