Linuxの最近のブログ記事

久々の更新。

最近、WordPressのindexを自分のドメインのトップページに設定している人が増えてきている模様?

そういった場合、管理者は、WordPressの構成ファイルをドキュメントルート直下に展開するか、ドキュメントルート直下の.htaccess処理で、WordPressの本体ディレクトリ内のindex.phpにリダイレクトさせる。
もしくは、apacheの設定自体を変えて、ワードプレスの本体ディレクトリ自体をドキュメントルートにしちゃう、
主流はこの3つくらいだろうか。


先日MilkyStepの初期設定代行を行おうと思い、VPSのコンパネにアクセスしようと思ったら、いきなりワードプレスのスキンで404エラーが発生。

ドキュメントルート直下の.htaccessをのぞいてみると、どうやらお客さんの方で追記したと思われる、下記のようなRewriteRuleを発見。

# BEGIN WordPress

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress


ふうむ。
どうやら最近はこういうのが流行っているのだろうか?

上記の設定だと、下位のファイルを指定せずトップページにアクセスすると、同列に置いてある「index,php」の制御により、ワードプレスのトップが表示される。
下位(ワードプレスディレクトリ内)の実在するファイルにアクセスすれば見れるが、実在しなければ「ありませんよ!」というメッセージ(多分ワードプレスの制御)が出る模様。

基本的に、RewriteRuleに書かれた以外のコンテンツ(またはそのエイリアス)が存在しない場合、
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
により、その下の
RewriteRule . /index.php [L]
が実行される。

ただし、ここで、
RewriteRule . /index.php [L]
となっている。
左辺を見ると、「.」となっているので、「.」(任意の一文字)が合致する名前のコンテンツは、基本的に「すべて」ということになる。

したがって、
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
は、基本的にははすべて「偽」となるため、
RewriteRule . /index.php [L]
の処理が実行されないことになる。
(それと、右辺は「/index.php」ではなく「index.php」ではなかろうか?)

とまあ、こう考えれば、WordPressディレクトリの外のコンテンツにアクセスするにも問題なさそうなのだが、なぜか(ワードプレス内のコンテンツが無いという)404となる。

多分、それ以前の大元のapacheのルールで、インデックスの指定のルールとかがごっちゃになって、こういう結果的にこうなっている思われる。

根本的な原因を探すのも面倒だし、もともと書いてあったRewriteRuleを消したりなんかすると、さらに被害が増えそうだ。

したがって、なるべく既存のコンテンツにあたりさわりなく行う対策としては、アクセスしたい同階層のディレクトリ名が指定された場合は、上記のRewriteRuleが適用されないようにするのが得策と考えた。

# BEGIN WordPress

RewriteEngine On
RewriteBase /

# Add -------
RewriteRule ^ControlPanel/* - [L]
RewriteRule ^mysqladmin/* - [L]
RewriteRule ^ms/* - [L]
# ------- Add

RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]


# END WordPress

これで、ControlPanel、mysqladmin、ms という名前のディレクトリには、
http://domain.com/ControlPanel/......
http://domain.com/mysqladmin/......
http://domain.com/ms/......
というURLでそのコンテンツにアクセスできる。

以上。
事業所の移転に伴って、フレッツ光の契約タイプを変更しなくてはいけなかったため、必然的に貸与されるルータも、PR200NEからPR400NE(一応最新版らしい)に変更することになった。

ついでにプロバイダもbiglobeをやめてインターリンクの固定IP付のもっと安いサービスに乗り換えた。

しかし、ルータが変わってから、LAN内ホストの名前解決(正引き)ができなくなってしまった。

うちの場合はLAN内のPCからLAN内のサーバにアクセスするとき、内部DNSを構築しているので、ルータの静的NATとサーバ側のファイアウォールを許可すれば、LAN内からでも「ホスト名+ドメイン名」でアクセスできるはず。

というか、ルータが変わる前は普通にできていた。

もちろん、「http://192.168.*.*/:80」とかやれば、当たり前だが普通にWEBサーバにつないでくれる。


ルータのソフトのファームウェアバージョンも前と変わってないし、設定も前とすべて同じにしてあるのに、なぜかLAN内のホストへ正引きできない。

仕方が無いので、現在はルータの設定で、DNSの問合せ先をすべて192.168.1.4(LAN内のDNSサーバ)に指定している。
こうするとちゃんと正引きしてくれるが、WAN側のホストにアクセスするときも、いちいち内部のDNSサーバに問合せに行くので、名前解決の時間が3秒くらいかかってイライラする。

確か、前は、ルータのDNS問合せ先を「自動的に取得する」にしておけば、WAN側・LAN側を勝手に判別してWAN側だったらプロバイダのDNSに問合せに行ってくれたと思ったのだが・・・

ルータ設定画面のメニューで、今まで使ったことがなかった「ローカルドメイン設定」というメニューがあるが、これにローカルドメインを登録しようとしても、バグってるぽくて有効にならない。

他に移転に伴って変わったことと言えば、プロバイダが変わったことだが、この現象はインターリンクに切り替える前からおこっていた現象なので、やはり怪しいのはルータということになる。


以下、私がNTT東日本に問い合わせたメールの内容。

この後、一応連絡が来て、結局他の部署のなんちゃらというところに問い合わせてみてください、といった無責任な対応だったので、めんどくさくてそのままにしている。

もし、同じような現象にある人は、下記の文面をそのままコピペして問合せ用に使っちゃってください。

もしくは、「お前の考え方が間違っている。ルータのせいではない。」という見識をお持ちの方は、ぜひぜひ解決策を教えていただけると嬉しいです。

----------------------------------------------------------------------------------------------
先日引越しを行った際に、弊社からの案内でルータをPR-200NEからPR-400NE(無線LANカード付き)に変更しました。

当方ではLAN内にサーバを構築しており、インターリンクというISPの固定IPアドレスによりWEBも公開しておりますが、LAN内のクライアントPCからLAN内のサーバにホスト名でアクセスする際に支障が出ております。

この場合、何も対策していない場合は、通常はLAN内のホストにホスト名+ドメインでアクセスすることはできませんが、その回避策として内部DNSを設置しており、引っ越し前(PR-200NE)までは正常に問合せ、閲覧ができていました。

ルータのソフトウェア(最新ファームウェアバージョンは1.11)の設定も、基本的に引っ越し前とすべて同じにしています。
静的NATの設定なども全て同じで、外部から当サーバへの各種アクセスは問題ありません。

「詳細設定」→「DNS設定」の「LAN側DNSサーバアドレス」に、当方の内部DNSアドレス(192.168.1.4)を指定しており、この設定が、LAN内ホストの名前解決をする際に使用されるDNSアドレスと認識しております。
この認識が間違っていれば申し訳ありません。

この認識から行くと、通常使用する接続設定(「基本設定」→「接続先設定→「現在利用中の接続名」」)において、「DNSサーバアドレス」で「サーバから割り当てられたアドレス」を「使用する」にしておいても、LAN内ホストにホスト名で接続するときは、上述した内部DNS(192.168.1.4)に問合せに行かなくてはならないはずなのに、そうならずに、「このページは表示できません」となります。
逆に、上記の「サーバから割り当てられたアドレス」を使用せず、問合せるDNSを強制的に内部のDNS(192.168.1.4)に指定すれば、当たり前ですがアクセスできます。
つまり、内部DNSの正引きは正しく動作していることになり、ルータのDNS問合せ先の判別がうまくいっていないのではないか、ということです。

以上よろしくお願いたします。

----------------------------------------------------------------------------------------------


MilkyStepのコミュニティでコアサーバを使ったとき、メルマガのデフォルト登録完了画面が文字化けする(日本語部分が???になる)との報告を受け、一時期かなり調査を行ったが解決せず。
それから約2カ月後、他のユーザから同様の現象が報告された。

開発環境では全くそのような現象が起こらないので、仕方なく、コアサーバーを実際に借りてMilkyStepを設置し徹底的に調査することにした。

表示させるデフォルト画面のHTMLソースは、ユーザが自由に編集できるようになっているのだが、そのソースはMySQLに保存される。

そこからデータを引っ張って、少し置換処理してからプログラムで出力する。

確かにコアサーバで実際に試してみると、5回中4回くらいの割合で日本語が「?」になる。
(成功する場合もある)

MySQLの文字セットはutf8、照合順序もutf8_general_ci、さらにSQL発行時に毎回「SET NAMES utf8」(MySQL4.1以降で有効)しているので、データ通信間で化けるとは考えにくい。
もちろんスクリプトのファイルもUTF8。

とりあえず、ブラウザの文字コードの誤判定臭いので、日本語を多めに入れたり、EUCでいうところの「美乳テーブル」である、郵便くんマーク(〠←これ)を冒頭に入れたりしてみたが、変わらず。

次に、Perlでutf8扱う時によくある、utf8フラグあるなしの問題かとも思い、「use utf8」したりEncode::encode/decodeしたりいろいろやったが、どうやら関係ないっぽい。

というか、なんかMySQLから参照した時点ですでに化けてるっぽい。

試しに、SELECT時に、以下のような感じで、明示的に照合順序を指定してみる。

まず、
--------------------------------------------------------------------------------
SELECT column_name COLLATE utf8_general_ci FROM ・・・・・
--------------------------------------------------------------------------------

・・・変化なし。

次に、
--------------------------------------------------------------------------------
SELECT COERCIBILITY(column_name COLLATE utf8_general_ci) FROM ・・・
--------------------------------------------------------------------------------

お、1回目はうまくいった。
もう1回。

--------------------------------------------------------------------------------
Software error:

COLLATION 'utf8' is not valid for CHARACTER SET 'latin1_swedish_ci' at ......
--------------------------------------------------------------------------------

あれあれ????

「utf8_general_ciでの照合はCHARACTER SET 'latin1'では有効ではありません」

latin1??なんで勝手に文字セット変わってんだよ!
utf8で固定だろーが!

なぜ、コアサーバだけ、しかも特定のカラムの文字列だけ参照するときにこうなるのか・・・

MySQL4から5に強引に移行した時の忘れものか?


とにかくこの、参照時に勝手にテーブルの文字コードをLatin1と判別するわけのわからない現象と格闘すること数時間。

そもそもこの処理って、forkした後の親プロセスの中でやっていたんだが、このforkを切ったらなぜか正常になった。
ということで、この処理はforkの中から外に出すことに決定。

いまだに原因はよくわからないが、fork時は内部的に変数を子プロセスにコピーするが、その時点で(コアサーバでは)なんか問題があるらしいってことはぼんやりわかった。

サーバサイドのアプリを広く対応するのはやっぱ一苦労だな・・・

備忘録です。

