Last Update: "2012/01/20 21:45:58 makoto"

sendmail

最近の NetBSD は sendmail の代りに postfix が入っています。 2006/05/30 日頃からの話だと思います。 それをまた sendmail に戻す時の話です。
  1. mail/sendmail を入れる
    これには pkg_add が便利です
    ftp://ftp.jp.netbsd.org/pub/NetBSD-jp/mirror-status/packages.html を見て、例えば、次のような操作をします。
    export PKG_PATH=ftp://ftp.jp.netbsd.org/pub/pkgsrc/packages/NetBSD/i386/5.0.1_2009Q4/All
    pkg_add sendmail
    
    もし pkgsrc の枠が用意してあるなら、次のようにして src から make するのも良いでしょう
    cd /usr/pkgsrc/mail/sendmail sudo make package
  2. Build
    次に、/etc/mail/sendmail.cf を用意するのですが、 まず初めに、sendmail.mc -> sendmail.cf を生成する ./Build を用意します。 これには cf/cf 環境を用意して ./Build *.cf しますが、 cf/cf 環境を用意するにはいくつかの方法があります。
  3. /etc/mail/sendmail.mc を用意する
    netbsd-proto.mc(参考)
    http://cvsweb.netbsd.org/cgi-bin/cvsweb.cgi/src/gnu/usr.sbin/sendmail/cf/cf/Attic/netbsd-proto.mc
    #
    #  This is the prototype file for a configuration that supports SMTP
    #  connections via TCP and some commonly required features.
    #
    
    include(`../m4/cf.m4')
    VERSIONID(`@(#)netbsd-proto.mc	$Revision: 1.3 $')
    OSTYPE(bsd4.4)dnl
    DOMAIN(generic)dnl
    FEATURE(genericstable,DATABASE_MAP_TYPE` -o 'MAIL_SETTINGS_DIR`genericstable')
    FEATURE(mailertable,  DATABASE_MAP_TYPE` -o 'MAIL_SETTINGS_DIR`mailertable')
    FEATURE(virtusertable,DATABASE_MAP_TYPE` -o 'MAIL_SETTINGS_DIR`virtusertable')
    FEATURE(domaintable,  DATABASE_MAP_TYPE` -o 'MAIL_SETTINGS_DIR`domaintable')
    FEATURE(access_db,    DATABASE_MAP_TYPE` -T<TMPF> -o 'MAIL_SETTINGS_DIR`access')
    FEATURE(`redirect')
    FEATURE(`no_default_msa')
    MAILER(local)dnl
    MAILER(smtp)dnl
    
    # Enable IPv6.  IPv6 is marked as optional so the configuration file
    # can be used on IPV4-only kernel as well.
    DAEMON_OPTIONS(`Family=inet, address=0.0.0.0, Name=MTA, Modifiers=O')dnl
    DAEMON_OPTIONS(`Family=inet6, address=::, Name=MTA6, Modifiers=O')dnl
    define(`confLOCAL_MAILER', `cyrus')dnl
    Mcyrus,         P=[IPC], F=lsDFMnqA@/:|SmXz, E=\r\n,
                    S=EnvFromL, R=EnvToL/HdrToL, T=DNS/RFC822/X-Unix,
                    A=FILE /var/imap/socket/lmtp
    
    上記で最後に緑で示した 4 行は cyrus-imapd を local mailer に使う場合に追加する部分です。 また他からメールを受取らないようにする場合、つまり発信のみの利用であれば、 下から 5 行目付近を 次のように変更しておきます。
    DAEMON_OPTIONS(`Family=inet, address=127.0.0.1, Name=MTA, Modifiers=O')dnl
    DAEMON_OPTIONS(`Family=inet6, address=::1, Name=MTA6, Modifiers=O')dnl
    
  4. (上記 *.mc から *.cf を作る)
    前項で書いたように netbsd-proto.mc (名前は何でもいいのですが *.mc の形にします) を作成します。内容は上に書いてあるものです。 以前は以下の数行のようにして .mc -> .cf として /etc/mail に写していました。
    その上で、*.mc の .mc を .cf に変えた名前を指定 して ./Build を実行します。
    cd sendmail-8.14.3/cf/cf vi netbsd-proto.mc ./Build netbsd-proto.cf
  5. sendmail.cf と submit.cf を /etc/mail に写す(用意する)
    ttyp0:makoto@yoshimi 11:56:15/060728(...cf/cf)> sudo cp netbsd-proto.* /etc/mail/ ttyp0:makoto@yoshimi 11:56:17/060728(...cf/cf)> \ (cd /etc/mail; sudo ln -s netbsd-proto.cf sendmail.cf); sudo cp -p submit.?? /etc/mail/
    最近は /usr/pkg/share/sendmail/cf に README があり、その説明のように、このディレクトリに sendmail.mc の名前で置いて、
    make install-cf
    とすれば、作ってくれます。また名前が別のものであっても、
    make install-cf CF=netbsd-proto
    とすれば、netbsd-proto.mc から netbsd-proto.cf を作ってくれます。 (以上の作業は su または sudo -s の後に実行します)
    実行例
    t-105@makoto 21:39:22/120120(..sendmail/cf)% sudo make install-cf CF=netbsd-proto rm -f netbsd-proto.cf m4 ../m4/cf.m4 netbsd-proto.mc > netbsd-proto.cf || ( rm -f netbsd-proto.cf && exit 1 ) echo "### netbsd-proto.mc ###" >>netbsd-proto.cf sed -e 's/^/# /' netbsd-proto.mc >>netbsd-proto.cf chmod 444 netbsd-proto.cf /usr/bin/install -c -o makoto -g users -m 0444 netbsd-proto.cf /etc/mail/sendmail.cf /usr/bin/install -c -o makoto -g users -m 0444 submit.cf /etc/mail/submit.cf t-105@makoto 21:43:08/120120(..sendmail/cf)%
    もし、
    makoto 09:38:57/160124(..sendmail/cf)% sudo make install-cf CF=netbsd-proto rm -f netbsd-proto.cf m4 ../m4/cf.m4 netbsd-proto.mc > netbsd-proto.cf || ( rm -f netbsd-proto.cf && exit 1 ) echo "### netbsd-proto.mc ###" >>netbsd-proto.cf sed -e 's/^/# /' netbsd-proto.mc >>netbsd-proto.cf chmod 444 netbsd-proto.cf /usr/bin/install -c -o pbulk -g users -m 0444 netbsd-proto.cf /etc/mail/sendmail.cf install: unknown user pbulk *** Error code 1 Stop.
    のようになった時には
    makoto 09:38:57/160124(..sendmail/cf)% sudo make install-cf CF=netbsd-proto CFOWN=your_login
    のように CFOWN を指定します。
  6. /etc/mailer.conf を設定する
    sudo cp /usr/pkg/share/examples/sendmail/mailer.conf /etc/mailer.conf (または) sudo ln -sf /usr/pkg/share/examples/sendmail/mailer.conf /etc/mailer.conf
  7. もし自分の機械の名前以外にも受取りたい機械の名前があれば、 /etc/mail/local-host-names に自分の機械名を書いておく。 そうでない時には空の譜を作っておく。(sudo touch /etc/mail/local-host-names)
    ttypc:root@bologna 11:51:44/070404(/etc/mail)# echo bologna > /etc/mail/local-host-names ttypc:root@bologna 11:51:58/070404(/etc/mail)#
  8. /etc/rc.d/sendmail を用意する
    sudo cp /usr/pkg/share/examples/rc.d/sendmail /etc/rc.d ; sudo cp /usr/pkg/share/examples/rc.d/smmsp /etc/rc.d
  9. /var/spool/clientmqueue を用意する
    sudo mkdir /var/spool/mqueue ; sudo mkdir /var/spool/clientmqueue ; sudo chown smmsp.smmsp /var/spool/clientmqueue ; sudo chmod 770 /var/spool/clientmqueue ;
    これは既にある場合もあります。持主が smmsp になっているか確認します。
    ttypc:makoto@bologna 11:53:42/070404(/etc/mail)> sudo ls -ldn /var/spool/clientmqueue drwxrwx--- 2 1001 1001 512 Apr 3 14:10 /var/spool/clientmqueue ttypc:makoto@bologna 11:53:45/070404(/etc/mail)> id smmsp uid=17(smmsp) gid=17 groups=17 ttypc:makoto@bologna 11:53:50/070404(/etc/mail)>
    上記に示したのは 17 であるべきものが 1001 となっているので、良くない例です。
  10. /etc/rc.conf に sendmail の行を追加する
    sudo -s; echo sendmail=YES >> /etc/rc.conf ; echo smmsp=YES >> /etc/rc.conf ; echo postfix=NO >> /etc/rc.conf exit;
  11. /usr/pkg/libexec/sendmail 以下の許可を確認する
    ttypc:makoto@bologna 11:58:48/070404(/etc/mail)> ls -l /usr/pkg/libexec/sendmail total 1508 -r-xr-sr-x 1 root tinyproxy 683376 Mar 20 23:25 sendmail* -r-xr-xr-x 1 root wheel 75381 Mar 20 23:25 smrsh*
    これは良くない例です。group が smmsp になっていません 次のように言われるかも知れません。
    Program mode requires special privileges, e.g., root or TrustedUser.
    
    この文字が表示されるのは二通り考えられます。 一つは次に示した修正で直る場合。もう一つは、sendmail の処理 (process) を起動 するのが必要なのに、起動していない場合です。起動していないと /usr/bin/mail が直接 /var/spool/mqueue を書きに行って上記の文字を表示することがあります (この項 2011/11/25 追記)

    その場合は次のように修正します。

    ttypc:makoto@bologna 11:59:06/070404(/etc/mail)> \ sudo chgrp smmsp /usr/pkg/libexec/sendmail/sendmail ttypc:makoto@bologna DING!/070404(/etc/mail)> sudo chmod 2555 /usr/pkg/libexec/sendmail/sendmail ttypc:makoto@bologna 12:01:14/070404(/etc/mail)> ls -l /usr/pkg/libexec/sendmail total 1508 -r-xr-sr-x 1 root smmsp 683376 Mar 20 23:25 sendmail* -r-xr-xr-x 1 root wheel 75381 Mar 20 23:25 smrsh* ttypc:makoto@bologna 12:01:17/070404(/etc/mail)>
  12. sendmail を仮に起動して見る
    dl320@makoto 09:47:38/100127(..cf/cf)% /usr/sbin/sendmail -bt -v -d0 Version 8.14.4 Compiled with: DNSMAP LOG MAP_REGEX MATCHGECOS MILTER MIME7TO8 MIME8TO7 NAMED_BIND NETINET NETINET6 NETISO NETUNIX NEWDB NIS PIPELINING SCANF SOCKETMAP STARTTLS TCPWRAPPERS USERDB XDEBUG /etc/mail/sendmail.cf: line 0: cannot open: No such file or directory
    上記は /etc/mail/sendmail.cf が用意されていない場合です。おそらく上記 5. の段階を飛ばしてしまったかと思われます。
    sendmail.cf が用意してあれば、次のようになるはずです。
    dl320@makoto 09:51:48/100127(..cf/cf)% /usr/sbin/sendmail -bt -v -d0 Version 8.14.4 Compiled with: DNSMAP LOG MAP_REGEX MATCHGECOS MILTER MIME7TO8 MIME8TO7 NAMED_BIND NETINET NETINET6 NETISO NETUNIX NEWDB NIS PIPELINING SCANF SOCKETMAP STARTTLS TCPWRAPPERS USERDB XDEBUG ============ SYSTEM IDENTITY (after readcf) ============ (short domain name) $w = dl320 (canonical domain name) $j = dl320.example.com (subdomain name) $m = example.com (node name) $k = dl320.example.com ======================================================== ADDRESS TEST MODE (ruleset 3 NOT automatically invoked) Enter <ruleset> <address> >
    (最後は ^D で抜けます)
  13. postfix を止め sendmail と smmspを起動する
    sudo /etc/rc.d/postfix stop; sudo /etc/rc.d/sendmail start; sudo /etc/rc.d/smmsp start
  14. /etc/mail/aliases に次のような行を追加し、newaliases をしておきます。
      root: your_email@example.com
    
  15. メールを送って見る
    echo test mail from root | mail -s 'test mail for this machine' root echo test mail from root | mail -s 'test from root' address@example.com
    二つ目の例を実行する時には address@example.com には実在の宛先を使って下さい。
    上で root に送っていますが、 次のどちらかが必要です。
    • /etc/mail/aliases に 「root -> 誰か」の設定か、
    • imap 上に root 口座 (local mailer に imapd を使っている場合)
    can not write to queue directory /var/spool/clientmqueue/ (RunAsGid=0, required=1000): Permission denied
    
    というようなことがあるかも知れません。 上の場合ですと、実行 uid (/usr/pkg/libexec/sendmail/sendmail の持主 が 0 で、/var/spool/clientmqueue の group が 1000 になっていて、 合わない、ということになります。 (持主を変更した場合には s bit が落ちてしまいますので、それも復活しておきます)
    dl02@makoto 04:32:11/100301(..cf/cf)% sudo chown root.smmsp /usr/pkg/libexec/sendmail/sendmail dl02@makoto 04:32:48/100301(..cf/cf)% sudo chmod 2555 /usr/pkg/libexec/sendmail/sendmail dl02@makoto 04:32:52/100301(..cf/cf)% ls -l /usr/pkg/libexec/sendmail/sendmail -r-xr-sr-x 1 root smmsp 603690 Jan 10 20:59 /usr/pkg/libexec/sendmail/sendmail
  16. 実際に送られたかどうかを確認する 第一段階は /var/log/maillog を見ることです。 送られたメールが /var/mail/root に入っているかも知れません。

    相手、上の例では address@example.com のサーバの設定によっては、 (こちらの機械の名前を挙げて)、それは DNS に登録されていない名前だから 受取らないと言うことがあるかも知れません。
    もし今設定している機械が NAT (Network Address Translation) ルータの内側で、 外から見える名前になっていない等、それが本当であれば、回避方法の一つは sendmail.cf や submit.cf の最初の方にある j マクロの行、

    # my official domain name
    # ... define this only if sendmail cannot automatically determine your domain
    #Dj$w.Foo.COM
    
    この三行目の # を外し、Djmail.example.com 等のように書換えることです。 (変更した場合には、その後、
    sudo /etc/rc.d/sendmail restart; sudo /etc/rc.d/smmsp restart;
    とする必要があります)
以前に sendmail が入っていた頃の情報 http://www.ki.nu/software/NetBSD2/sendmail.html