メール配信の最近のブログ記事

前回に引き続きphpBB(phpBB2)ネタ。

当然ながら日本語でphpBBを運用する場合は、普通、MySQLのマルチバイト文字セットはEUCかUTF8になっている。

しかし、デフォルトのまだと、システムから送られてくるメールの、DBのマルチバイトを参照した部分の文字列が化ける。

以下対策

・language/language_japanese/email の中のファイル全てを、MySQLの文字コードに合わせてエンコードを修正する。
(SJISなどでアップされていたらEUCかUTF8で保存して上書き)

・各ファイルの「Charset: iso-2022-jp」と書かれているところを、全て
「Charset: EUC-JP」 か、
「Charset: UTF8」
に書き換える。

以上
備忘録です。

ある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を再起動して終了。


無事、送信できるようになりました。
よかったよかった。
システム開発上、ユーザがブラウザからメールマガジンを作成した時に、同時にエラーメール処理用のアドレスも作成されるようにする、逆にメルマガを削除したらそのアドレスも削除される必要があったためメモ。

今回の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 ~]#


milystepはメルマガごとに配信履歴テーブル(his)とクリック測定用テーブル(cs)がある。

クリック測定テーブルには全てのURLのデータが入っていて、各レコードはどの配信履歴に対応しているか判別するためのナンバーが格納されている。

簡単に書くとこんな感じ

csテーブル
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
 no   | url    | click  | his_no(対応するhisのナンバー)  
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
 1    | http://.... | 3    |  2
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
 2    | http://.... | 1    |  2
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
 3    | http://.... | 0    |  3
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
 4    | http://.... | 12   |  3

        ・
        ・
        ・
hisテーブル
ーーーーーーーーーーーーーーーーーーーーーーー
 no  | subject   | body 
ーーーーーーーーーーーーーーーーーーーーーーー
 1   | こんにちは | ご無沙汰してます...
ーーーーーーーーーーーーーーーーーーーーーーー
 2   | 忘年会の件 | 場所が決まりました...
ーーーーーーーーーーーーーーーーーーーーーーー
 3   | ハロー   | 元気ですか?...
ーーーーーーーーーーーーーーーーーーーーーーー
 4   | 了解です  | 例の件ですが...
        ・
        ・
        ・



このとき、hisのテーブルに、csの対応するhisナンバーのクリック数(click)の合計をtotal_clickとしてSELECTしたい。

イメージとしては、こんな感じ。

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
 no  | subject   | body        | total_click
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
 1   | こんにちは | ご無沙汰してます... | 0
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
 2   | 忘年会の件 | 場所が決まりました...| 4(cs.his_noが2のclickの合計)
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
 3   | ハロー   | 元気ですか?...   | 12(cs.his_noが3のclickの合計)
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
 4   | 了解です  | 例の件ですが...   | 0
        ・
        ・
        ・


なので最初は、サブクエリを使って、
-------------------------------------------------------------
SELECT
 *,
 (
  SELECT
   SUM(cs.click) FROM cs
  WHERE cs.his_no = his.no
 ) AS total_click
FROM his
-------------------------------------------------------------

みたいにやってたのだが、あまりにも遅い。
300件程度の処理で明らかに体感速度が数秒違うので、これはヤバい。

というわけで、一旦テンポラリテーブルを作ってそれをLEFT JOINさせる。

-------------------------------------------------------------
CREATE TEMPORARY TABLE temp AS
 SELECT
  his_no,
  SUM(click) AS total_click
 FROM cs
 GROUP BY his_no;

SELECT
 *,
 temp.total_click
FROM his
LEFT JOIN temp ON
 his.no = temp.his_no;
-------------------------------------------------------------

これでだいぶ改善。

データが数千件になったときはどうなるかまだわからない。