あるqmailのメールサーバに、標準時補正パッチ(qmail-date-localtime.patch)を当てるのを忘れていてたので、パッチを当てて再インストールしたところ、このエラーが発生。
(qmailのパッチ宛て、インストール方法などの解説はこちら http://www.igreks.jp/dev/2011/01/qmailvpopmailqmailadmin.html

・内部⇒内部はOK
・内部⇒外部もOK
・外部⇒内部のみNGでメールが送れない。

つまり外部ホストのアドレスからのみ、このqmailをインストールしたサーバのアドレスにメールが送れない。

メーラーで送信する際の、よくあるリレーエラーではなく、一旦送信した後、mailer-daemonさんからエラーが返ってきて、

--------------------------------------------------------------------------------------

This is the mail system at host sv313.xserver.jp.

I'm sorry to have to inform you that your message could not
be delivered to one or more recipients. It's attached below.

For further assistance, please send mail to

If you do so, please include this problem report. You can
delete your own text from the attached returned message.

The mail system

<*****@hoge.com>: host mail.hoge.com[xxx.xxx.xxx.xxx] said: 553
sorry, that domain isn't in my list of allowed rcpthosts (#5.7.1) (in reply
to RCPT TO command)

--------------------------------------------------------------------------------------

と、怒られる。

最初、送信する側の外部ホスト(上記で行くとエックスサーバ)がおかしいのかと思いきや、他のYahooメールやGmailからでもダメ。

確認したところ、tcp.smtpファイルも、DNS設定も問題なし。


というわけで、メールに書いてある、rcpthostsを見てみたら、以下のようになっていた。

-------------------------------------------------------------------------------------
***.hoge.com
localhost
-------------------------------------------------------------------------------------
※「***」の部分は、このサーバのホスト名


あ、そうだ。
以前、最初にqmailインストールしたときに、すでにqmailが稼働しているサーバの設定を真似してたんだった。

真似したサーバのrcpthostsを見てみると、上記の他に、「aaa.jp」(ホスト名無しのドメインのみ)が追記されている。

なるほど、上記だけでは、「user@***.hoge.com」ならOKだが、「user@hoge.com」ではNGになるわけだ。
再インストールしたから、これが初期化されちゃったのね。

というわけで、rcpthostsを訂正。

-------------------------------------------------------------------------------------
# vi /var/qmail/control/rcpthosts

(以下を追記。念のため3つほど)

hoge.com
.hoge.com
mail.hoge.com

# :wq (保存して終了)
-------------------------------------------------------------------------------------

webminからだったら、左のメニューから、

「サーバ」
 ↓
「Qmail Mail Server」
 ↓
「Accepted Domains(rcpthosts)」
 ↓
上記のドメインを追記し保存


最後にqmailを再起動して終了。


無事、送信できるようになりました。
よかったよかった。
centOSですでに稼働中のqmailにdomainkeysを適用させる方法まとめ(送信側)

# cd /usr/local/src

■関連ファイルのダウンロード
# wget http://sourceforge.net/projects/domainkeys/files/libdomainkeys/0.69/libdomainkeys-0.69.tar.gz/download
# wget http://www.qmail.org/qmail-1.03-dk-0.54.patch
# wget http://jeremy.kister.net/code/qmail-dk-0.54-auth.patch

■tarファイル展開
# tar -zxvf libdomainkeys-0.69.tar.gz
# cd libdomainkeys-0.69

■エラー対策
# vi dns.lib
下記を記述し保存
----------------------------
-lresolv
----------------------------
# make
# cd ../

■次に、qmail-1.03の中で、qmail-dkファイルを作るのだが、ここで、以前qmail本体をインストールしたときに使った「qmail-1.03」ディレクトリを使うと上手くいかない場合がある。
既存の「qmail-1.03」ディレクトリは削除し、新しいqmail-1.03をダウンロードするか、以前使ったtarボールがあればそれを新たに解凍して使う。

# rm -rf qmail-1.03
# tar -xvzf qmail-1.03.tar.gz

■ここで、qmail.cに以下の記述があるか見ておく。
# vi qmail-1.03/qmail.c
--------------------------------------------------------------------------------
static void setup_qqargs()
{
if(!binqqargs[0])
binqqargs[0] = env_get("QMAILQUEUE");
if(!binqqargs[0])
binqqargs[0] = "bin/qmail-queue";
}
--------------------------------------------------------------------------------
■これが無いと、環境変数「QMAILQUEUE」が使えないので、専用のパッチををダウンロードしてあてておく。ある場合はそのままでOK。
# wget http://qmail.jms1.net/patches/qmailqueue.patch
# patch -d qmail-1.03 < qmailqueue.patch


■その他必要なパッチあて
echo 'gcc -02 -include /usr/include/errno.h' > qmail-1.03/conf-cc
# patch -d qmail-1.03 < qmail-1.03-dk-0.54.patch
# patch -d qmail-1.03 < qmail-dk-0.54-auth.patch

■次にqmail-dkを生成するが、libdomainkeysのヘッダファイルが参照できない場合があるようなので、専用のディレクトリ空間を作成し、そこで行うようにする。

# mkdir test
# cp -Rpf qmail-1.03 test
# cp -Rpf libdomainkeys-0.69/* test/
# cd test/qmail-1.03
# make qmail-dk

■上記が成功すれば、test/qmail-1.03 の中に「qmail-dk」ファイルが生成される。

※qmailqueueのパッチを当てた場合はqmailを停止し、再度、
# make clean
# make setup check
しておく。

■キュー処理ディレクトリにqmail-dkコピー&所有者変更
# cp qmail-dk /var/qmail/bin/
# cp qmail-dk.8 /var/qmail/man/man8/
# chown qmailq /var/qmail/bin/qmail-dk
# chmod 4711 /var/qmail/bin/qmail-dk


■署名用の鍵ファイル作成
# mkdir -p /etc/domainkeys
# mkdir -p /etc/domainkeys/example.com
# cd /etc/domainkeys/example.com
# openssl genrsa -out rsa.private 768
# openssl rsa -in rsa.private -out rsa.public -pubout -outform PEM
# mv rsa.private default
# chown -Rf qmailq /etc/domainkeys
# chmod 0600 default
# grep -v ^- rsa.public | perl -e 'while(<>){chop;$l.=$_;}print "t=y; p=$l;\n";'
↑で表示された、文字列をコピーしておく

■vpopmailのsmtpルールを編集
# cd /home/vpopmail/etc
# vi tcp.smtp
以下の例ように修正
-------------------------------------------------------------------------------------------------------------
192.168.:allow,RELAYCLIENT="",DKSIGN="/etc/domainkeys/example.com/default",QMAILQUEUE="bin/qmail-dk"

:allow,DKVERIFY="DEGIJKfh",QMAILQUEUE="bin/qmail-dk"
-------------------------------------------------------------------------------------------------------------
■CDB化
# tcprules tcp.smtp.cdb tcp.smtp.tmp < tcp.smtp


■POPbeforeSMTPなどを利用し、ローカルのメーラからも配信している場合は、/home/vpopmail/etc/open-smtpなどで、qmail-dkを指定できるよう変更しておく。

# cd /usr/local/src/vpopmail-5.4.32 (←以前に本体インストール時に使った残り。なければダウンロードし解凍しておく)
# vi vpopmail.c
下記の個所を修正。
-------------------------------------------------------------------------------------------------------------

