zorioの日記 このページをアンテナに追加 RSSフィード

2006-09-25

[]メールからGoogle Calendarに登録するサンプル

この前作ったRuby用のGoogle Calendar APIを使うライブラリ(http://rubyforge.org/projects/gcalapi/)のサンプル。

メールを送るとGoogle Calendarにイベントが登録されるプログラムを作ってみた。

実用性があるかと聞かれると若干疑問だが、ケータイから登録したり出来るとか。

使い方

subjectは「gcal」にする。

本文にyaml形式で内容を書く。こんな感じ。

st: 2006-09-28 11:00
en: 2006-09-28 13:30
title: 要約
desc: 説明文を書く
where: 場所が要るなら場所
allday: false ←終日のイベントの時true。falseなら省略可能

で、送信。

ソース

下記のスクリプトをcronとかで実行する。

require "kconv"
require "yaml"
require "net/pop"
require "googlecalendar/calendar"

POP_SERVER = "your pop server"
POP_PORT = 110
POP_ACCOUNT = "your account"
POP_PASSWORD = "your password"

GCAL_ACCOUNT = "your gmail account"
GCAL_PASSWORD = "your gmail password"
GCAL_FEED = "http://www.google.com/calendar/feeds/XXXXXXXXXXX@group.calendar.google.com/private/full"

TARGET_SUBJECT = "gcal"

class Mail
  attr_accessor :subject, :body
  def initialize(cont)
    self.subject = nil
    self.body = nil
    parse(cont)
  end

  SUBJECT = /^Subject: (.*)$/

  def parse(cont)
    head = true
    bd = []
    cont.each_line do |line|
      if head
        line.chomp!
        if line =~ SUBJECT
          self.subject = $1
        elsif line == ""
          head = false
        end
      else
        bd << line
      end
    end
    self.body = bd.join("")
  end
end

server = GoogleCalendar::Service.new(GCAL_ACCOUNT, GCAL_PASSWORD)
calendar = GoogleCalendar::Calendar.new(server, GCAL_FEED)

def calendar.from_mail(mail)
  event = self.create_event
  yaml = YAML::load(mail.body)
  event.st = Time.parse(yaml["st"].to_s) if yaml.has_key?("st")
  event.en = Time.parse(yaml["en"].to_s) if yaml.has_key?("en")
  event.title = yaml["title"].toutf8 if yaml.has_key?("title")
  event.desc = yaml["desc"].toutf8 if yaml.has_key?("desc")
  event.where = yaml["where"].toutf8 if yaml.has_key?("where")
  event.allday = yaml["allday"] if yaml.has_key?("allday")
  event.save!
end

pop = Net::POP3.APOP(true).new(POP_SERVER, POP_PORT)
pop.start(POP_ACCOUNT, POP_PASSWORD)

if pop.mails.empty? then
  puts 'no mail.'
else
  i = 0
  pop.each_mail do |m|
    mail = Mail.new(m.pop)
    if mail.subject == TARGET_SUBJECT
      calendar.from_mail(mail)
      m.delete
      i += 1
    end
  end
  puts "#{i} mail(s) processed."
end
pop.finish

mogyamogya 2007/09/07 11:24 こんにちは。トラックバックも送りましたが。
このサンプルと、googlecalendarモジュールを使って、もうちょっと実用的なカレンダー登録の仕組みを作りました。
サンプルコード、勝手に流用させていただいていますがご容赦くださいませ。

zoriozorio 2007/09/07 12:20 ご自由にどうぞ。gcalapiの利用者がいる事が分かって嬉しいです。

さしさし 2008/08/11 12:03 はじめまして。すごいのを見つけた!と思って試してみたのですが、
実行時に以下のようなエラーが出てしまいます。

gc.rb:6:in `require’: no such file to load -- googlecalendar/calendar (LoadError)
from gc.rb:6
何か足りないものがあるのでしょうか。おしえていただければ幸いです。

*** LOCAL GEMS ***
gcalapi (0.1.1)
scrapi (1.2.0)
tidy (1.1.2)

mogyamogya 2008/09/06 19:36 さしさんの件。
require ”googlecalendar/calendar”
のところを
require ’rubygems’
require ”googlecalendar/calendar”
とすると通るような気がします。

....と書いてもご本人は気づかないと思うけど^^;

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証