mk-mode BLOG

このブログは自作の自宅サーバに構築した Debian GNU/Linux で運用しています。
PC・サーバ構築等の話題を中心に公開しております。(クローンサイト: GitHub Pages

ブログ開設日2009-01-05
サーバ連続稼働時間
Reading...
Page View 合計
Reading...
今日
Reading...
昨日
Reading...

Linux & Ruby - メール受信時の処理!

[ サーバ構築, プログラミング ] [ Dovecot, Linux, Postfix, Ruby ]

こんばんは。

Linux 上に構築したメールサーバで、メール受信をトリガにして処理を実行する手順等についての記録です。
処理は Ruby で行うことを想定しています。(多くのサイト等では Perl や PHP での処理がよく紹介されてます)

0. 前提条件

1. Ruby スクリプトの作成

以下のような Ruby スクリプトを作成する。
(紹介用に受信したメールを解析してテキストファイルに保存するだけのプログラム)

get_mail.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#! /usr/local/bin/ruby
# coding: utf-8
#-------------------------------------------------
# Ruby script to get a mail via alias of postfix.
#-------------------------------------------------
require 'mail'

class GetMail
  def initialize
    dt = Time.now.strftime("%Y%m%d_%H%M%S%L")
    @out_file = "/path/to/#{dt}.txt"
  end

  def execute
    open(@out_file, "w") do |f|
      mail = Mail.new($stdin.read)
      f.puts "From:    #{mail.from.first}"
      f.puts "To:      #{mail.to.first}"
      f.puts "Date:    #{mail.date}"
      f.puts "Subject: #{mail.subject}"
      f.puts "Body:\n#{mail.body.decoded.encode("UTF-8", mail.charset)}"
    end
  rescue => e
    $stderr.puts "[#{e.class}] #{e.message}"
    e.backtrace.each{|trace| $stderr.puts "\t#{trace}"}
    exit 1
  end
end

exit unless $0 == __FILE__
GetMail.new.execute

2. Ruby スクリプトの配置

作成した Ruby スクリプトをサーバ上の適当な位置に配置する。
(今回、当方は処理を行いたいユーザの home ディレクトリ “/home/test” 直下に配置した(所有者 “test” で))

配置後、実行権限を付与する。

1
# chmod +x get_mail.rb

3. メール保存用ディレクトリの作成

今回の処理で使用するディレクトリをサーバ上の適当な位置に作成する。
(今回、当方は処理を行いたいユーザの home ディレクトリ “/home/test” 配下に “get_mail” ディレクトリを作成した(所有者 “test” で))

4. Postfix の aliases 設定

/etc/aliases
1
test:  :include:/home/test/alias_inc

ちなみに、処理を行う他に転送も行いたい場合は、以下のようにカンマで区切ればよい。

/etc/aliases
1
test:  hoge, :include:/home/test/alias_inc

5. include ファイル(実行コマンド)の作成

/home/test/alias_inc
1
"| /home/test/get_mail.rb"

そして、このファイルの所有者が “test” でなければ “test” にする。

1
# chown test. /home/test/alias_inc

6. Postfix 設定ファイル main.cf の編集

“/etc/aliases” ファイル内で :include: を使用する際は、Postfix の設定ファイル “main.cf” に以下のように追記しなければならない。
(Postfix は、デフォルトでは :include: での “|command” への配送を認めていないため)

/etc/postfix/main.cf
1
allow_mail_to_commands = alias,forward,include

7. Postfix 設定のリロード

1
# systemctl reload postfix

8. aliases の設定反映

1
# newaliases

9. 動作確認

実際に test ユーザ宛にメールを送信してみて、指定のディレクトリ配下に保存されること、内容が適切であることを確認する。

10. その他

上記の 4, 5, 6 でエイリアスを別ファイルに分けてインクルードしている。
これは、"/etc/aliases" 内で直接コマンドを指定すると作成されるファイルの所有者・グループが “nobody:nogroup” になってしまうのを防ぐためである。

11. 参考サイト


当方は、Linux サーバに Twitter ツイート専用のユーザを作成し、そのユーザ宛に配送されたメール本文をツイートするように応用しています。

以上。

Comments