Symfoware

Symfowareについての考察blog

Ruby 1.9.3でIMAP4(outlook.com)のメールを受信する

Rubyでメール送信を試してみました。
Ruby + gem mailでメール送信時、「post_connection_check」「Non US-ASCII detected 」

今度は受信を試してみます。



本文の文字化けや、タイトルが途中までしか取得できない場合はこちら。
Rubyでメール受信時、本文の文字化けやタイトルが途中で途切れる対策




メールサーバー



outlook.comのメールを受信してみます。

接続するサーバーは「imap-mail.outlook.com」
ポート番号は「993」です。

「test」というフォルダを作成し、その中のメールを全部読み込んでみます。





簡単なサンプル



Ruby初心者が試行錯誤して書いたプログラムがこれ。

受信トレイの「test」フォルダにあるメールを取得するので、指定は
「INBOX/test」となります。

アルファベットだけなら問題ないのですが、IMPA4の一応フォルダ名はutf-7で
作成されるので、エンコードしておきます。


  1. # -*- coding : utf-8 -*-
  2. require 'mail'
  3. require 'net/imap'
  4. userid = 'outlook.comのメールアドレス'
  5. password = 'パスワード'
  6. imap = Net::IMAP.new('imap-mail.outlook.com', 993, true)
  7. imap.login(userid, password)
  8. imap.select(Net::IMAP.encode_utf7('INBOX/test'))
  9. ids = imap.search(["ALL"])
  10. imap.fetch(ids, "RFC822").each do |mail|
  11.     m = Mail.new(mail.attr["RFC822"])
  12.     puts '件名:' + m.subject
  13.     puts '本文:' + m.body.decoded
  14. end




testフォルダにメールを保存しておきます。

377_01.png


プログラムを実行すると、ちゃんとメールの内容が表示されました。


# ruby sample.rb
件名:テストメール
本文:テストメールの本文です。








添付ファイルの取得



メールの添付ファイルを取得してみます。
添付ファイル付きのメールはマルチパートとなるので、プログラムの修正が必要です。


  1. # -*- coding : utf-8 -*-
  2. require 'mail'
  3. require 'net/imap'
  4. userid = 'outlook.comのメールアドレス'
  5. password = 'パスワード'
  6. imap = Net::IMAP.new('imap-mail.outlook.com', 993, true)
  7. imap.login(userid, password)
  8. imap.select(Net::IMAP.encode_utf7('INBOX/test'))
  9. ids = imap.search(["ALL"])
  10. imap.fetch(ids, "RFC822").each do |mail|
  11.     m = Mail.new(mail.attr["RFC822"])
  12.     body = ''
  13.     
  14.     # マルチパートなメールかチェック
  15.     if m.multipart? then
  16.     # plantextなメールかチェック
  17.         if m.text_part then
  18.             body = m.text_part.decoded
  19.         
  20.     # htmlなメールかチェック
  21.         elsif m.html_part then
  22.             body = m.html_part.decoded
  23.         end
  24.         
  25.     # 添付ファイルの処理
  26.         m.attachments.each do |attachment|
  27.         # 添付ファイルの種類とファイル名
  28.             puts attachment.content_type
  29.             puts attachment.filename
  30.             
  31.         # 添付ファイルの保存処理
  32.             filename = attachment.filename
  33.             begin
  34.                 File.open(filename, "w+b") {|f| f.write attachment.body.decoded}
  35.             rescue => e
  36.                 puts "添付ファイルの保存に失敗 #{e.message}"
  37.             end
  38.         end
  39.     else
  40.         body = m.body.decoded
  41.     end
  42.     puts '件名:' + m.subject
  43.     puts '本文:' + body
  44. end




こんなメールを送信しておきました。

377_02.png



実行してみると、ちゃんと添付ファイルが保存されました。


# ruby sample.rb
image/jpeg; name=Lenna.jpg
Lenna.jpg
件名:添付ファイル付きメールのテスト
本文:メール本文








メールの削除



メールを削除してみます。

imap.search(["ALL"])
で、UIDのsetが帰ってくるので、そのUIDを使用してメール削除を実行します。


  1. # -*- coding : utf-8 -*-
  2. require 'mail'
  3. require 'net/imap'
  4. userid = 'outlook.comのメールアドレス'
  5. password = 'パスワード'
  6. imap = Net::IMAP.new('imap-mail.outlook.com', 993, true)
  7. imap.login(userid, password)
  8. imap.select(Net::IMAP.encode_utf7('INBOX/test'))
  9. ids = imap.search(["ALL"])
  10. ids.each do |id|
  11.     imap.fetch(id, "RFC822").each do |mail|
  12.     m = Mail.new(mail.attr["RFC822"])
  13.     body = ''
  14.     
  15.     # マルチパートなメールかチェック
  16.     if m.multipart? then
  17.         # plantextなメールかチェック
  18.         if m.text_part then
  19.         body = m.text_part.decoded
  20.         
  21.         # htmlなメールかチェック
  22.         elsif m.html_part then
  23.         body = m.html_part.decoded
  24.         end
  25.         
  26.         # 添付ファイルの処理
  27.         m.attachments.each do |attachment|
  28.         # 添付ファイルの種類とファイル名
  29.         puts attachment.content_type
  30.         puts attachment.filename
  31.         
  32.         # 添付ファイルの保存処理
  33.         filename = attachment.filename
  34.         begin
  35.             File.open(filename, "w+b") {|f| f.write attachment.body.decoded}
  36.         rescue => e
  37.             puts "添付ファイルの保存に失敗 #{e.message}"
  38.         end
  39.         end
  40.     else
  41.         body = m.body.decoded
  42.     end
  43.     puts '件名:' + m.subject
  44.     puts '本文:' + body
  45.     
  46.     # 削除フラグを設定
  47.     imap.store(id, '+FLAGS', [:Deleted])
  48.     
  49.     
  50.     end
  51. end
  52. # 削除フラグを確定し、メールを削除
  53. imap.expunge
  54. imap.disconnect







【参考URL】

IMAPをRubyで読みだして、Mailオブジェクトに格納する

関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2014/03/20(木) 18:48:34|
  2. 備忘録
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<RubyからREST API経由でRedmineにチケットを登録する(XML,JSON使用) | ホーム | Rubyでcertificate verify failed (OpenSSL::SSL::SSLError)エラーの対処法>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1357-19b1a601
この記事にトラックバックする(FC2ブログユーザー)