バリケンのRuby日記 RSSフィード

2007-07-08

[] RubySMTPサーバを作る(2)  RubyでSMTPサーバを作る(2) - バリケンのRuby日記 を含むブックマーク はてなブックマーク -  RubyでSMTPサーバを作る(2) - バリケンのRuby日記  RubyでSMTPサーバを作る(2) - バリケンのRuby日記 のブックマークコメント

昨日の続きだよ。今度はテキストファイルにどんどん書き溜めるんじゃなくて、ActiveRecordを使ってデータベースにどんどん書き込むようにしてみたよ。まずはデータベースの作成から。SQLite3はあらかじめセットアップしておいてね。WindowsでのインストールLinuxでのインストールを以前に書いたから参考にしてね。

require 'rubygems'
require 'active_record'

config = {
  :adapter => 'sqlite3',
  :dbfile  => 'mail_db.db'
}

ActiveRecord::Base.establish_connection(config)

class InitialSchema < ActiveRecord::Migration
  def self.up
    create_table :mails do |t|
      t.column :sender, :string, :null => false
      t.column :recipients, :string, :null => false
      t.column :data, :text, :null => false
      t.column :created_at, :datetime, :null => false
    end
  end

  def self.down
    drop_table :mails
  end
end

InitialSchema.migrate(:up)

次はメールサーバスクリプト

require 'rubygems'
require 'active_record'

config = {
  :adapter => 'sqlite3',
  :dbfile  => 'mail_db.db'
}

ActiveRecord::Base.establish_connection(config)

class Mail < ActiveRecord::Base
end

require 'smtpserver'

config = {
  :Port => 25,
  :ServerName => 'myhostname',
  :RequestTimeout => 120,
  :LineLengthLimit => 1024
}

config[:DataHook] = lambda do |mail, sender, recipients|
  envelope = {
    :sender        => sender,
    :recipients    => recipients.join(', '),
    :data          => mail
  }

  Mail.create(envelope)
end

server = SMTPServer.new(config)

[:INT, :TERM].each do |signal|
  Signal.trap(signal) { server.shutdown }
end

server.start

こうしてデータベースに保存しておけば、あとからRuby on Railsとかでメールを簡単に参照できるよ。

自分でWebメールを作ったり、メールで書き込む掲示板ブログなんかにも応用ができて、夢が広がるねえ。

トラックバック - http://rubyist.g.hatena.ne.jp/muscovyduck/20070708