fprintf( fs_tmp_file, "%s:allow,RELAYCLIENT=\"\",RBLSMTPD=\"\"t%d\n",

fprintf( fs_tmp_file, "%s:allow,RELAYCLIENT=\"\",RBLSMTPD=\"\",DKSIGN=\"/etc/domainkeys/example.com/default\",QMAILQUEUE=\"bin/qmail-dk\"\t%d\n",

-------------------------------------------------------------------------------------------------------------
qmailを停止し
# make clean、
# make
# make install


■DNSのレコードに以下を追加
-------------------------------------------------------------------------------------------------------------
_domainkey.example.com. IN TXT "k=rsa; t=y; o=~;"
default._domainkey.example.com. IN TXT "コピーしておいた文字列"
-------------------------------------------------------------------------------------------------------------
※コピーしておいた文字列⇒「t=y; p=*********;」

■DNSサーバ(BIND)の再起動

■qmailの(再)起動
# /etc/init.d/qmail stop
# /etc/init.d/qmail start

■gmailやyahooメールにメールを送って、受信したメールのヘッダに、
--------------------------------------------------------------------------------------------
DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws;
s=default; d=example.com;
b=公開鍵;
--------------------------------------------------------------------------------------------
などの記述があればOK。


参考資料:
http://jeremy.kister.net/howto/dk.html
http://blog.cles.jp/item/1778
http://www.4web8.com/644.html
http://blog.guideme.jp/archives/106
http://www.weloveya.com/oshigoto/qMail2.html


■余談

同一LAN内、同一ドメインで、負荷分散のため、複数のSMTPサーバから配信する場合は、そのSMTPサーバの分だけDNSにレコードを登録するが必要ある(はず)。

どのSMTPサーバかを判別するために、各レコード、セレクタ名(上記でいくと「default」の部分)を変えてやればいい(はず)。

2台目のSMTPの/var/domainkeys/example.com/内に秘密鍵を作ったら(上記の例でいくと「rsa.private」)、そのファイル名を「default2」とかにしてやって、
その他各ファイルDKSIGN指定の部分を
----------------------------------------------------------------------
DKSIGN="/etc/domainkeys/example.com/default2
----------------------------------------------------------------------
のようにしてやる(予定)。

そしてDNSのレコードに書くとき、
----------------------------------------------------------------------
default2._domainkey.example.com. IN TXT "2台目のSMTPサーバの公開鍵"
----------------------------------------------------------------------
と追加してやればよい(はず)。
  ↓
未検証・・・
システム開発上、ユーザがブラウザからメールマガジンを作成した時に、同時にエラーメール処理用のアドレスも作成されるようにする、逆にメルマガを削除したらそのアドレスも削除される必要があったためメモ。

今回のMTAはqmailを使うとのことで、アカウントの管理は必然的にvpopmailとなる。

しかし、qmailadminを使わないで新規アカウント作成(vadduser)・削除(vdeluser)を行うためには、基本的にrootでの操作となる。

単純にスクリプト内で

system("/home/vpopmail/bin/vadduser hoge@hoge.jp hogepass");

とやっただけでは、もちろんうまくいくはずがない。

というわけで、Cと連携して上手いことやってくれるモジュール様がないかと、CPANを探してみたらありました。
その名も「vpopmail.pm」。

呼び出す関数名もまさにvpopmailコマンドとほぼ同じ。

しかし、最終リリースは2001年・・・やばいんじゃないの?

かろうじてCPAN.pmをからインストールできたものの、説明も短すぎて、当然
use vpopmail;
vadduser(引数いろいろ);
とかやれば新規にアカウントを作ってくれると思いきや全然ダメ。

vpopmailのバージョンを見てきてくれる関数だけはなぜか動いた(笑)
まあ、関数名も最近のvpopmailのコマンドといまいち合ってないし。

というわけでさんざん悩んだ結果、sudoを使うことで決定。

以下手順。

1.新規バーチャルアカウントを作成する簡単なスクリプト(vadduser.cgi)を作成しCGIの動くディレクトリに置く。

vadduser.cgi
-----------------------------------------------------------------------------------------
#!/usr/bin/perl

use strict;

# コマンド発行
`sudo -u root /home/vpopmail/bin/vadduser hoge@hoge.jp hogepass`;
exit;
1
-----------------------------------------------------------------------------------------

2.sudoの設定ファイルに許可コマンドを追記

# visudo

(以下を追記)
apache ALL=(root) NOPASSWD: /home/vpopmail/bin/vadduser,/home/vpopmail/bin/vdeluser

同時に、以下の行をコメント化

Defaults requiretty
   ↓
#Defaults requiretty

※これをコメント化しないと、最近のLinuxでは、
sudo: apache : sorry, you must have a tty to run sudo ; TTY=unknown ;......
と怒られる。

このエラーは、/var/log/secure を見ればわかる。

保存して終了
:wq


3.vadduser.cgiをブラウザから実行してみる。

4.確認

popアカウント一覧に、「hoge」が追加されているのを確認

同時に、/home/vpopmail/domains/hoge@hoge.jp 内に、ディレクトリ「hoge」が作成されているのでOK!!



ああ疲れた今回も。


実務的には、このvadduser.cgiをAPIとしてドキュメントルート外に置いて、第三者からは直接アクセスされないようにし、他のCGIからシステムコールで呼んだりした方がセキュアかなと。


参考URL:
http://hibari.2ch.net/test/read.cgi/php/1024741312/l50
http://d.hatena.ne.jp/kakurasan/20100512/p1
http://old.ikoinoba.net/index.php?UID=1188143501
http://search.cpan.org/~sscanlon/vpopmail-0.08/
空メール登録のシステム構築自体は以下の通り。
http://www.igreks.jp/dev/2010/06/postfixperl.html

上記の場合は、アイリアス設定ファイルに直接転送先を書いているが、転送用ファイル「.qmail」や「.forward」にパイプで転送先を書いて、ユーザディレクトリ直下に配置してももちろん構わない。

ここで注意したいのが、「.qmail」にパイプ処理を書くとき、空行を作ってはならないということだ。

「.qmail」ファイルは本来の用途で使うならば、転送したいメールアドレスが一行に1つずつ書いてある。
qmailはこれを上から順に処理していく。

つまり、空行が合った場合でも、「(空文字列)@ドメイン」と認識してしまう。

したがって、そんなメールボックスはありませんよ!と、Mailer-Daemonから送信元にエラーが返ってきてしまう。

最後の行を改行して終わらないと気持ちが悪いのは同感だが、この場合はやってはいけない。


.qmail

○良い例
---------------------------------------------------------
| プログラムへのパス (コマンドライン引数)(改行なし)
---------------------------------------------------------

×悪い例
---------------------------------------------------------
| プログラムへのパス (コマンドライン引数)(改行)
(空行)
---------------------------------------------------------


あと、qmailの場合も、postfix同様、パイプで渡されたメールキューは勝手に削除されてるっぽい。ログに「remove」とかいう記載はないが。

渡したプログラムで「exit;」とかしてないと、もしかしたら続いちゃうのかも。
【インストールに必要なユーザ、グループを作成する 】

[root@linux ~]# mkdir /var/qmail ←■ qmail インストールディレクトリ作成
[root@linux ~]# groupadd nofiles ←■ nofiles グループ作成
[root@linux ~]# groupadd qmail ←■ qmail グループ作成
[root@linux ~]# useradd -g nofiles -s /sbin/nologin -u 490 alias -m -d /var/qmail/alias -k /dev/null ←■ alias ユーザ作成
[root@linux ~]# useradd -g nofiles -d /var/qmail -s /sbin/nologin -u 491 -M qmaild ←■ qmaild ユーザ作成
[root@linux ~]# useradd -g nofiles -d /var/qmail -s /sbin/nologin -u 492 -M qmaill ←■ qmaill ユーザ作成
[root@linux ~]# useradd -g nofiles -d /var/qmail -s /sbin/nologin -u 493 -M qmailp ←■ qmailp ユーザ作成
[root@linux ~]# useradd -g qmail -d /var/qmail -s /sbin/nologin -u 494 -M qmailq ←■ qmailq ユーザ作成
[root@linux ~]# useradd -g qmail -d /var/qmail -s /sbin/nologin -u 495 -M qmailr ←■ qmailr ユーザ作成
[root@linux ~]# useradd -g qmail -d /var/qmail -s /sbin/nologin -u 496 -M qmails ←■ qmails ユーザ作成

【ダウンロード】

[user@linux qmail]$ wget ftp://ftp.jp.qmail.org/qmail/qmail-1.03.tar.gz ←■ qmailダウンロード
※ wgetが固まってダウンロードできない場合は下記手順でダウンロード
[user@linux qmail]$ wget --no-passive-ftp ftp://ftp.jp.qmail.org/qmail/qmail-1.03.tar.gz ←■ qmailダウンロード
[user@linux qmail]$ wget http://www.itheart.com/phpgw/qmail-date-localtime.patch ←■ 日本標準時間対応パッチダウンロード
[user@linux qmail]$ wget http://members.elysium.pl/brush/qmail-smtpd-auth/dist/qmail-smtpd-auth-0.31.tar.gz ←■ SMTP-Auth対応パッチダウンロード
[user@linux qmail]$ wget http://qmail.mirrors.summersault.com/qmail-smtpd-relay-reject ←■ 不正中継拒否対応パッチダウンロード
[user@linux qmail]$ wget http://www.qmail.org/moni.csi.hu/pub/glibc-2.3.1/qmail-1.03.errno.patch ←■ エラー対策patchダウンロード
[user@linux qmail]$ wget http://tomclegg.net/qmail/qmail-remote-auth.patch ←■ 外部SMTP-Auth対応パッチダウンロード

【qmail インストール】

[user@linux qmail]$ tar zxvf qmail-1.03.tar.gz ←■ qmail展開

[user@linux qmail]$ tar zxvf qmail-smtpd-auth-0.31.tar.gz ←■ SMTP-Auth対応パッチ展開
[user@linux qmail]$ mv qmail-smtpd-auth-0.31/* ./qmail-1.03/ ←■ SMTP-Auth対応パッチをqmail展開先ディレクトリへ移動

[user@linux]$ cd qmail-1.03 ←■ qmail展開先ディレクトリへ移動
[user@linux qmail-1.03]$ patch -p1 < ../qmail-date-localtime.patch ←■ 日本標準時間対応パッチ施行

[user@linux qmail-1.03]$ patch < auth.patch ←■ SMTP-Auth対応パッチ施行
patching file Makefile
patching file TARGETS
patching file qmail-smtpd.8
patching file qmail-smtpd.c

[user@linux qmail-1.03]$ patch < ../qmail-remote-auth.patch ←■ 外部SMTP-Auth対応パッチ施行
patching file qmail-remote.c
patching file Makefile
Hunk #1 succeeded at 1441 (offset -4 lines).

[user@linux qmail-1.03]$ patch < ../qmail-smtpd-relay-reject ←■ 不正中継拒否対応パッチ施行
patching file qmail-smtpd.c
Hunk #1 succeeded at 56 (offset 3 lines).
Hunk #2 succeeded at 226 (offset 9 lines).
Hunk #3 succeeded at 277 (offset 11 lines).

[user@linux qmail-1.03]$ patch < ../qmail-1.03.errno.patch ←■ エラー発生対策 error.h をパッチ施行

[root@linux qmail-1.03]# su - ←■ root権限になる
[root@linux qmail-1.03]# cd /home/user/qmail/qmail-1.03 ←■ ディレクトリ移動
[root@linux qmail-1.03]# make setup check ←■ qmailインストール

~ 中略 ~

./install
./instcheck
[root@linux qmail-1.03]#

※↑何か新しくパッチを当てたりして、再コンパイルする場合は、
一旦 qmailを停止し、# make clean
その後、# make setup check

【error.h ファイルを直接編集する場合 】

[user@linux qmail-1.03]$ vi error.h ←■ error.h直接編集する場合
extern int errno;
↓■ 変更(書き換える)
#include
[user@linux qmail-1.03]$


【qmail-remote-auth だけインストールする場合 】

qmail-remote-auth(外部SMTP-Auth対応パッチ)だけを後からインストールする場合 †

[root@linux qmail-1.03]# ls /var/qmail/bin/qmail-remote ←■ qmail-remotetの存在確認
[root@linux qmail-1.03]# patch < ../qmail-remote-auth.patch ←■ 外部SMTP-Auth対応パッチ施行
patching file qmail-remote.c
patching file Makefile
Hunk #1 succeeded at 1441 (offset -4 lines).

[root@linux qmail-1.03]# make qmail-remote ←■ qmail-remoteのみコンパイル

[root@linux qmail-1.03]# install -m 711 qmail-remote /var/qmail/bin/qmail-remote ←■ qmail-remoteのみインストール


【qmail 設定ファイルの作成 】

※ /var/qmail/control 内にqmailの制御ファイルが作成されます。

[root@linux ~]# cd ***/qmail-1.03/ ←■ qmail 展開先ディレクトリへ移動
[root@linux qmail-1.03]# ./config-fast `hostname -d`
Your fully qualified host name is example.com.
Putting hitsujigumi into control/me...
Putting hitsujigumi into control/defaultdomain...
Putting hitsujigumi into control/plusdomain...
Putting hitsujigumi into control/locals...
Putting hitsujigumi into control/rcpthosts...
Now qmail will refuse to accept SMTP messages except to example.com.
Make sure to change rcpthosts if you add hosts to locals or virtualdomains!
[root@linux qmail-1.03]#

※ 注意 /var/qmail/control/me 内に、localhost を入れるとLogwatchからのメールが届かない。

【マニュアルを参照できるようにする 】

[root@linux qmail-1.03]# cd ←■ qmail展開先ディレクトリを抜ける

[root@linux]# echo "MANPATH /var/qmail/man" >> /etc/man.config ←■ manコマンドでqmailコマンドのマニュアルを参照できるようにする


【tcsh インストール 】

tcsh は、UNIX系のシェルの一つ

[root@linux ~]# yum list | grep tcsh ←■ インストール確認
** Message: sqlite cache needs updating, reading in metadata
tcsh.i386 6.14-12.el5 installed ←■ インストール済
[root@linux ~]#
[root@linux ~]# yum -y install tcsh ←■ cシェルインストール


【OP25B(Outbound Port 25 Blocking)対策 】※動的IPの自宅サーバの場合

* SMTPサーバ名 = プロバイダのSMTPサーバ名
* ユーザー名 = プロバイダのメールアカウント名
* パスワード = プロバイダのメールパスワード


設定例1 SMTPサーバ名のみ

[root@linux ~]# echo ":SMTPサーバ名" > /var/qmail/control/smtproutes ←■ SMTP認証情報設定

[root@linux ~]# echo ":smtp.nifty.com" > /var/qmail/control/smtproutes ←■ 設定例


設定例2 SMTPサーバ名 + 認証情報

[root@linux ~]# echo ":SMTPサーバ名 ユーザー名 パスワード" > /var/qmail/control/smtproutes ←■ SMTP認証情報設定

[root@linux ~]# echo ":smtp.nifty.com user password" > /var/qmail/control/smtproutes ←■ 設定例


設定例3 SMTPサーバ名 + ポート番号 + 認証情報 †

[root@linux ~]# echo ":SMTPサーバ名:587 ユーザー名 パスワード" > /var/qmail/control/smtproutes ←■ SMTP認証情報設定

[root@linux ~]# echo ":smtp.nifty.com:587 user password" > /var/qmail/control/smtproutes ←■ 設定例


※ 直接編集する場合

[root@linux ~]# vi /var/qmail/control/smtproutes
:SMTPサーバ名:587 ユーザー名 パスワード
:smtp.nifty.com:587 user@nifty.com Password ←■ 例
[root@linux ~]# 保存する


ポート:587の設定確認

[root@linux ~]# less /etc/services
submission 587/tcp msa # mail message submission
submission 587/udp msa # mail message submission


------------------------------------------------------------------------------------------------------


【vpopmail 用 ユーザ・グループ作成 】

[root@linux ~]# groupadd -g 89 vchkpw ←■ vpopmail用グループの vchkpwグループ作成
[root@linux ~]# useradd -g vchkpw -u 89 vpopmail -s /sbin/nologin -m -k /dev/null ←■ vpopmailユーザ作成
[root@linux ~]# chmod 755 /home/vpopmail ←■ パーミッション変更

【再インストールする場合】

[root@linux ~]# cd ....vpopmail-5.4.25 ←■ vpopmailインストール用ディレクトリへ移動
[root@linux vpopmail-5.4.25]# make distclean ←■ 以前のmakeファイルを削除


【リレー許可DBの作成 】

[root@linux ~]# mkdir -p /home/vpopmail/etc/ ←■ インストール前に必要なディレクトリ作成
[root@linux ~]# vi /home/vpopmail/etc/tcp.smtp ←■リレー許可の元となるファイル作成

 127.:allow,RELAYCLIENT="" ←■ リレー許可として127.を追加
 XXX.XXX.XXX.:allow,RELAYCLIENT="" ←■任意で許可するIPを指定
 XXX.XXX.XXX.XXX-XXX:allow,RELAYCLIENT="" ←■まとめて指定もできる
 :allow

[root@linux ~]# tcprules /home/vpopmail/etc/tcp.smtp.cdb /home/vpopmail/etc/tcp.smtp.tmp < /home/vpopmail/etc/tcp.smtp ←■ cdbの作成
[root@linux ~]# chown -R vpopmail. /home/vpopmail/etc ←■ 作成したディレクトリ以下の所有者変更

【configure時のオプション】

--enable-logging=y ←■ メール受信時のログを記録する場合は「y」
--enable-roaming-users=y ←■ POP before SMTP認証を使う場合は「y」
--enable-relay-clear-minutes=10 ←■ POP before SMTP用 relayがclearされる時間を10分に指定(デフォルトは180分)
--enable-tcpserver-file=/home/vpopmail/etc/tcp.smtp ←■ リレー許可ファイルのパス(問題が起これば指定してみる)
--enable-clear-passwd=n ←■ パスワードを平文で保存しないようにする場合は追加(SMTP認証では指定しない事)


【vpopmail(SMTP認証用)インストール】

[user@linux qmail]$ wget http://nchc.dl.sourceforge.net/sourceforge/vpopmail/vpopmail-5.4.25.tar.gz ←■ vpopmailダウンロード
[user@linux qmail]$ tar zxvf vpopmail-5.4.25.tar.gz ←■ vpopmail 展開

[user@linux qmail]$ cd vpopmail-5.4.25 ←■ vpopmail 展開先ディレクトリへ移動

※ メールサーバーでウィルス&スパムチェック導入している場合のみ
[user@linux vpopmail-5.4.25]$ vi vpopmail.c ←■ vpopmail.c 編集(ユーザ追加時に自動でスパムメール用メールボックスを作成)
+----------------------------------------------------------------------------------------
| const char *dirnames[] = {"Maildir", "Maildir/new", "Maildir/cur",
| "Maildir/tmp"};
+----------------------------------------------------------------------------------------
↓■ 変更
+----------------------------------------------------------------------------------------
| const char *dirnames[] = {"Maildir", "Maildir/new", "Maildir/cur", "Maildir/tmp",
| "Maildir/.Spam", "Maildir/.Spam/new", "Maildir/.Spam/cur", "Maildir/.Spam/tmp"};
+----------------------------------------------------------------------------------------

:wq ←■ 保存して閉じる

[user@linux vpopmail-5.4.25]$ vi vchkpw.c ←■ vchkpw.c の修正
hmac_md5( (unsigned char *) challenge, strlen(challenge), (unsigned char *) password, strlen(password), digest);
↓■ 2か所変更 747行目辺り
hmac_md5( (unsigned char *) response, strlen(response), (unsigned char *) password, strlen(password), digest);

return(strcmp(digascii,response));
↓■ 1か所変更 759行目辺り
return(strcmp(digascii,challenge));

:wq ←■ 保存して閉じる

[user@linux vpopmail-5.4.25]$ su - ←■ root権限になる

[root@linux vpopmail-5.4.25]# ./configure \
--enable-qmail-ext=n \
--enable-logging=y                  [Enter] ←■ configure

~ 中略 ~

vpopmail 5.4.25
Current settings
---------------------------------------

vpopmail directory = /home/vpopmail
domains directory = /home/vpopmail/domains
uid = 89
gid = 89
roaming users = OFF --disable-roaming-users (default)
password learning = OFF --disable-learn-passwords (default)
md5 passwords = ON --enable-md5-passwords (default)
file locking = ON --enable-file-locking (default)
vdelivermail fsync = OFF --disable-file-sync (default)
make seekable = ON --enable-make-seekable (default)
clear passwd = ON --enable-clear-passwd (default)
user dir hashing = ON --enable-users-big-dir (default)
address extensions = OFF --disable-qmail-ext (default)
ip alias = OFF --disable-ip-alias-domains (default)
onchange script = OFF --disable-onchange-script (default)
auth module = cdb --enable-auth-module=cdb (default)
auth inc = -Icdb
auth lib =
system passwords = OFF --disable-passwd (default)
pop syslog = show successful and failed login attempts --enable-logging=y
auth logging = ON --enable-auth-logging (default)
spamassassin = OFF --disable-spamassassin (default)
maildrop = OFF --disable-maildrop (default)
[root@linux vpopmail-5.4.25]#

[root@linux vpopmail-5.4.25]# make
[root@linux vpopmail-5.4.25]# make install-strip ←■ vpopmail インストール

[root@linux vpopmail-5.4.25]# chown root. /home/vpopmail/bin/vchkpw ←■ vchkpw にroot権限の設定
[root@linux vpopmail-5.4.25]# chmod 4755 /home/vpopmail/bin/vchkpw ←■ vchkpw のパーミッション変更

[root@linux vpopmail-5.4.25]# cd ../ ←■ vpopmail 展開先ディレクトリを抜ける
[root@linux vpopmail-5.4.25]# rm -rf vpopmail-5.4.25 ←■ vpopmail 展開先ディレクトリ削除
[root@linux vpopmail-5.4.25]# rm -f vpopmail-5.4.25.tar.gz ←■ ダウンロードした vpopmail 削除


※ 参考 SMTP認証時の /home/vpopmail/etc/ 内のファイル一覧

-rw-r--r-- 1 root root 25 5月 22 12:52 inc_deps
-rw-r--r-- 1 root root 42 5月 22 12:52 lib_deps
-rw-r--r-- 1 root root 0 5月 22 13:19 tcp.smtp
-rw-r--r-- 1 vpopmail vchkpw 2048 5月 22 15:00 tcp.smtp.cdb
-rw-r--r-- 1 vpopmail vchkpw 1161 5月 22 12:52 vlimits.default

※ 続いて → qmail + vpopmail/vpopmail 設定


【vpopmail(POP Before SMTP用)インストール 】

[user@linux qmail]$ wget http://nchc.dl.sourceforge.net/sourceforge/vpopmail/vpopmail-5.4.25.tar.gz ←■ vpopmailダウンロード
[user@linux qmail]$ tar zxvf vpopmail-5.4.25.tar.gz ←■ vpopmail 展開

[user@linux qmail]$ cd vpopmail-5.4.25 ←■ vpopmail 展開先ディレクトリへ移動

※ メールサーバーでウィルス&スパムチェック導入している場合のみ
[user@linux vpopmail-5.4.25]$ vi vpopmail.c ←■ vpopmail.c 編集(ユーザ追加時に自動でスパムメール用メールボックスを作成)
+----------------------------------------------------------------------------------------
| const char *dirnames[] = {"Maildir", "Maildir/new", "Maildir/cur",
| "Maildir/tmp"};
+----------------------------------------------------------------------------------------
↓■ 変更
+----------------------------------------------------------------------------------------
| const char *dirnames[] = {"Maildir", "Maildir/new", "Maildir/cur", "Maildir/tmp",
| "Maildir/.Spam", "Maildir/.Spam/new", "Maildir/.Spam/cur", "Maildir/.Spam/tmp"};
+----------------------------------------------------------------------------------------

:wq ←■ 保存して閉じる

[user@linux vpopmail-5.4.25]$ su - ←■ root権限になる

[root@linux vpopmail-5.4.25]# ./configure \
--enable-roaming-users=y \
--enable-relay-clear-minutes=10 \
--enable-tcpserver-file=/home/vpopmail/etc/tcp.smtp \
--enable-qmail-ext=n \
--enable-logging=y                  [Enter] ←■ configure

~ 中略 ~

vpopmail 5.4.25
Current settings
---------------------------------------

vpopmail directory = /home/vpopmail
domains directory = /home/vpopmail/domains
uid = 89
gid = 89
roaming users = ON --enable-roaming-users
tcpserver file = /home/vpopmail/etc/tcp.smtp
open_smtp file = /home/vpopmail/etc/open-smtp
rebuild tcpserver file = ON --enable-rebuild-tcpserver-file (default)
password learning = OFF --disable-learn-passwords (default)
md5 passwords = ON --enable-md5-passwords (default)
file locking = ON --enable-file-locking (default)
vdelivermail fsync = OFF --disable-file-sync (default)
make seekable = ON --enable-make-seekable (default)
clear passwd = ON --enable-clear-passwd (default)
user dir hashing = ON --enable-users-big-dir (default)
address extensions = OFF --disable-qmail-ext (default)
ip alias = OFF --disable-ip-alias-domains (default)
onchange script = OFF --disable-onchange-script (default)
auth module = cdb --enable-auth-module=cdb (default)
auth inc = -Icdb
auth lib =
system passwords = OFF --disable-passwd (default)
pop syslog = show only failed attempts --enable-logging=e (default)
auth logging = ON --enable-auth-logging (default)
spamassassin = OFF --disable-spamassassin (default)
maildrop = OFF --disable-maildrop (default)
[root@linux vpopmail-5.4.25]#

[root@linux vpopmail-5.4.25]# make
[root@linux vpopmail-5.4.25]# make install-strip ←■ vpopmail インストール

[root@linux vpopmail-5.4.25]# chown root. /home/vpopmail/bin/vchkpw ←■ vchkpw にroot権限の設定
[root@linux vpopmail-5.4.25]# chmod 4755 /home/vpopmail/bin/vchkpw ←■ vchkpw のパーミッション変更

[root@linux vpopmail-5.4.25]# cd ←■ vpopmail 展開先ディレクトリを抜ける
[root@linux vpopmail-5.4.25]# rm -rf vpopmail-5.4.25 ←■ vpopmail 展開先ディレクトリ削除
[root@linux vpopmail-5.4.25]# rm -f vpopmail-5.4.25.tar.gz ←■ ダウンロードした vpopmail 削除


※ 参考 POP Before SMTP時の /home/vpopmail/etc/ 内のファイル一覧 †

-rw-r--r-- 1 root root 25 5月 22 12:52 inc_deps
-rw-r--r-- 1 root root 42 5月 22 12:52 lib_deps
-rw-r--r-- 1 vpopmail vchkpw 0 5月 22 15:00 open-smtp
-rw------- 1 root root 0 5月 22 12:53 open-smtp.lock
-rw-r--r-- 1 root root 0 5月 22 13:19 tcp.smtp
-rw-r--r-- 1 vpopmail vchkpw 2048 5月 22 15:00 tcp.smtp.cdb
-rw-r--r-- 1 vpopmail vchkpw 1161 5月 22 12:52 vlimits.default

↑メール受信時の認証に成功すれば、open-smtp に接続時のIPが登録され tcp.smtp.cdb が更新される。

※もし、open-smtp、open-smtp.lockが生成されていないときは、自分で作る。
vi open-smtp
vi open-smtp.lock
※念のため、open-smpのほうだけ、所有者をvpopmailにしパーミッション変更
chown vpopmail:vchkpw open-smtp
chmod 666 open-smtp


.
【POP Before SMTPもSMTP認証も不要のとき】(ローカルからしか配信しないとき)

[root@linux vpopmail-5.4.25]# ./configure \
--enable-tcpserver-file=/home/vpopmail/etc/tcp.smtp \
--enable-qmail-ext=n \
--enable-logging=y

[root@linux vpopmail-5.4.25]# make
[root@linux vpopmail-5.4.25]# make install-strip ←■ vpopmail インストール

[root@linux vpopmail-5.4.25]# chown root. /home/vpopmail/bin/vchkpw ←■ vchkpw にroot権限の設定
[root@linux vpopmail-5.4.25]# chmod 4755 /home/vpopmail/bin/vchkpw ←■ vchkpw のパーミッション変更


【CRON 設定】※POP Before SMTPの場合のみ

POP Before SMTP の場合は、受信認証を通った期限切れIPのを定期的に削除する必要があります。

[root@linux ~]# crontab -e
*/10 * * * * /home/vpopmail/bin/clearopensmtp > /dev/null 2>&1 ←■ 最終行に追記する(10分毎に処理します。)

ちなみにcrontabのある場所は、/var/spool/cron/[ユーザー名]

-------------------------------------------------------------------------------------------------------

【仮想ドメイン登録(追加)】

[root@linux ~]# /home/vpopmail/bin/vadddomain example.jp
Please enter password for postmaster: ←■ 設定したいパスワード入力
enter password again: ←■ 設定したいパスワード再入力
[root@linux ~]#

【仮想ドメイン登録(追加)パスワードをランダムに設定】

[root@linux ~]# /home/vpopmail/bin/vadddomain -r example.jp
Random password: XoC1mfhl ←■ ランダムに設定されたパスワードが自動設定される
[root@linux ~]#

以下のファイルにもドメインが追加されます。

* /var/qmail/control/rcpthosts
* /var/qmail/control/virtualdomains

※もし、「Already exist!」とエラーが出る場合は、下記の削除をしてからもう一度追加する

【仮想ドメイン削除】

[root@linux ~]# /home/vpopmail/bin/vdeldomain example.jp
[root@linux ~]#

以下のファイルからもドメインが削除されます。

* /var/qmail/control/rcpthosts
* /var/qmail/control/virtualdomains


【仮想ユーザ登録(追加)】

メールアドレス(アカウント)を追加する。

[root@linux ~]# /home/vpopmail/bin/vadduser user@example.jp
Please enter password for user@example.jp: ←■ 設定したいパスワード入力
enter password again: ←■ 設定したいパスワード再入力
[root@linux ~]#


【仮想ユーザ削除】

メールアドレス(アカウント)を削除する。
※ 即、メールボックスごと削除されるので注意。

[root@linux ~]# /home/vpopmail/bin/vdeluser user@example.jp
[root@linux ~]#


【仮想ユーザのパスワード変更 】

メールアドレス(アカウント)のPOP認証パスワードを変更する。

[root@linux ~]# /home/vpopmail/bin/vpasswd user@example.jp
Please enter password for user@example.jp:  ←■ 新しいパスワード入力
enter password again: ←■ 新しいパスワード再入力


【全ドメイン・全ユーザー共通の上限を設定 】

※ デフォルト設定です。設定以後の新規作成に適用されます。既存ドメインには適用されないので、各ドメイン毎に設定変更が必要。

[root@linux ~]# vi /home/vpopmail/etc/vlimits.default
quota 100 ←■ (例) 全ドメインのメールボックス総容量を100MBにする
maxmsgcount 10000 ←■ (例) メッセージ総数10,000にする
default_quota 20971520 ←■ (例) 今後新たに作成するユーザーのquotaを20MBにする
default_maxmsgcount 1000 ←■ (例) メッセージ総数1,000にする


【既存ドメインのquota変更例 】

[root@linux ~]# /home/vpopmail/bin/vmoddomlimits -M 20000 -m 1000 -P 20 -L 20 -A 20 -F 20 -R 20 -Q 200 -q 10485760 example.jp


【各ドメイン毎のメールアドレスの受信制限】

デフォルト設定

vpopmail quota 設定

* 書式
o /home/vpopmail/bin/vmoddomlimits [-Q xxx -q xxx -M xxx -m xxx] [Domain Name]

* オプション
オプション 内容 入力値 入力例
-v vpopmail バージョン表示
-M ドメインのメッセージ総数max 数値 20000
-m ユーザー当たりのメッセージ数max 数値 1000
-P アカウント数max 数値 20 無制限は-1
-A 別名数max 数値 20 無制限は-1
-F 転送数max 数値 20 無制限は-1
-R autoresponder数max 数値 20 無制限は-1
-L メーリングリスト数max 数値 20 無制限は-1
-Q ドメイン総容量 バイト数 209715200 or 204800k or 200m or 無制限は0
-q ユーザーquota バイト数 10485760 or 10240k or 10m or 無制限は0


ユーザ毎のメール容量を デフォルトで 50MB に設定する場合

[root@linux ~]# /home/vpopmail/bin/vmoddomlimits -q 52428800 example.jp ←■ バイト単位で設定した場合の例(50 x 1024 x 1024 = 52428800)
[root@linux ~]# /home/vpopmail/bin/vmoddomlimits -q 51200k example.jp ←■ キロバイト単位で設定した場合の例(50 x 1024 = 51200)
[root@linux ~]# /home/vpopmail/bin/vmoddomlimits -q 50m example.jp ←■ メガバイト単位で設定した場合の例
[root@linux ~]# /home/vpopmail/bin/vmoddomlimits -q 0 example.jp ←■ 0 にした場合は無制限

* 直接ファイルを編集する場合

[root@linux ~]# /home/vpopmail/domains/ドメイン指定/.qmailadmin-limits
maxpopaccounts: -1
maxaliases: -1
maxforwards: -1
maxautoresponders: -1
maxmailinglists: -1
quota: 0 ←■ 指示されたドメインの総容量をMByte 単位で指定
maxmsgcount: 0 ←■ 指示されたドメインの最大保持メッセージ数を指定
default_quota: 10485760 ←■ メール容量デフォルト設定値
default_maxmsgcount: 0 ←■ 指示されたドメインに属するメールアカウントの最大保持メッセージ数を指定
perm_account: 0
perm_alias: 0
perm_forward: 0
perm_autoresponder: 0
perm_maillist: 0
perm_quota: 0
perm_defaultquota: 0

:wq ←■ 保存して閉じる


【指定ドメイン内の全ユーザのメール容量を 10MB に制限する場合 】

[root@linux ~]# /home/vpopmail/bin/vsetuserquota example.jp 10m


【制限解除 】

[root@linux ~]# /home/vpopmail/bin/vsetuserquota example.jp noquota


【特定のアドレスのメール容量を 10MB にする】

[root@linux ~]# /home/vpopmail/bin/vsetuserquota user@example.jp 10m


【制限解除】

[root@linux ~]# /home/vpopmail/bin/vsetuserquota user@example.jp noquota


【vpopmail 主要コマンド】

バーチャルドメイン追加 ~vpopmail/bin/vadddomain ドメイン
メールボックス作成 ~vpopmail/bin/vadduser メールアドレス
メールボックス削除 ~vpopmail/bin/vdeluser メールアドレス
バーチャルドメイン削除 ~vpopmail/bin/vdeldomain ドメイン
パスワードの変更 ~vpopmail/bin/vpasswd メールアドレス
ユーザー情報の確認 ~vpopmail/bin/vuserinfo メールアドレス
ドメインquota設定 ~vpopmail/bin/vsetuserquota ドメイン 容量
ユーザーquota設定 ~vpopmail/bin/vsetuserquota メールアドレス 容量
その他ドメイン設定変更 ~vpopmail/bin/vmoddomlimits ドメイン 容量等
その他ユーザー設定変更 ~vpopmail/bin/vmoduser メールアドレス 容量等


-------------------------------------------------------------------------------------------------------


tcpserver インストール †

【通常(非SSL対応版) インストール】

* tcpserver のパス → /usr/local/bin/tcpserver
* tcprules のパス → /usr/local/bin/tcprules

[user@linux qmail]$ wget http://cr.yp.to/ucspi-tcp/ucspi-tcp-0.88.tar.gz ←■ tcpserverダウンロード
[user@linux qmail]$ wget http://www.qmail.org/rpms/patches/ucspi-tcp-0.88.errno.patch ←■ エラー対策patchダウンロード

[user@linux qmail]$ tar zxvf ucspi-tcp-0.88.tar.gz ←■ 展開する

[user@linux qmail]$ cd ucspi-tcp-0.88/ ←■ ディレクトリ移動

※ エラー対策
[user@linux ucspi-tcp-0.88]$ patch < ../ucspi-tcp-0.88.errno.patch ←■ error.h パッチファイル施行

 ※パッチ施行確認
[user@linux ucspi-tcp-0.88]# vi error.h

extern int errno;の行の下に、
#include
が記載されていればOK。なければ手で記載。


[user@linux qmail]$ su - ←■ root権限になる
[root@linux qmail]# make setup check

~ 中略 ~

./install
./instcheck
[root@linux qmail]#



【SSL対応版 インストール】

SSL対応版は、tcpserver-ssl としてインストールする。

* tcpserver(SSL対応) のパス → /usr/local/bin/tcpserver-ssl

[user@linux qmail]$ wget http://cr.yp.to/ucspi-tcp/ucspi-tcp-0.88.tar.gz ←■ tcpserverダウンロード
[user@linux qmail]$ wget http://www.nrg4u.com/qmail/ucspi-tcp-ssl-20050405.patch.gz ←■ tcpserverSSL対応パッチダウンロード
[user@linux qmail]$ wget http://www.qmail.org/rpms/patches/ucspi-tcp-0.88.errno.patch ←■ エラー対策patchダウンロード

[user@linux qmail]$ tar zxvf ucspi-tcp-0.88.tar.gz ←■ 展開する
[user@linux qmail]$ gunzip ucspi-tcp-ssl-20050405.patch.gz ←■ tcpserverSSL対応パッチ展開
[user@linux qmail]$ mv ucspi-tcp-ssl-20050405.patch ucspi-tcp-0.88 ←■ tcpserverSSL対応パッチをtcpserver展開先ディレクトリへ移動させる

[user@linux qmail]$ cd ucspi-tcp-0.88/ ←■ ディレクトリ移動

[user@linux ucspi-tcp-0.88]$ patch < ucspi-tcp-ssl-20050405.patch ←■ tcpserverSSL対応パッチ施行
patching file FILES
patching file Makefile

~ 中略 ~

patching file tcpserver.c
patching file who@.1

[user@linux ucspi-tcp-0.88]$ su - ←■ root権限になる

[root@linux ucspi-tcp-0.88]# make ←■ tcpserverコンパイル
( cat warn-auto.sh; \
echo 'main="$1"; shift'; \
echo exec "`head -1 conf-ld`" \
'-o "$main" "$main".o ${1+"$@"}' \
) > load

~ 中略 ~

nroff -man argv0.1 > argv0.0
nroff -man recordio.1 > recordio.0
[root@linux ucspi-tcp-0.88]#

[root@linux ucspi-tcp-0.88]# mv tcpserver tcpserver-ssl ←■ SSL用にファイル名を変更する

[root@linux ucspi-tcp-0.88]# /bin/cp tcpserver-ssl /usr/local/bin ←■ SSL対応tcpserverをコピーする
[root@linux ucspi-tcp-0.88]#


【サーバ証明書作成 】

※ 応答するメールサーバ名はメールクライアントで設定するメールサーバー名と同じものを指定する

[root@linux ~]# cd ucspi-tcp-0.88 ←■ ディレクトリ移動
[root@linux ucspi-tcp-0.88]# make cert ←■ サーバ証明書作成
openssl req -new -x509 -nodes \
-out cert.pem -days 366 \
-keyout cert.pem
Generating a 1024 bit RSA private key
....++++++
.++++++
writing new private key to 'cert.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [GB]:JP ←■ サーバの所在地(国名)応答
State or Province Name (full name) [Berkshire]:Osaka ←■ サーバの所在地(都道府県名)応答
Locality Name (eg, city) [Newbury]:Osaka ←■ サーバの所在地(市区町村名)応答
Organization Name (eg, company) [My Company Ltd]:example.jp ←■ サーバ名応答(何でも良い)
Organizational Unit Name (eg, section) []: ←■ 空ENTER
Common Name (eg, your name or your server's hostname) []:mail.example.jp ←■ メールサーバ名応答 ※
Email Address []:postmaster@example.jp ←■ メールサーバ管理者アドレス応答
[root@linux ucspi-tcp-0.88]#
[root@linux ucspi-tcp-0.88]# cp cert.pem /var/qmail ←■ 作成したサーバ証明書をqmailインストールディレクトリへコピー

[root@linux ucspi-tcp-0.88]# chmod 600 /var/qmail/cert.pem ←■ サーバ証明書をroot以外参照禁止にする

[root@linux ucspi-tcp-0.88]# cd ←■ tcpserver展開先ディレクトリを抜ける
[root@linux ucspi-tcp-0.88]#


----------------------------------------------------------------------------------------


qmail 起動

【旧SMTP の停止】

現在、起動しているSMTPサーバーの動作を停止させる。

■sendmail の場合

[root@linux ~]# /etc/rc.d/init.d/sendmail stop ←■ sendmail停止

[root@linux ~]# chkconfig --list sendmail ←■ 自動起動を確認
sendmail 0:off 1:off 2:on 3:on 4:on 5:on 6:off
[root@linux ~]# chkconfig sendmail off ←■ 自動起動解除
[root@linux ~]# chkconfig --list sendmail ←■ 自動起動設定を確認
sendmail 0:off 1:off 2:off 3:off 4:off 5:off 6:off


■Postfix の場合

[root@linux ~]# /etc/rc.d/init.d/postfix stop ←■ Postfix停止
Shutting down postfix: [ OK ]

[root@linux ~]# chkconfig postfix off ←■ Postfix自動起動解除

[root@linux ~]# chkconfig --list postfix ←■ Postfix自動起動設定確認
postfix 0:off 1:off 2:off 3:off 4:off 5:off 6:off ←■ 全ランレベルのoffを確認


【sendmail コマンド置換え】

[root@linux ~]# chmod 0 /usr/lib/sendmail ←■ 旧sendmailコマンド無効化
[root@linux ~]# chmod 0 /usr/sbin/sendmail ←■ 旧sendmailコマンド無効化

[root@linux ~]# mv /usr/lib/sendmail /usr/lib/sendmail.org ←■ 旧sendmailコマンドをリネーム
[root@linux ~]# mv /usr/sbin/sendmail /usr/sbin/sendmail.org ←■ 旧sendmailコマンドをリネーム

[root@linux ~]# ln -s /var/qmail/bin/sendmail /usr/lib/sendmail ←■ sendmailコマンドをqmailに置換え
[root@linux ~]# ln -s /var/qmail/bin/sendmail /usr/sbin/sendmail ←■ sendmailコマンドをqmailに置換え


【Maildirへの移行】

[root@linux ~]# sed -i 's/Mailbox/Maildir\//g' /var/qmail/rc

[root@linux ~]# vi /var/qmail/rc ←■ /var/qmail/rc を直接編集する場合
qmail-start ./Mailbox splogger qmail ※ コメントアウトにしないこと
↓ 変更する
qmail-start ./Maildir/ splogger qmail


【起動スクリプト作成・設定】

* 起動スクリプト設定例↓
  http://tech.hitsug.net/?CentOS%2Fqmail%2F%E8%B5%B7%E5%8B%95%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%20%E8%A8%AD%E5%AE%9A%E4%BE%8B#va7ccd4f

[root@linux ~]# vi /etc/rc.d/init.d/qmail ←■ qmail起動スクリプト作成
[root@linux ~]# ※ 内容をコピーして保存する

[root@linux ~]# chmod +x /etc/rc.d/init.d/qmail ←■ qmail起動スクリプトへ実行権限付加

[root@linux ~]# /etc/rc.d/init.d/qmail start ←■ qmail起動
Starting qmail

[root@linux ~]# chkconfig qmail --add ←■ qmailをchkconfigへ追加

[root@linux ~]# chkconfig qmail on ←■ qmail自動起動設定

[root@linux ~]# chkconfig --list qmail ←■ qmail自動起動設定確認
qmail 0:off 1:off 2:on 3:on 4:on 5:on 6:off ←■ ランレベル2~5のonを確認


qmail 起動

【起動】

[root@linux ~]# /etc/rc.d/init.d/qmail start


【停止】

[root@linux ~]# /etc/rc.d/init.d/qmail stop


【再起動】

[root@linux ~]# /etc/rc.d/init.d/qmail restart


【状態確認】

[root@linux ~]# /etc/rc.d/init.d/qmail status


------------------------------------------------------------------------------------------

qmailadmin関連ダウンロード

[user@linux qmail]$ wget http://nchc.dl.sourceforge.net/sourceforge/qmailadmin/qmailadmin-1.2.1.tar.gz
[user@linux qmail]$ wget http://www.inter7.com/devel/autorespond-2.0.5.tar.gz
[user@linux qmail]$ wget http://cr.yp.to/software/ezmlm-0.53.tar.gz
[user@linux qmail]$ wget http://www.ezmlm.org/archive/6.0.1/ezmlm-idx-6.0.1.tar.gz


autorespond は、qmail の Vacation(自動応答)ツールです。

【autorespond インストール】

autorespond 最新版確認 → http://www.inter7.com/index.php?page=development

[root@linux ~]# wget http://www.inter7.com/devel/autorespond-2.0.5.tar.gz ←■ autorespond ダウンロード
[root@linux ~]# tar zxvf autorespond-2.0.5.tar.gz ←■ autorespond 展開

[root@linux ~]# cd autorespond-2.0.5 ←■ autorespond 展開先ディレクトリへ移動

[root@linux autorespond-2.0.5]# vi autorespond.c ←■ autorespond.c 編集

static char *binqqargs[2] = { "bin/qmail-queue", 0 };
↓■ 変更 103行目辺り
static char *binqqargs[2] = { "bin/qmail-queue.iso-2022-jp", 0 };

fprintf(fdm,"Date: %u %s %u %02u:%02u:%02u -0000\nMessage-ID: <%lu.%u.blah>\n"
,dt->tm_mday,montab[dt->tm_mon],dt->tm_year+1900,dt->tm_hour,dt->tm_min,dt->tm_sec,msgwhen,getpid() );

fprintf(fdm,"Content-Type: text/plain; charset=\"iso-2022-jp\"\n" ); ←■ 一行追加 265行目辺り

mfp = fopen( msg, "rb" );

:wq ←■ 保存して閉じる
[root@linux autorespond-2.0.5]#

[root@linux ~]# make && make install ←■ autorespond インストール
gcc -O2 -Wall -g autorespond.c -o autorespond
install -d /usr/bin /usr/share/man/man1
install autorespond /usr/bin
install autorespond.1 /usr/share/man/man1

[root@linux autorespond-2.0.5]# cd ../ ←■ autorespond 展開先ディレクトリを抜ける

[root@linux ~]# rm -f autorespond-2.0.5* ←■ 今後不要な場合、ダウンロードした autorespond 削除

[root@linux autorespond-2.0.5]# vi /var/qmail/bin/qmail-queue.iso-2022-jp ←■ autorespond 返信メール日本語化スクリプト作成
#!/bin/bash

NKF="/usr/bin/nkf"
PERL="/usr/bin/perl"
QMAILQUEUE="/var/qmail/bin/qmail-queue"

${PERL} -pe 's/\n/\\n/g' |\
${PERL} -pe 's/From:.*?\\n\\n//' |\
${PERL} -pe 's/-------- Original Message --------.*$//' |\
${PERL} -pe 's/\\n/\n/g' |\
${NKF} -j |\
${QMAILQUEUE}

:wq ←■ 保存して閉じる
[root@linux ~]#

[root@linux ~]# chmod 711 /var/qmail/bin/qmail-queue.iso-2022-jp ←■ autorespond 返信メール日本語化スクリプトパーミッション変更

[root@centos ~]# chown vpopmail. /var/qmail/bin/qmail-queue.iso-2022-jp ←■ autorespond 返信メール日本語化スクリプト所有者変更



ezmlm は、メーリングリスト管理ツールです。

【ezmlm + ezmlm-idx インストール】

* ezmlm 最新版確認 → http://cr.yp.to/ezmlm.html
* ezmlm-idx 最新版確認 → http://www.ezmlm.org/

[root@linux ~]# wget http://cr.yp.to/software/ezmlm-0.53.tar.gz ←■ ezmlm ダウンロード
[root@linux ~]# wget http://www.ezmlm.org/archive/6.0.1/ezmlm-idx-6.0.1.tar.gz ←■ ezmlm-idx ダウンロード

[root@linux ~]# tar zxvf ezmlm-0.53.tar.gz ←■ ezmlm 展開
[root@linux ~]# tar zxvf ezmlm-idx-6.0.1.tar.gz ←■ ezmlm-idx 展開

[root@linux ~]# cd ezmlm-0.53 ←■ ezmlm 展開先ディレクトリへ移動

[root@linux ~]# /bin/cp -r ezmlm-idx-6.0.1/* ezmlm-0.53 ←■ ezmlm-idx 展開先ディレクトリ内全ファイルを ezmlm 展開先ディレクトリへコピー

[root@linux ezmlm-0.53]# patch < idx.patch ←■ ezmlm-idx パッチ施行
patching file auto-str.c
patching file case_startb.c
~ 中略 ~
patching file surf.c
patching file surfpcs.c

[root@linux ezmlm-0.53]# echo ja > conf-lang ←■ メーリングリストシステムからのメールの日本語化
[root@linux ezmlm-0.53]# echo c:::644:/ja/:charset:lang/ja/charset >> ETC ←■ メーリングリストシステムからのメールの日本語化

[root@linux ezmlm-0.53]# make && make setup ←■ インストール

[root@linux ezmlm-0.53]# cd ←■ ezmlm展開先ディレクトリを抜ける
[root@linux ~]# rm -rf ezmlm-0.53 ezmlm-idx-6.0.1 ←■ 今後必要無い場合、ezmlm ezmlm-idx 展開先ディレクトリ削除
[root@linux ~]# rm -f ezmlm-0.53.tar.gz ezmlm-idx-5.1.1.tar.gz ←■ 今後必要無い場合、ezmlm.tar.gz ezmlm-idx.tar.gz 削除

ezmlm のパス → /usr/local/bin/ezmlm


【qmailadmin インストール】

qmailadmin 最新版確認 → http://sourceforge.net/project/showfiles.php?group_id=6691&package_id=6782

[root@linux ~]# wget http://jaist.dl.sourceforge.net/sourceforge/qmailadmin/qmailadmin-1.2.11.tar.gz ←■ qmailadminダウンロード

[root@linux ~]# tar zxvf qmailadmin-1.2.11.tar.gz ←■ qmailadmin 展開

[root@linux ~]# cd qmailadmin-1.2.11 ←■ qmailadmin 展開先ディレクトリへ移動

[root@linux qmailadmin-1.2.11]# vi template.c ←■ ログインページでの qmailadmin vpopmail のバージョン非表示化
+----------------------------------------------------------------------------------------------------
| /* show version number */
| case 'V':
| printf("%s %s
",
| QA_PACKAGE, QA_VERSION);
| printf("%s %s
",
| PACKAGE, VERSION);
| break;
+----------------------------------------------------------------------------------------------------
   ↓■ 変更 447行目辺り
+----------------------------------------------------------------------------------------------------
| /* show version number */
| case 'V':
| printf("%s
", ←■ ' %s' を除去
| QA_PACKAGE); ←■ ', QA_VERSION' を除去
| printf("%s
", ←■ ' %s' を除去
| PACKAGE); ←■ ', QA_VERSION' を除去
| break;
+----------------------------------------------------------------------------------------------------

[root@linux qmailadmin-1.2.11]# ./configure \
--enable-htmldir=/home/vpopmail/public_html \
--enable-cgibindir=/home/vpopmail/public_html/cgi-bin \
--enable-qmaildir=/var/qmail \
--enable-imagedir=/home/vpopmail/public_html/images \
--enable-imageurl=/images \
--enable-ezmlm-mysql=n \
--enable-help

[root@linux qmailadmin-1.2.11]# make
[root@linux qmailadmin-1.2.11]# make install-strip ←■ qmailadmin インストール

[root@linux qmailadmin-1.2.11]# cd ←■ qmailadmin 展開先ディレクトリを抜ける

[root@linux ~]# rm -rf qmailadmin-1.2.11* ←■ 今後不要な場合、qmailadmin 展開先ディレクトリ、ダウンロードしたqmailadmin 削除


【qmailadmin-help インストール】

qmailadmin-help 最新版確認 → http://sourceforge.net/project/showfiles.php?group_id=6691&package_id=85257

[root@linux ~]# wget http://jaist.dl.sourceforge.net/sourceforge/qmailadmin/qmailadmin-help-1.0.8.tar.gz ←■ qmailadmin-help ダウンロード

[root@linux ~]# tar zxvf qmailadmin-help-1.0.8.tar.gz ←■ qmailadmin-help 展開

[root@linux ~]# mkdir /home/vpopmail/public_html/images/help ←■ qmailadmin-help 格納先ディレクトリ作成

[root@linux ~]# cp -rp qmailadmin-help-1.0.8/* /home/vpopmail/public_html/images/help ←■ qmailadmin-help を上記ディレクトリへコピー

[root@linux ~]# rm -rf qmailadmin-help-1.0.8* ←■ 今後不要な場合、qmailadmin-help 展開先ディレクトリ、ダウンロードしたqmailadmin-help 削除


【qmailadmin パーミッション設定】

[root@linux ~]# chown -R vpopmail:vchkpw /home/vpopmail/public_html
[root@linux ~]# chmod +s /home/vpopmail/public_html/cgi-bin/qmailadmin


Apache 設定

【設定ファイル(httpd.conf)の編集 】

VirtualHost用の別ファイルを設置している場合は、/etc/httpd/conf.d/virtualhost.conf 等に記述しても良い

[root@linux ~]# vi /etc/httpd/conf/httpd.conf ←■ 設定ファイル編集

DocumentRoot /home/vpopmail/public_html
ServerName example.jp ←■ 適宜、使用するドメインに書き換える

SetHandler cgi-script
AllowOverride None


# ▼ https forward # ←■ https でのアクセス設定をしている場合

RewriteEngine On
RewriteCond %{SERVER_PORT} !^443$
RewriteRule ^/cgi-bin/qmailadmin(.*)$ https://%{HTTP_HOST}/cgi-bin/qmailadmin [L,R]

# ▲ https forward #



# ▼ SSL用 VirtualHost 設定 # ←■ httpsでアクセスする場合のVirtualHost設定

DocumentRoot /home/vpopmail/public_html
ServerName example.jp

SetHandler cgi-script
AllowOverride None


# ▲ SSL用 VirtualHost 設定 #

:wq ←■ 保存して閉じる

[root@linux ~]# /etc/rc.d/init.d/httpd reload ←■ Apache設定反映
httpd を再読み込み中: [ OK ]
[root@linux ~]#


私はDocomoの携帯しか持ってないので、事前にauとsoftbankを持ってる友人に頼んで、メールヘッダなどを調査したらこんな感じ↓

■ Docomo
----------------------------------------------------------------------------------
From ****@docomo.ne.jp Wed May 26 17:54:11 2010
Return-Path: <****@docomo.ne.jp>
X-Original-To: ***@igreks.jp
Delivered-To: ***@igreks.jp
Received: from localhost (localhost.localdomain [127.0.0.1])
by ***.igreks.jp (Postfix) with ESMTP id 5DE338B41B2
for <***@igreks.jp>; Wed, 26 May 2010 17:54:11 +0900 (JST)
X-Virus-Scanned: amavisd-new at igreks.jp
Received: from ***.igreks.jp ([127.0.0.1])
by localhost (igreks.jp [127.0.0.1]) (amavisd-new, port ****)
with ESMTP id kkpANBxiUasa for <****@igreks.jp>;
Wed, 26 May 2010 17:54:11 +0900 (JST)
Received: from docomo.ne.jp (mail108.docomo.ne.jp [203.138.203.8])
by ***.igreks.jp (Postfix) with ESMTP id 3E6618B40B0
for <***@igreks.jp>; Wed, 26 May 2010 17:54:11 +0900 (JST)
Date: Wed, 26 May 2010 17:54:09 +0900 (JST)
From: ****@docomo.ne.jp
To: ***@igreks.jp
Subject: =?iso-2022-jp?B?GyRCMSsbKEI=?=
Message-ID:
MIME-Version: 1.0
Content-Type: text/plain; charset="iso-2022-jp"
Content-Transfer-Encoding: 7bit

$BK\J8(B
----------------------------------------------------------------------------------


■ au
----------------------------------------------------------------------------------
From ****@ezweb.ne.jp Wed May 26 18:24:29 2010
Return-Path: <****@ezweb.ne.jp>
X-Original-To: ***@igreks.jp
Delivered-To: ***@igreks.jp
Received: from localhost (localhost.localdomain [127.0.0.1])
by ***.igreks.jp (Postfix) with ESMTP id F1F818B41B2
for <***@igreks.jp>; Wed, 26 May 2010 18:24:28 +0900 (JST)
X-Virus-Scanned: amavisd-new at igreks.jp
Received: from ***.igreks.jp ([127.0.0.1])
by localhost (igreks.jp [127.0.0.1]) (amavisd-new, port ****)
with ESMTP id CBSY6-Rv+mf6 for <***@igreks.jp>;
Wed, 26 May 2010 18:24:28 +0900 (JST)
Received: from ezweb.ne.jp (nx3oBP07-06.ezweb.ne.jp [59.135.39.240])
by ***.igreks.jp (Postfix) with ESMTP id D7FC88B40B0
for <***@igreks.jp>; Wed, 26 May 2010 18:24:28 +0900 (JST)
Received: from nxev04mp06 (localhost [127.0.0.1])
by nxev04mp06.ezweb.ne.jp (EZweb Mail) with SMTP id 955ED5BC640B4
for <***@igreks.jp>; Wed, 26 May 2010 18:24:28 +0900 (JST)
From: ****@ezweb.ne.jp
To: ***@igreks.jp
Subject: =?iso-2022-jp?B?GyRCMSsbKEI=?=
Message-ID: <2010052618242860697200007c12@nxev04mp06.ezweb.ne.jp>
Date: Wed, 26 May 2010 18:24:28 +0900
Mime-Version: 1.0
Content-Type: text/plain; charset="iso-2022-jp"
Content-Transfer-Encoding: 7bit

$B%6!<%6!<(B
----------------------------------------------------------------------------------


■ Softbank
----------------------------------------------------------------------------------
From ****@softbank.ne.jp Wed May 26 18:24:36 2010
Return-Path: <****@softbank.ne.jp>
X-Original-To: ***@igreks.jp
Delivered-To: ***@igreks.jp
Received: from localhost (localhost.localdomain [127.0.0.1])
by ***.igreks.jp (Postfix) with ESMTP id 975BD8B41B2
for <***@igreks.jp>; Wed, 26 May 2010 18:24:36 +0900 (JST)
X-Virus-Scanned: amavisd-new at igreks.jp
Received: from ***.igreks.jp ([127.0.0.1])
by localhost (igreks.jp [127.0.0.1]) (amavisd-new, port ****)
with ESMTP id HQrmiDMGcT3n for <***@igreks.jp>;
Wed, 26 May 2010 18:24:36 +0900 (JST)
Received: from mmrts049p01c.softbank.ne.jp (mmrts049p01c.softbank.ne.jp [123.108.236.27])
by ***.igreks.jp (Postfix) with SMTP id 6D9898B40B0
for <***@igreks.jp>; Wed, 26 May 2010 18:24:36 +0900 (JST)
Subject: =?ISO-2022-JP?B?GyRCJCYkcyQzGyhC?=
Mime-Version: 1.0
Content-Type:text/plain;charset=ISO-2022-JP
Content-Transfer-Encoding:7bit
Date: Wed, 26 May 2010 18:24:35 +0900
Message-ID: <20100526182435672870.2aea@0016E68F5982>
From: <****@softbank.ne.jp>
To: ***@igreks.jp
Sender:****@softbank.ne.jp
X-Priority: 3

$B%b%j%b%j(B
----------------------------------------------------------------------------------


仕様としては、

・DBはMySQL
・空メの送信先は「reg_kara_mail@igreks.jp」とする
・空メの件名に名前を指定できる。
・登録済みの場合はエラーメールを返す。
・空メ本文にメルマガIDをあらかじめ記載しておく。
・メルマガIDが認識できない場合もエラーメールを返す。
・読者データテーブル名は仮に「user_'メルマガID'」、文字コードはUTF8とする。

これを受けて、スクリプトはざっとこんな感じに。
※おおまかな流れだけで、細かい点は割愛してます


■ 空メール登録処理用CGI(karame.cgi)
-----------------------------------------------------------------------------------
#!/usr/bin/perl

package main;

use strict;
use CGI;
use DBI;
use Unicode::Japanese;

require './lib/get.pl'; #各種データ取得用ライブラリ(詳細割愛)
require './lib/proc.pl'; #各種処理用ライブラリ(詳細割愛)
require './lib/db.pl'; #DB接続、各種SQL実行用ライブラリ(詳細割愛)
require './lib/start.pl'; #メール配信用ライブラリ(詳細割愛)

&db::open(); #DB接続

my $sys_msg = ''; #エラー返信用メッセージ
my ($email, $name, $id);

###### メールから標準入力をパース
my $grep = '[\d\w-.+]+\@[\d\w-]+(\.[\d\w-]+)+'; #メールアドレスの正規表現

while(<>){
 if($_ =~ /^From.*?($grep)/i || $_ =~ /^Return-Path:.*?<($grep)>/i){
  $email = $1; #メールアドレス
 }
 if($_ =~ /^Subject:\s*(.+)$/i){
  $name .= $1; #名前
 }
 if($_ =~ /^\s*(=\?ISO-2022-JP.+\?=)\s*$/i){ #件名が途中で改行されてる時のため
  $name .= $1;
 }
 if($_ =~ /^mid:(.+)$/){
  $id = $1; #メルマガID
 }
}
if($email){
 if($id){
  my $stg = &get::setting_data($id); #メルマガ設定データ取得
  if($stg){
  ####### 読者テーブル内重複チェック
  &db::query("
   SELECT * FROM user_$id WHERE email='$email'
  ");
  my $href = $db::sth->fetchrow_hashref();
  if($href){
   #すでに登録済みの場合
   $sys_msg = <<EOM;
    送信いただいたメールアドレス「$email」はすでに登録済みです。
    このまま次回の配信をお待ちください。
EOM
   $sys_msg =~ s/\t//g;
   #メール返信処理
   &start::return_mail(
    '空メール登録処理エラー',
    $sys_msg,
   );
   exit;
  }
  if($name){
   #名前の入力があった場合
   $name = Unicode::Japanese->new(
    &proc::base64decode($name), #Base64デコード処理
    'jis'
   )->utf8; #JISからUTF8に変換
  }
  ######## 新規登録
  &db::query("
   INSERT IGNORE INTO user_$$pd{'id'} (
    no,  #オートインクリメント
    email,
    name,
    ・
    ・
    ・
   )
   VALUES(
    '',
    '$email',
    '$name',
    ・
    ・
    ・
   )
  ");
 }
 else{
  $sys_msg = <<EOM;
   登録しようとしたメールマガジンは存在しないか、すでに廃刊されています。
   お手数ですが、詳しくは発行者までお問い合わせください。
EOM
 }
}
else{
 $sys_msg = <<EOM;
  送信いただいた情報に不備があり登録できませんでした。
  空メール本文の内容は変更せずに送信してください。
  何度もこのエラーメールが返信される場合は、お手数ですが発行者までお問い合わせください。
EOM
}

########## エラー返信処理
if($sys_msg){
 &start::return_mail(
  '空メール登録処理エラー',
  $sys_msg,
 );
}
&db::close(); #DB切断

exit;

-----------------------------------------------------------------------------------



■Postfixエイリアス設定ファイル(/etc/aliase)に以下を追加
-----------------------------------------------------------------------------------
reg_kara_mail:  "|cd 'karame.cgiがあるディレクトリの絶対パス'; ./karame.cgi"
-----------------------------------------------------------------------------------

■リスタート
-----------------------------------------------------------------------------------
# newaliases

# /etc/init.d/postfix restart
-----------------------------------------------------------------------------------


■以下のようなメールを「reg_kara_mail@igreks.jp」宛に送る

 件名:自分の名前もしくは空白
 本文:mid:melmagaID

以上。


※レンタルサーバなどでエイリアスが設定できない場合は、後からcronなどでPOPアクセスして処理するなどの方法もある。(参考→http://www.igreks.jp/dev/2009/06/pop.html
この場合は返信メールが即時配信されない。


※ディズニーモバイルとかwilcomは調べてないけど、まあだいたい同じだべってことで。
毎日決まった時刻に送られてくる自動メルマガがなぜか今日は送られてこない。

おかしいなと思いつつもこういうときに限って日曜日で出かけたりしてる。


帰ってからサーバをチェックしてみるとなんと配送されてないキュー(deferedにたまりっぱなし)が約7000件・・・。


maillogをチェックしようにもどうやらログが膨大になりすぎてなかなか問題の部分が表示されない・・・

ようやく確認できたのが、

LibClamAV Warning: ***********************************************************
LibClamAV Warning: *** This version of the ClamAV engine is outdated. ***
LibClamAV Warning: *** DON'T PANIC! Read http://www.clamav.net/support/faq ***
LibClamAV Warning: ***********************************************************
LibClamAV Error: cli_hex2str(): Malformed hexstring: This ClamAV version has reached End of Life! Please upgrade to version 0.95 or later. For more information see www.clamav.net/eol-clamav-094 and www.clamav.net/download (length: 169)
LibClamAV Error: Problem parsing database at line 742
LibClamAV Error: Can't load daily.ndb: Malformed database
LibClamAV Error: cli_tgzload: Can't load daily.ndb
LibClamAV Error: Can't load /usr/XXXXXX/clamav/daily.cld: Malformed database
ERROR: Malformed database

とゆー部分。


最初の4行はいつものことなのでいいんだが、その後になんか見慣れないエラーが。

ここに気づくまでにかなりハマってしまい、amavisの設定ファイルやclamavの設定ファイルをいろいろいじくってみたり、パッケージをインストールしなおしてみたりしてもさっぱり変わらず、ようやくこちらのサイト
http://homepage.mac.com/yuji_okamura/iSawIt/archives/2010/04/entry_2452.html
のおかげで原因ぽいのがわかりました。

つまり簡単に言うと、clamavのバージョンを0.95以上にしないと、ついにファイルのスキャンができなくなりましたってゆーことらしい。

たしかにmaillogの他の部分を見てみると、「clamavのソケットに接続できなくてウイルススキャンに失敗しました」→「配送に失敗しました」みたいな流れがずらっと続いている。
(でもRPMで定期的に更新してんのはamavisの方なんだから、フツーは最初にamavisの方を疑うよなぁ・・・)


ほんでもって例のごとく、clamavの最新パッケージはyumから引っ張れないので以下を参考に、最新版のソースをダウンロードしてアップデートをしたわけです。

http://d.hatena.ne.jp/ooolong/20080102/1199294335
http://yokensaka.com/fedora/index.php?itemid=158

一個目のリンクはどうやら2個目のリンクの対処法を元に書いてあるみたいなんだけど、「yumのclamavパッケージ(依存も含む)を削除しておく」ってゆーのがウチの環境ではいけなかったみたいですね。
yumで削除したらinit.dのリストまでいじくられるわけで、デーモン(サービス)一覧からamavisデーモンまで無くなってしまったわけで・・・

ほんなわけで、再度yumからamavis-new、clamav、clamav-serverなどなど依存関係も含めてまるごとインストールしなおしてinit.dを元に戻した状態で、clamavの最新ソースを入れ直し(configure→make→make install)たらうまく行ったのです。


以上の作業が終わった時点から、溜まってたキューがどんどん送信され始めました。


ただ、GUIでサービス一覧を確認すると、amavisdは復活したけど今まであったclam.amavisdは復活しない。

でもコマンドで、
-----------------------------------

chkconfig --list

-----------------------------------
で確認すると、デーモン一覧にclamd.amavisdが入っている。
どうやらGUIにはパッケージでインストールしたものしか反映されないっぽい。

とりあえず、起動してみる。
-------------------------------------

/etc/init.d/clamd.amavisd start

------------------------------------


よし!起動成功!
ついでにランレベル3から5をONにする。

----------------------------------------

chkconfig clamd.amavisd on

---------------------------------------


デーモンを起動するとmaillogで騒いでた、「clamd.sock」が「/var/spool/amavisd」の中に出現。

これで「clamd.sockが見つかりません」というエラーが解決でき、点と点がつながったわけだ。

あ、そうそう、freshclamの定期実行もデフォルトに戻ってしまうみたいなので、
「/etc/sysconfig/freshclam」を開いて、最後の行をコメントアウトする。

-----------------------------------------------------------------------

FRESHCLAM_DELAY=disabled-warn # REMOVE ME
     ↓
#FRESHCLAM_DELAY=disabled-warn # REMOVE ME

----------------------------------------------------------------------


しかしclamavのおかげで費やした労力は今までも計りしれず、これからもこんな感じでやんなきゃなんねーのかと思うと、他のアンチウィルスソフトを使いたくなってしまうのは私だけではないはず。