読者です 読者をやめる 読者になる 読者になる

Gmailからスケジュールを管理するメイドちゃんをRubyでつくった

+++++++++++++++++++++++++++++++++++++++++++++++
2012-07-10 続・メイドちゃんに改良版があります。
+++++++++++++++++++++++++++++++++++++++++++++++

■ さくら壮のペットな彼女 に触発されました。
上記のライトノベルに、メール自動返信AIというのが出てくるのです。
その名も メイドちゃん。
龍之介(開発者)宛てのメールに好き勝手返信するAIプログラムなのです。

なんか楽しそうなので、摸倣してみることに。
しかし、メール返信をAIに任せるのは怖すぎるので、別の機能をさせてみよう。
今回はローカルで動けばいいからRuby使おう。

そんなわけで スケジュール管理メイドちゃん ができました。


■ 機能はこんな感じ
携帯から予定メモをGmailに送信する
    ↓
Rubyプログラム起動 (朝に自動実行するよう設定しておく)
    ↓
メイドちゃんが、「今日の予定はこれですよ」 と携帯にメールしてくれる。

普段から予定をメモしている人向けですね。
うまく使えば、定期券の更新とか本の返却とかのうっかり忘れが格段に減るのではないかと。


■ プログラムを使う前準備は
・予定メモメールを[Work]に割り振るよう事前にフィルタをかける。
・Gmailにメールを送信する。
 形式はこんな感じで
   [件名](予定日) [半角スペース] (予定内容)
   [本文](予定についての詳細)←なくても可

 つまり
   [件名]0613 研究室紹介
   [本文]16:20から
 みたいに書くとバッチシ認識してくれます。


■ プログラムの流れは、
・gmailログイン
   ↓
・Workフォルダの未読メールを調べる。
   ↓
・今日の分のタスクがあれば、内容をストックして、メールは既読に。
   ↓
・今日の分のタスクがあれば、メール送信!

といった感じ。
あっさりしてますね。


■ ソースコードはこんな感じ

#coding: utf-8

require 'gmail'
require 'kconv'
day = Time.now

#gmailにログイン
USERNAME='gmailid@gmail.com' #gmailのアドレス
PASSWORD='gmailpass' #gmailのパスワード
gmail = Gmail.new(USERNAME,PASSWORD)

#メールを送信するかしないかのフラグ
mailFlag = 0
#本文ストック用String
fullSchedule = ""

#Workフォルダ内の未読を調べる
mail =  gmail.mailbox('Work').emails(:unread).map do |mail|
  #件名があるときだけ内容を読み込む
  if mail.subject != nil 
    schedule = Kconv.toutf8(mail.subject)
    today = day.strftime("%m%d")
    
    #今日のタスクがある
    if /^#{today}/ =~ schedule
      mailFlag += 1
      schedule = schedule.sub(/^#{today}\s/,'')
      schedule = schedule.sub(/\s/,"\n") #複数のタスクを分ける
      fullSchedule += "" + schedule + "\n"
      
      #本文処理⇒備考として
      if !mail.text_part && !mail.html_part
        if mail.body.decoded.encode("UTF-8", mail.charset)  != ""
          fullSchedule += " (" + mail.body.decoded.encode("UTF-8", mail.charset) + ")\n"
        end
      elsif mail.text_part
        fullSchedule += " (" + mail.text_part.decoded + ")\n"
      elsif mail.html_part
        fullSchedule += " (" + mail.html_part.decoded + ")\n"
      end
      
      next
    end
    mail.mark(:unread) #使わなかったメールを未読に
  end
  #mail.mark(:unread) #読み込んだメールをすべて未読に
end

# 今日の予定があるならメール送信
if mailFlag > 0
#メールヘッダ
maid_tyan_messageFirst = <<EOS
おはようございます!

EOS
maid_tyan_messageFirst += "今日("+ day.strftime("%m月%d日") + ")のご予定をお知らせします。\n"
#メールフッタ
maid_tyan_messageLast = <<EOS

それでは 今日も頑張ってください♪
EOS

#メールを送信
sendTo = "address@docomo.ne.jp" #送信先アドレス
sendSub = "メイドちゃんより"
sendText = maid_tyan_messageFirst + fullSchedule + maid_tyan_messageLast
  
  gmail.deliver do
    to sendTo
    subject sendSub
    body sendText
  end

end

Gmailを使えるようにするため、cmdで ↓ をしてやってください。

> gem install ruby-gmail



そして、実行すると

おはようございます!

今日(06月14日)のご予定をお知らせします。
・たとえばそんな予定
 (おもむろな補足やおおざっぱな備考)
・もふもふした予定
・混沌とした予定
 (いつもニコニコあなたの隣に這いよる感じの)

それでは 今日も頑張ってください♪

みたいなメールが届きます。



■ とりあえず完成です。
ですが、もっといろんなことができるようにさせたいですね。
メイドちゃんの挨拶をランダム生成したりとか、
天気予報と連動させたりとか、(「今日は傘要りますよ」的な)
Googleカレンダーから予定を引っ張ってきたりとか。
いろいろ遊べそうですね。