投げ銭

★当サイトへの投げ銭(PayPal)★

LINK


(無償)
logo
世界中で使われるISO標準オフィスソフト(MSオフィス互換)
The Document Foundation Wiki

人気の投稿(1ヶ月間)

Ad

Ad

投げ銭

★当サイトへの投げ銭(PayPal)★

2015年4月30日木曜日

【Postfix 2.6.6 x86_64】transport設定で正規表現を使う場合について【Linux CentOS 6.5 x86_64】

受信メールを他のプログラムなどに処理させるために、トランスポート設定を行った。
処理対象にする受信メールの送信先アドレスを正規表現をつかってフィルタリングした。


■設定方法

(1)トランスポート処理対象メールの送信先アドレス正規表現とその委託先をmaster.cfファイルに記述した。 

委託先として指定した、test:localhost は、後述のpipe処理用サービスである。

[root@test postfix]# vim /etc/postfix/transport
(省略)
/^test-.*\_0.*@example\.domain\.tld$  test:localhost
(省略)

ところで、別のメールサーバにSMTPで転送するには、次のように記述する。
/^test-.*\_0.*@example\.domain\.tld$  smtp:another-sever.tld:25


(2)上で記述したファイルを、main.cf ファイルに登録した。

<注意>
transportファイルの検索を高速にするためのバイナリ化処理は行わない!
正規表現を利用する場合はテキストファイルのまま使用する。
# /usr/sbin/postmap /etc/postfix/transport

[root@test postfix]# vim /etc/postfix/main.cf
(省略)
#コメントアウト#transport_maps = hash:/etc/postfix/transport
transport_maps = regexp:/etc/postfix/transport
test_destination_recipient_limit = 1
(省略)

(3) マスターファイルに、委託先についてに記述した。

argv= には、パイプ先になる標準入力対応のプログラムとその引数を記述する。
user= には、そのプログラムを実行するLinuxユーザー名を記述する。
$sender や、$mailbox などの変数をつかって情報を取得できる。 (他にもある。)

[root@test postfix]# vim /etc/postfix/master.cf
(省略)
test       unix  -       n       n       -       1       pipe
  flags= user=uucp argv=/etc/testscript.sh testarg1 ${sender} ${mailbox} testarg4
(省略)


(参考)
・How can I route some emails to a script in Postfix?
< http://serverfault.com/questions/322657/how-can-i-route-some-emails-to-a-script-in-postfix > 2015年4月30日

・[debian-users:37348] Re: postfixで正規表現ルックアップテーブル
< http://lists.debian.or.jp/debian-users/200306/msg00121.html > 2015年4月30日

2015年4月16日木曜日

【Linux CentOS 6 bash】 変数の前方後方パターンマッチによる部分消去方法、複数行ファイルのforループによる処理方法について【シェルスクリプト】

変数に保存された文字列を切り取る方法
forループが項目として認識するための区切りを改行コードのみにする方法


(処理でつかうデータ)
次のような行が、20150416.txt に保存されているとする。
20150416_1140_xxx xxx xxxx--anonymous-dat000002954
20150416_1216_-xxx-yyy-dat000002971
20150416_1321_--anonymous-dat000002990
20150416_1431_--anonymous-dat000003011
各行のdat以下の文字列は、拡張子(tif)を除いたファイル名である。


(処理内容)
この記録をつかって、ファイルを検索し別ディレクトリにコピーする。
ただし、ファイル名を一部変更する。

たとえば、
cp dat000002954 /home/test/20150416/20150416_1140.dat
と処理されるようにする。


(処理方法)
次のスクリプトを作成し処理を行った。

#!/bin/bash
IFS_orginal=$IFS
IFS=$'\n'

for k in `cat 20150416.txt`
do
cp ${k##*-}.dat /home/test/20150416/${k%_*}.dat
done

IFS=$IFS_orginal


<解説>
`cat 20150416.txt`でファイルから行を先行して取得する。
取得した複数行に対して、for 変数 in をあてがって、1行ずつ取得する。
毎行の処理は、do~done で行う。 (cpコマンドを実行している。)

ところで、このように、for 変数 in によって、1行ずつ取得するために、
項の区切り文字の設定を、IFS=$'\n' として改行コードにした。
(さもなければ、行中にスペースが存在している場合にその前後で分断されて変数に格納されてしまう。)

この各行処理では、変数kによって行内容を取得している。
処理条件のとおり、各行の最後にあるdat以下の文字列を必要としている。
次のような行の場合、
20150416_1140_xxx xxx xxxx--anonymous-dat000002954
変数kから不要な文字列を切り取ったものを使用すればよい。


○前方一致でパターンにマッチした部位を排除する方法
行の最後に現れる「 - 」以前の文字列を除外するためには、次のようにする。
${k##*-}
前方一致系は「#」記号を用いる。文字列の前方から指定パターンを探してそのマッチ部位を除外する。
この例では、dat000002954 を取り出したい。
そのため、行の前方から見て一番最後に現れる「 - 」を探したいので、「##」を用いる。
「*」ワイルドカードを置くことで、この「 - 」以前の文字列がマッチし、それらが排除される。


○後方一致でパターンにマッチした部位を排除
${k%_*}
後方一致系は「%」記号を用いる。文字列の後方から指定パターンを探してそのマッチ部位を除外する。
この例では、20150416_1140 を取り出したい。
そのため、行の後方から見て一番最初に現れる「 _ 」を探したいので、「%」を用いる。
「*」ワイルドカードを置くことで、この「 _ 」までの文字列がマッチし、それらが排除される。



<参考>
・shとbashでの変数内の文字列置換などAdd Star
 < http://d.hatena.ne.jp/ozuma/20130928/1380380390 >
2015年04月16日

・IFSを変更して区切り文字を改行だけにする
 < http://linux.just4fun.biz/%E9%80%86%E5%BC%95%E3%81%8D%E3%82%B7%E3%82%A7%E3%83%AB%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88/%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9%E3%81%8C%E5%90%AB%E3%81%BE%E3%82%8C%E3%82%8B%E6%96%87%E5%AD%97%E5%88%97%E3%82%921%E8%A1%8C%E3%81%A8%E3%81%97%E3%81%A6%E6%89%B1%E3%81%86%E6%96%B9%E6%B3%95.html#y44021bd >
2015年04月16日

投げ銭

★当サイトへの投げ銭(PayPal)★

Ad

Ad