参考ページ
http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/mysql_09.htm
http://oss.timedia.co.jp/show/MySQL%E6%97%A5%E6%9C%AC%E8%AA%9E%E3%81%AE%E6%97%85/%E4%B8%80%E6%99%82%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%81%AE%E5%A0%B4%E5%90%88%E3%81%AF%E3%81%A9%E3%81%86%E3%81%AA%E3%82%8B%E3%81%8B
http://labs.mythos-jp.com/blog/archives/246


共用サーバなどでCPU一定時間使用でプロセスが切断されてしまう。
したがって、ゆっくりメール配信してると、配信が途中で終わってしまうのでその対策。


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

# 宛先セット
my @to = ('aaa@aaa.com','bbb@bbb.com','ccc@ccc.com',.....);

# 指定事項
my $mass = 10; # 一斉送信数
my $intervals = 60; # 待機時間(秒)
my $switch_proc = 1; # プロセス切り替えを行う場合は1
my $switch_time = 30; # プロセス切り替え時間(秒)

#プロセス開始時間セット
my $proc_start = time;

# ループ開始
for(my $i=0; $i<@to; $i++){
 # SENDラベル開始
 SEND:{
  # メール配信処理開始
  if(!open(MAIL, "| /usr/lib/sendmail")) {
   die "※Open failed sendmail!";
  }
  print MAIL <<EOM;
From: from@from.com
To: $to[$i]
Return-Path: from@from.com
Reply-To: from@from.com
Subject: TEST MAIL
Content-type: text/plain; Charset="ISO2022-JP"
Content-Transfer-Encodeing: 7bit

Here is mailbody
EOM
  close MAIL;
  # メール配信処理終了

  if($mass != 0 && $intervals != 0){
   if(($i+1) % $mass == 0 && $i+1 != @to){
    # 一斉送信数を送信後の待機
    for(my $sec=0; $sec<$intervals; $sec++){
     # WAITラベル開始
     WAIT: {
      # 1秒スリープ
      select(undef,undef,undef,1);
       if($switch_proc && (time - $proc_start) >= $switch_time && ($sec+1 != $intervals)){
        my $new_pid = '';
         if($new_pid = fork){
          # 子プロセス生成に成功したら終了
          exit;
         }
         elsif(defined $new_pid) {
          # プロセス開始時刻更新
          $proc_start = time;
          &db::open(); # 念のためDB再接続処理(詳細割愛)
          $sec++; # ここでインクリメントしないと無限ループになるので注意
          redo WAIT;
         }
         else{
         # プロセスが多すぎたり、一時的にフォークできないときは次回
          next;
         }
       }
     }# end of WAIT
    }
   }
  }

  # 同様の処理
  if($switch_proc && (time - $proc_start) >= $switch_time && ($i+1 != @to)){
   my $new_pid = '';
   if($new_pid = fork){
    exit;
   }
   elsif(defined $new_pid) {
    $proc_start = time;
    &db::open();
    $i++;
    redo SEND;
   }
   else{
    next; # もしくはエラー終了
   }
  }
 }# end of SEND
}# end of for
携帯3キャリア対応の絵文字・デコメが使えるメールシステム開発時にハマった点。
ハマり時間約10時間・・・

まず、デコメールの各キャリア向けのメールデータの組み立ては、すでに既知の方法で特に問題なく送信できた。
(2010/9/4現在)
【参考サイト】
http://pentan.info/mobile/send_deco.html など

しかし、ドコモ&ソフバンは上手くいくのに、auのデコメだけは添付画像(インラインHTML表示)がうまくいかない・・・というか、ばらつく。

サイズが1KB前後の画像ファイルは正常にインライン表示されるのだが、少しサイズが大きくなる(2KB前後)と、インラインに表示されず、別途添付ファイルのみダウンロードしようとしてもなぜかできない。
しかもインラインFLASH対応機種なはずなのに、swfファイルも再生されない。
(検証した機種はSH005)

