がらくたネット


qmail関係の情報

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重バウンスの宛先

既定値での流れは以下となる

  1. non-user@e-garakuta.net宛にspam@non-exist.comからメール送信
  2. qmailが受け付ける
  3. non-user@e-garakuta.netはUser Unknownとなる
  4. 送信元spam@non-exist.comへUser Unknownメールを送信する(これがバウンスメール!)
  5. 送信先MTA側でもspam@non-exist.comはUser Unknownとなる
  6. 送信先MTA側からSMTPセッションを拒否されるかUser Unknownメールが戻ってくる(これがダブルバウンスメール!)
  7. 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.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
bouncefromMAILER-DAEMONqmail-send
bouncehostmeqmail-send
concurrencylocal10qmail-send
concurrencyremote20qmail-send
defaultdomainmeqmail-inject
defaulthostmeqmail-inject
databytes0qmail-smtpd
doublebouncehostmeqmail-send
doublebouncetopostmasterqmail-send
envnoathostmeqmail-send
helohostmeqmail-remote
idhostmeqmail-inject
localiphostmeqmail-smtpd
localsmeqmail-send
morercpthosts(none)qmail-smtpd
percenthack(none)qmail-send
plusdomainmeqmail-inject
qmqpservers(none)qmail-qmqpc
queuelifetime604800qmail-send
rcpthosts(none)qmail-smtpd
smtpgreetingmeqmail-smtpd
smtproutes(none)qmail-remote
timeoutconnect60qmail-remote
timeoutremote1200qmail-remote
timeoutsmtpd1200qmail-smtpd
virtualdomains(none)qmail-send

qmail-qstat 現在のキュー状態 qmail-qread 滞留キューの情報表示

キューの削除

  1. qmailを停止
  2. qmail-qreadで削除キューのメッセージIDを確認
  3. 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)なんだろ?

ログ

ログについて覚書
ここ参照

new msg m → mはinode番号

info msg m : bytes b from → mはinode番号

end msg m → mはinode番号

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