Symfoware

Symfowareについての考察blog

Rubyでメール受信時、本文の文字化けやタイトルが途中で途切れる対策

Rubyのmailライブラリを使って、メールの取得を行ってみました。
Ruby 1.9.3でIMAP4(outlook.com)のメールを受信する

メールの文字コードによっては不具合があったので対策方法をメモ。


本文の文字化け



主にプレーンテキストでiso-2022-jpエンコードの場合に発生する模様。

ruby-gmailでRails3からサクッとgmail受信
こちらを参考に


  1. mail.body.decoded



ではなく


  1. mail.body.decoded.encode("UTF-8", mail.charset)




とすることで解消されました。





タイトルの文字切れ



条件はよくわかっていないのですが、iso-2022-jpで全角スペースが
含まれるタイトルだとメールタイトルが途中までしか取得できないことがありました。



  1. mail.subject



ではなく、


  1. Kconv.toutf8(mail.attr["ENVELOPE"].subject)



こうやって取得すると、タイトルが正しく取得出来ました。





修正版のメール取得ソース



上記の対策を行ったソースが以下になります。


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


関連記事

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

  1. 2014/04/14(月) 21:22:04|
  2. 備忘録
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<SQL Server 2014 Express GUIを使用して、データベースのバックアップ・リストア | ホーム | SQL Server 2014 ExpressにUbuntu + Groovyから接続する>>

コメント

コメントの投稿


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

トラックバック

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