Symfoware

Symfowareについての考察blog

メールの内容をRedmineに転記するプログラムをRubyで作成する

Redmineには、メールからチケットを登録する機能が
標準で実装されています。
メールによるチケットの登録

あえて、自分でメールから転記するプログラムを作ってみたのでメモしておきます。


メールの受信とRedmine API



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

Redmineへの登録はREST API経由で行います。
RubyからREST API経由でRedmineに添付ファイルを登録する(XML,JSON使用)




サンプル



outlook.comで受信したメールをRedmineに転記してみます。
こんな感じのプログラムになりました。


  1. # -*- coding : utf-8 -*-
  2. require 'mail'
  3. require 'net/imap'
  4. require 'net/http'
  5. require 'uri'
  6. require 'json'
  7. USER_ID = 'outlook.comのアカウント名'
  8. PASSWORD = 'outlook.comのパスワード'
  9. API_KEY = 'ea87faaba9549b5fdbea7655bf7de323cd6c118e'
  10. # メールの処理部分
  11. def mail_read
  12.     imap = Net::IMAP.new('imap-mail.outlook.com', 993, true)
  13.     imap.login(USER_ID, PASSWORD)
  14.     imap.select(Net::IMAP.encode_utf7('INBOX/test'))
  15.     # INBOX/testのメールを全検処理
  16.     ids = imap.search(["ALL"])
  17.     
  18.     # メール
  19.     ids.each do |id|
  20.         imap.fetch(id, "RFC822").each do |mail|
  21.             mail_read_one(imap, id, mail)
  22.         end
  23.         
  24.         # 削除フラグを設定
  25.         #imap.store(id, '+FLAGS', [:Deleted])
  26.     end
  27.     # 削除フラグを確定し、メールを削除
  28.     imap.expunge
  29.     imap.disconnect
  30. end
  31. # メール単件の処理
  32. def mail_read_one(imap, id, mail)
  33.     m = Mail.new(mail.attr["RFC822"])
  34.     body = ''
  35.     imgdatas = []
  36.     
  37.     
  38.     # マルチパートなメールかチェック
  39.     if m.multipart? then
  40.         # plantextなメールかチェック
  41.         if m.text_part then
  42.             body = m.text_part.decoded
  43.         # htmlなメールかチェック
  44.         elsif m.html_part then
  45.             body = m.html_part.decoded
  46.         end
  47.         
  48.         # 添付ファイルの処理
  49.         m.attachments.each do |attachment|
  50.             
  51.             # 添付ファイルの保存処理
  52.             token = upload_file(attachment.body.decoded)
  53.         
  54.         # issue登録用のデータを作成
  55.         imgdata = {}
  56.         imgdata['token'] = token
  57.         imgdata['filename'] = attachment.filename
  58.         imgdata['description'] = attachment.filename
  59.         imgdata['content_type'] = attachment.content_type.split(';')[0]
  60.         imgdatas.push(imgdata)
  61.         end
  62.     else
  63.         body = m.body.decoded
  64.     end
  65.     
  66.     # Redmineに登録
  67.     add_issue(m.subject, body, imgdatas)
  68.     
  69. end
  70. # Redmineにファイルを登録
  71. def upload_file(f)
  72.     # URLは「uploads.xml」を指定
  73.     uri = URI.parse("http://192.168.1.102/redmine/uploads.json")
  74.     Net::HTTP.start(uri.host, uri.port) do |http|
  75.     #リクエストインスタンス生成
  76.     request = Net::HTTP::Post.new(uri.path)
  77.     #ヘッダー部
  78.     request.set_content_type("application/octet-stream")
  79.     request["X-Redmine-API-Key"] = API_KEY
  80.     
  81.     #ボディ部
  82.     request.body = f
  83.     
  84.     #送信
  85.     response = http.request(request)
  86.     
  87.     #レスポンスを解析して、tokenを取得
  88.     doc = JSON.parse(response.body)
  89.     return doc['upload']['token']
  90.     end
  91. end
  92. # Redmineにissueを登録
  93. def add_issue(subject, body, imgdatas)
  94.     # 登録用のデータ
  95.     data = {}
  96.     issue = {}
  97.     issue['project_id'] = 'test_project'
  98.     issue['subject'] = subject
  99.     issue['description'] = body
  100.     issue['tracker_id'] = 1
  101.     
  102.     # 添付ファイルの設定
  103.     if imgdatas.length != 0
  104.     issue['uploads'] = imgdatas
  105.     end
  106.     data['issue'] = issue
  107.     # 連想配列からJSONな文字列に変換
  108.     issue_json = JSON.generate(data)
  109.     # APIのURL
  110.     # 今回、RedmineのURLはhttp://192.168.1.102/redmine/
  111.     # サブディレクトリで公開している
  112.     # jsonの場合は、拡張子に「json」を指定
  113.     uri = URI.parse("http://192.168.1.102/redmine/issues.json")
  114.     Net::HTTP.start(uri.host, uri.port) do |http|
  115.     #リクエストインスタンス生成
  116.     request = Net::HTTP::Post.new(uri.path)
  117.     #ヘッダー部
  118.     request.set_content_type("application/json")
  119.     request["X-Redmine-API-Key"] = API_KEY
  120.     
  121.     #ボディ部
  122.     request.body = issue_json
  123.     
  124.     #送信
  125.     response = http.request(request)
  126.     #ret = JSON.parse(response.body)
  127.     #puts ret['errors']
  128.     end
  129. end
  130. if __FILE__ == $0
  131.     mail_read
  132. end





こんなメールを送信しておいて、プログラムを実行します。

381_01.png



ちゃんと取り込めたようです。

381_02.png

関連記事

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

  1. 2014/03/21(金) 16:08:01|
  2. 備忘録
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<FreeBSD 10.0にpkg installでTomcat 7をインストールする | ホーム | RubyからREST API経由でRedmineにコメントを登録する(XML,JSON使用)>>

コメント

コメントの投稿


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

トラックバック

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