これについて悩んでいたら、以下のサイトを発見。
http://www.plusmb.jp/2009/09/04/4481.html
てゆうか、よく見たら冒頭のサイトにもちゃんと書いてあるし・・・

これによると「auは、サイズが大きめの添付ファイルは、base64エンコードした後76byteごとに改行を入れる必要がある」らしい。

しかし、なんでいきなりこんな話になるのかと思って少し調べたら、どうやらRFCに準拠したBase64エンコードは、76byteごとに改行文字を入れなさいということらしい。
(ただしsubjectの64エンコードでこれをやるとダメ)

もともと実績のあるMIME.pmとかのbase64メソッドを使ってエンコードしていれば問題なかったのだが、私の場合、スクリプト配布時のことを考えて、自力で64エンコードしていたため、ハマったらしい。
(MIME.pm内を見てみると、たしかに76byteごとに改行を入れる処理があった・・・)

よって、対応策としては、
添付ファイルデータをくっつけるときに、

$buf = &base64encode($buf); #自力の64エンコードサブルーチン
のあと、
$buf =~ s/(.{1,76})/$1\n/g;

という処理を加えることで解決。

これを、メール内のtext/htmlパートにくっつけてやればよい。
(もちろんflashの場合は、flashのmimeタイプを指定)

しかし、docomoとsoftbankはこの処理をやらなくてもちゃんと送れるもんだから、最初は携帯の設定が悪いんだとばっかり思ってました・・・



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

以下は、2010/9/4現在の検証でわかったことのまとめ。

検証機種は、
ドコモ・・・P08A(松下)
au・・・SH005(シャープ)
Softbank・・・930CA(カシオ)

・KDDIの技術資料(http://www.au.kddi.com/ezfactory/tec/spec/decorations/emoji.html)には、デコメ絵文字は20×20ドット指定になっているが、120×25くらいのファイルでも送信できた。
 また、Dispositionは指定しなくても問題なかった。

・swfファイルのサイズ制限は特に書いていないが、50px×50px(約2KB)は3キャリアとも送信できた。ただし、機種により再生の滑らかさはだいぶ差がある模様。

・冒頭に紹介したサイトでは、HTMLソースはquoted-printableエンコードすると書いてあるが、特にこれを行わず、「Content-Transfer-Encodeing: 7bit」で送信しても、特に問題なかった。

また、Softbankにおいては、HTMLソースをUTF8で送信(quoted-printableエンコードなし)しても特に問題なかった。

また、text/plainとtext/htmlの両方のパートが無いとダメと書いてあるが、docomoとsoftbankにおいては、text/plainパートを記述しなくても問題なく送信できた。


以上、ご参考までに。
子プロセスに処理を渡して、親プロセスで標準出力を切るとき、

my $pid;
if($pid = fork){
 #親の処理
 close (STDOUT);
 wait;
}
elsif(defined $pid){
 close (STDOUT);
 #子の処理
}
 ・
 ・
 ・


みたいな感じで今までOKだったのだが、ロリポップ系サーバなどではこれがうまく行かない。ブラウザの出力自体は切れるのだが、子プロセスの処理を行ってくれない。

WEBサーバによって変わると聞いたことがあるので、ググってみたところ、標準出力を切る部分を、

close (STDOUT);
close (STDERR);
close (STDIN);

とやったら上手く行った。

apache2.0系(うちの環境)とapache1.3系(ロリポップ系?)でどうやら違うらしい。

ちなみに、上記3つの順番が違っても1つ足りなくてもダメだった。

close (STDIN);
close (STDOUT);
close (STDERR);

↑これだとなぜか子プロセスが終了するまでブラウザが開放されない


close (STDOUT);
close (STDERR);
close (STDIN);

↑この順番じゃないとダメみたい。

STDOUTだけだと、新しいapacheのときダメだよって聞いていたので、それとは逆の現象だが、解決したからまあいいか。
私は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は調べてないけど、まあだいたい同じだべってことで。