2009-07-08 2 views
11

Có lẽ hôm nay tôi đã có một bộ não xấu, nhưng đột nhiên tôi không thể tìm ra cách để đọc một email với thư viện net/imap của ruby. Tôi đã ở đó trong vài giờ. Tôi đã gõ một số biến thể của "ruby imap read body" vào google và đã khám phá nhiều trang web. Tất cả đều có ví dụ về cách kéo tệp đính kèm, đồng bộ hóa máy chủ e-mail, làm việc với gmail v.v ... Một số (như chilkat) thực sự là thư viện phần mềm chia sẻ thực hiện việc này cho bạn. Tôi đã xem tài liệu net/imap và mặc dù có một số ví dụ để làm mọi thứ nhưng đọc văn bản nội dung.Cách đọc văn bản nội dung của email bằng thư viện net/imap của ruby?

Tôi đã làm việc với net/imap trước đây nhưng tôi chỉ cần kéo các tệp đính kèm trong hộp thư đến vào một thư mục. Tôi đã yêu cầu #ruby và #rubyonrails không có kết quả - không ai có thể hiểu được.

 

imap=Net::IMAP.new('mail.xks.com') #of course these are not real 
imap.login('web1_xk3','pxx2006') 
imap.select('INBOX') 
imap.search(["SENTSINCE",(Time.now-1.day).strftime("%d-%b-%Y")]).each do |msgid| 
    body = imap.fetch(msgid,"BODY")[0].attr["BODY"] 
    ##insert code for getting the text from the body here 
    ##body.class is BodyTypeText 
end 
 

P.S. Mặc dù tôi làm cho một tham chiếu đến hỗ trợ tích cực trong các mã, đây là sans-ray do đó có nghĩa không có hành động bưu phẩm

Trả lời

20

Nếu bạn chỉ muốn chỉ là nội dung nội dung của thư bạn có thể sử dụng:

body = imap.fetch(message_id,'BODY[TEXT]')[0].attr['BODY[TEXT]'] 

IMAP API là một chút bí truyền mặc dù. Nếu bạn muốn để đối phó với toàn bộ tin nhắn, tôi sẽ khuyên bạn sử dụng TMail để phân tích nó thành một dạng dễ dàng hơn để sử dụng:

msg = imap.fetch(message_id,'RFC822')[0].attr['RFC822'] 
mail = TMail::Mail.parse(msg) 
body = mail.body 
7

Hoặc nếu bạn đang ở trên ruby ​​1.9.x TMail dường như có vấn đề
tôi đang sử dụng mail (https://github.com/mikel/mail)

body = imap.fetch(message_id,'BODY[TEXT]')[0].attr['BODY[TEXT]'] 
msg = imap.fetch(-1,'RFC822')[0].attr['RFC822'] 
mail = Mail.read_from_string msg 

body = mail.body 
from = mail.from 
23

piggybacking off @ câu trả lời Bjer của, đây là một giải pháp hoàn chỉnh bằng cách sử dụng mail đá quý và đá quý gmail_xoauth để đăng nhập vào gmail sử dụng OAuth2 và phân tích tất cả các email:

imap = Net::IMAP.new('imap.gmail.com', 993, usessl = true, certs = nil, verify = false) 
imap.authenticate('XOAUTH2', '[email protected]', 'access_token_goes_here') 
imap.select('INBOX') 
imap.search(['ALL']).each do |message_id| 

    msg = imap.fetch(message_id,'RFC822')[0].attr['RFC822'] 
    mail = Mail.read_from_string msg 

    puts mail.subject 
    puts mail.text_part.body.to_s 
    puts mail.html_part.body.to_s 

end 
+0

Đá quý 'mail' có bất kỳ phụ thuộc nào cho 'xoauth' hay không bởi vì khi tôi theo mã của bạn, nó sẽ phát ra lỗi' loại xác thực không xác định - "XOAUTH2" '. Tôi đang làm 'yêu cầu 'net/imap'' và' yêu cầu mail' trước mã của bạn – Jashwant

+1

ah, vâng, xin lỗi về điều đó. Để sử dụng XOAUTH2 của Google, bạn cần có ['gmail_xoauth'] (https://github.com/nfo/gmail_xoauth) gem – Andrew

+0

Ồ, tôi đã sử dụng plugin đó nhưng sau khi xem bài đăng của bạn, tôi nghĩ rằng plugin tuyệt vời này với quá trình xác thực XOAUTH2, vì vậy hãy loại bỏ điều đó. Tôi đang sử dụng cả hai. 'gmail_xoauth' để xác thực và' mail' để quản lý thư theo cách tốt hơn. Làm việc tốt! – Jashwant