qmail関係の情報
qmail関係の情報まとめ
qmail contorolhttp://man.qmail.jp/jman5/qmail-control.html
バウンスメールの話
バウンス(bounce)メールとは何らかの理由で送信できずに送り返されたメールのことで 通常は送信元メールアドレス宛に送付される
ダブルバウンスとはバウンスメールが何らかの理由で配送不能となったメールのこと
qmailでは以下のcontrol fileが利用できる
既定値 | 内容 | |
---|---|---|
bouncefrom | MAILER-DAEMON | 差戻し送信者名 |
bouncehost | me | 差戻しホスト名 |
doublebouncehost | me | 2重バウンスホスト名 |
doublebounceto | postmaster | 2重バウンスの宛先 |
既定値での流れは以下となる
- non-user@e-garakuta.net宛にspam@non-exist.comからメール送信
- qmailが受け付ける
- non-user@e-garakuta.netはUser Unknownとなる
- 送信元spam@non-exist.comへUser Unknownメールを送信する(これがバウンスメール!)
- 送信先MTA側でもspam@non-exist.comはUser Unknownとなる
- 送信先MTA側からSMTPセッションを拒否されるかUser Unknownメールが戻ってくる(これがダブルバウンスメール!)
- qmailが受け付けて
phpなどからメール送信する場合の問題
phpのmb_send_mail()で送信する場合は、パラメータとして-f<envelope_from>をきちんと 渡すように書かないといけないhttp://www.php.net/manual/ja/function.mb-send-mail.php
qmail-injectはメールを受信した際にReturn-Pathが含まれていなければ自動挿入する
自動挿入されるアドレスは ログイン名 or anonymous@defaulthost となる
pleskでのqmail
plesk 7.5.4ではqmailが利用されている
その制御方法をメモ
- 追加ドメインは/var/qmail/control/virtualdomainsに追加される
この時、ファイルには
hogehoge.com:<num>と記載される。
<num>部分はpleskが割り振るドメイン番号となる。
これでinfo@hogehoge.com宛のメールはlocalの<num>-info@hogehoge.com宛に送信されることになる
- ドメインの各アカウントは/var/qmail/users/assignに追加される
この時、ファイルには
=<num>-info:popuser:110:110:/var/qmail/mailnames/hogehoge.com/info::: +<num>:popuser:110:110:/var/qmail/mailnames/hogehoge.com:::と記載される。
virtuladomainsファイルでメールアドレスは<num>-info@hogehoge.comに変換されているので
このassignファイルで該当する行設定に基づき、/var/qmail/mailnames/hogehoge.com/info宛に
ローカル配送される
- メール機能をコンパネから停止すると、/var/qmail/control/virtualdomainsから該当行が削除される
assignファイルは残るため、アカウント情報は残っている
- popパスワードは/var/qmail/users/poppasswdに保存される
info:<cryptで暗号化された文字列>:popuser:/var/qmail/mailnames/hogehoge.com/info
と記載され、メール機能を停止しても削除されない
pleskでのqmailキュー削除
qmHandleとqueue-fast.plとの合わせ技
- queue-fast.plhttp://www.kawa.net/works/qmail/queue-fast.html
queue-fast.plとqmHandleを同じディレクトリに保存
qmHandleをviで開いてキューディレクトリ(/var/qmail/queue)とqmailの起動/停止スクリプト部分を適切に変更
queueu-fast.plをviで開いてキューディレクトリを適切に変更
viでDeleteQue.shを作成
./queue-fast.pl | grep -v ^# | grep 削除対象メールアドレス文字列 | sed -e 's/^\([0-9]*\/\)\([0-9]*\) R .*$/\.\/qmHandle -d\2/'
DeleteQue.shを実行して結果をdel.shにリダイレクト
# DeleteQue.sh > del.sh
del.shの中身がqmHandleでキューIDを指定して削除するように記述されているか確認して実行
# less del.sh ./qmHandle -d13847449 ./qmHandle -d13847381 # sh del.sh
完了!
qmailの削除
テスト環境でqmail+vpopmailを削除するには…
- rm -fR /var/qmail
- rm -fR home/vpopmail
- userdel qmailq
- userdel qmaill
- userdel qmaild
- userdel qmailp
- userdel qmailr
- userdel qmails
- userdel alias
- userdel vpopmail
- groupdel nofiles
- groupdel qmail
- groupdel vchkpw
- rm -fR /var/www/html/images/qmailadmin
- rm -fR /var/www/cgi-bin/qmailadmin
- rm -fR /var/www/cgi-bin/vqadmin
- rm -f /usr/lib/sendmail
- rm -f /usr/sbin/sendmail
- mv /usr/lib/sendmail.qmail /usr/lib/sendmail
- mv /usr/sbin/sendmail.qmail /usr/sbin/sendmail
- chkconfig sendmail on
- rm -f /usr/bin/newaliases
- mv /usr/bin/newaliases.qmail /usr/bin/newaliases
- rm -f /usr/local/bin/{tcpserver,tcprules,tcprulescheck,addcr,argv0,delcr,tcpclient,tcpcat,rblsmtpd,http@,date@,finger@,who@,fixcrio,recordio,mconnect-io}
- rm -f /usr/local/bin/vqadmin
- rm -fR /usr/local/bin/ezmlm
tcpserverのSSL化
tcpserverにSSL対応パッチを適用することでSMTPS/POPSが利用可能
- パッチ適用して、make実行して生成されるtcpserverのバイナリをコピーして利用する
- パッチ適用した後、make setup checkをやるとエラーになる
install: fatal: unable to read addcr.0: file does not exist 理由は、Makefileにパッチ適用されるのだが、この中で必要ファイルは makeのみでしか作成できない様子
- 他のパッチを適用すると、エラーになる
Reversed (or previously applied) patch detected! Assume -R? [n] 理由は各種ファイルをucspi-tcp-ssl-20050405.patchがパッチ適用しているため 他のパッチが見ているファイルの中身が変更されるからだ
インスト手順は簡単明快!
# tar zxvf ucspi-tcp-0.88.tar.gz # cd ucspi-tcp-0.88 # patch < .../ucspi-tcp-ssl-20050405.patch # make # service qmaild stop ← tcpserverバイナリを上書きするので停止しておく必要あり # mv /usr/local/bin/tcpserver /usr/local/bin/tcpserver.org # cp tcpserver /usr/local/bin/tcpserver
後は、qmail起動スクリプトに証明書を食わせればOK
- tcpserverの引数に -n 証明書ファイル を付け加える
- 証明書ファイルには秘密鍵(と必要ならば中間証明書)を付け加える
- 秘密鍵のパスフレーズは解除しておく
- ポート番号をsmtps(465番)とpop3s(995番)にする
これだけでOKよーん
おっと、Firewallのポートを空けるのを忘れないように!
qmail設定
qmail-showctlを実行する事で認識している設定一覧が表示される。
qmailの動作には最低限meファイルのみが存在すればよい
meファイル内はホストのFQDN名が記載されている必要あり
コメントが許可されるのはbadmailfrom、locals、percenthack、rcpthosts、smtproutes、virtualdomainsである。
参考
ファイル名 | 規定値 | 利用プログラム |
---|---|---|
badmailfrom | (none) | qmail-smtpd |
badmailpatterns | (none) | qmail-smtpd |
badrcptto | (none) | qmail-smtpd |
bouncefrom | MAILER-DAEMON | qmail-send |
bouncehost | me | qmail-send |
concurrencylocal | 10 | qmail-send |
concurrencyremote | 20 | qmail-send |
defaultdomain | me | qmail-inject |
defaulthost | me | qmail-inject |
databytes | 0 | qmail-smtpd |
doublebouncehost | me | qmail-send |
doublebounceto | postmaster | qmail-send |
envnoathost | me | qmail-send |
helohost | me | qmail-remote |
idhost | me | qmail-inject |
localiphost | me | qmail-smtpd |
locals | me | qmail-send |
morercpthosts | (none) | qmail-smtpd |
percenthack | (none) | qmail-send |
plusdomain | me | qmail-inject |
qmqpservers | (none) | qmail-qmqpc |
queuelifetime | 604800 | qmail-send |
rcpthosts | (none) | qmail-smtpd |
smtpgreeting | me | qmail-smtpd |
smtproutes | (none) | qmail-remote |
timeoutconnect | 60 | qmail-remote |
timeoutremote | 1200 | qmail-remote |
timeoutsmtpd | 1200 | qmail-smtpd |
virtualdomains | (none) | qmail-send |
qmail-qstat 現在のキュー状態 qmail-qread 滞留キューの情報表示
キューの削除
- qmailを停止
- qmail-qreadで削除キューのメッセージIDを確認
- rm -f /var/qmail/queue/*/*/<MessageID>
- idhost
- * Message-IDを生成するときのホスト名
QMAILIDHOST環境変数はこのidhostを上書きする
エラーコード
よく見るqmailのエラーコードを集めてみた。
これはレスポンスコードと呼ばれるもので3桁の数字から成り立っている。
エラーコードはそのログを見ると理由が記載されている。
1桁目 | 障害の種類 |
2桁目 | 障害の原因 |
3桁目 | 障害の症状 |
2xx番台 | 正常動作 |
3xx番台 | 正常動作 |
4xx番台 | 一時的エラー |
5xx番台 | エラー |
Success(250) | 送信成功! |
Deferral(421) | サービス提供不可、相手先メールボックスが一杯やサービスが有効でない場合 |
Deferral(443) | なんだろ? |
Deferral(450) | 宛先が許可されていない場合 |
Deferral(451) | 宛先が許可されていない、宛先サーバの不具合の場合 |
Deferral(452) | メッセージが拒否された |
Deferral(456) | なんだろ? |
Failure(501) | 宛先が不正 |
Failure(511) | 宛先メールボックスがない |
Failure(550) | メールボックスが有効でない、ユーザが存在していない |
Failure(551) | 宛先が拒否 |
Failure(553) | PTRレコードが不正 |
Failure(554) | 送信者が拒否、メールボックスが有効でない |
Failure(555) | なんだろ? |
ログ
patch
qmailのpatch関連
メモ qmail-spf-rc5.patchとqmail-smtpd-auth-0.31は相性が悪い qmail-spf-rc5.patchとその他のpatchを当ててから qmail-smtpd-auth-0.31を当てて Makefileとqmail-smtpd.cを修正する必要がある
- qmail-103.patch(bigdns)
- dns.c
- qmail-0.0.0.0.patch
- ipme.c
- qmail-1.03.errno.patch
- cdb_seek.c
- dns.c
- error.3
- error.h
- qmail-1.03.qmail_local.patch
- qmail-local.c
- qmail-date-localtime.patch
- date822fmt.c
- qmail-spf-rc5.patch
- byte_cspn.c
- byte.h
- byte_rcspn.c
- dns.c
- dnsfq.c
- dns.h
- dnsptr.c
- dnstxt.c
- FILES
- Makefile
- qmail-control.9
- qmail-showctl.c
- qmail-smtpd.8
- qmail-smtpd.c
- spf.c
- spf.h
- spfquery.c
- str_cpyb.c
- str.h
- strsalloc.c
- strsalloc.h
- TARGETS
- tcp-env.c
- qmail-smtpd-relay-reject
- qmail-smtpd.c
- qmailqueue-patch
- Makefile
- qmail.c
- qmail-smtpd-auth-0.31
- Makefile
- TARGET
- qmail-smtpd.8
- qmail-smtpd.c
モジュール関係
- checkpassword-0.90.errno.patch
- error.h
- fastforward-0.51.errno.patch
- error.h
- cdb_seek.c
- ucspi-tcp-0.88.a_record.patch
- rblsmtpd.c
- ucspi-tcp-0.88.errno.patch
- error.h
- ucspi-tcp-0.88.nobase.patch
- rblsmtpd.c
- ucspi-tcp-ssl-20050405.patch
- FILES
- Makefile
- TARGETS
- addcr.1
- argv0.1
- date@.1
- delcr.1
- error.h
- finger@.1
- fixcrio.1
- hier.c
- http@.1
- mconnect.1
- recordio.1
- tcp-environ.5
- tcpcat.1
- tcpclient.1
- tcprules.1
- tcprules.c
- tcprulescheck.1
- tcprulescheck.c
- tcpserver.1
- tcpserver.c
- who@.1