戻る

Cygwinで便利!

exim の動作確認は Cygwin 1.3.22 で行いました。

また、このページでの作業は Administrators に所属しているユーザで
行うことを想定しています。
戻る

exim を使う

なぜ exim を使うのか

メールサーバを立てたいからに決まってます(笑)
メールサーバを立てると、
などなど、メール関係の大抵の事が出来るようになります。
何でも出来るメールサーバを Windows で作るには、
Cygwin 上の exim ぐらいしか選択肢は無いと思います。

なお、exim は MTA であって、POP サーバや IMAP サーバとは別物です。
混乱しないようにちゃんと別のサイトで違いを調べておいてくださいね。

必要なパッケージのインストール

私のページのインストール方法を使用した人は
特に確認する必要はありませんが、
それ以外の方法でインストールした人は Cygwin 本体以外に
以下のパッケージをインストールしておく必要があるので確認してください。
インストールは Cygwin 標準の setup.exe から実施しましょう。

sendmail からのシンボリックリンクを作成する

Linux / UNIX 出身のスクリプトなどは MTA として /usr/sbin/sendmail が
あることを期待しているものです。
そして、exim は sendmail 互換のため sendmail の役割を
全て exim に押し付けてしまって問題ないと思います。
exim に対して sendmail からシンボリックリンクを張りましょう。

$ if [ -L /usr/sbin/sendmail ]
> then
> rm -f /usr/sbin/sendmail
> ln -s /usr/bin/exim /usr/sbin/sendmail
> fi

MX レコードを登録しておく

mail を受信するには DNS に MX レコードと、
MX レコードに登録しているホストの A レコードが必要です。
これは直接 MTA とは関係ありませんので、
詳しく解説はしませんが、
subdomain1.doman.local 宛てのメールを受け取るには、
とりあえずこんな感じで必要です。
# 明示的にゼロレベルドメインから指定して query してます。

$ nslookup -querytype=mx subdomain1.doman.local. 2> /dev/null | grep MX
subdomain1.doman.local MX preference = 10, mail exchanger = mail.subdomain1.doman.local

$ nslookup mail.subdomain1.doman.local. 2> /dev/null
(snip)
Name:    mail.subdomain1.doman.local
Address:  203.180.111.111

Windows 上のサービスにインストール

インストーラが賢いので、
インストールが終わったらパーミッションや必要なディレクトリの作成、
所有権の設定など、ほとんど設定は済んでいます。
なので、おもむろに exim を Windows 上のサービスにインストールしましょう。

全般的にそうですが、サーバ機能を提供するソフトウェアについては、
/usr/doc/Cygwin にドキュメントが保存されています。
これに従えば、exim は以下のコマンドでサービスにインストールできます。

$ cygrunsrv -I exim -d "CYGWIN exim" -p /usr/bin/exim \
> -a "-bdf -q15m" -e "CYGWIN=ntsec nosmbntsec" \
> -1 /var/log/exim/cygrunsrv_out.log \
> -2 /var/log/exim/cygrunsrv_err.log

実際に使う

後は実際に設定して起動するだけで、exim は動作をはじめます。
exim は普通に設定するだけで、open relay などが起こらないようになっていて、
かなり楽なことは楽なのですが、
情報が少なすぎてどう設定すればいいかわかりにくいと思います。
そのため、私の /etc/exim.conf を例に、ある程度説明しようと思います。

ですが、まずはその前に SYSTEM アカウント以外でも /etc/exim.conf が
編集できるようにパーミッションを修正しましょう。
これで Administrators に所属している人物が /etc/exim.conf が
修正できるようになります。
$ chgrp 544 /etc/exim.conf
$ chmod 664 /etc/exim.conf


編集する準備ができたら、参考になる Web サイトを読んだ上で、
http://www.exim.org/exim-html-4.20/doc/html/
http://washitake.com/mail/
http://www.pen-chan.jp/net/set/exim.html
http://www.big.or.jp/~mio/ca/ex/
http://www.mars.sphere.ne.jp/tbs-i/tech/exim/check.html

以下の私の exim.conf の意味を理解しながら読めば、
結構分かりやすいと思います。
virtual domain 対応の config ですので、それなりに参考になるでしょう。

ちなみに上記 URL の中で一番役立つのはやはり、exim のリファレンスページ (一番上) です。
# 英語なので読むのが面倒ではありますが・・・

######################################################################
#                    MAIN CONFIGURATION SETTINGS                     #
######################################################################

# 相手の smtp サーバに対して必須なので設定すること。
primary_hostname = mail.subdomain1.doman.local ← メールサーバの FQDN ( A レコード必須のハズ) を設定

domainlist local_domains = subdomain1.doman.local : subdomain2.doman.local ← メールを受け取るドメインをコロンで区切って記述
domainlist relay_to_domains = 
hostlist   relay_from_hosts = 127.0.0.1 : 192.168.0.0/16 ← MTA を使ってメールを出せるホストを設定

acl_smtp_rcpt = acl_check_rcpt

gecos_pattern = (.*?)(,U-|,S-|$)
gecos_name = $1 

host_lookup = !127.0.0.0/8 : !192.168.0.0/16 : *

rfc1413_hosts = !127.0.0.0/8 : *
rfc1413_query_timeout = 30s

ignore_bounce_errors_after = 2d

timeout_frozen_after = 7d


######################################################################
#                       ACL CONFIGURATION                            #
#         Specifies access control lists for incoming SMTP mail      #
######################################################################

begin acl

acl_check_rcpt:

  accept  hosts = :
  deny    local_parts   = ^.*[@%!/|] : ^\\.
  accept  local_parts   = postmaster
          domains       = +local_domains
  require verify        = sender

  #############################################################################
  # There are no checks on DNS "black" lists because the domains that contain
  # these lists are changing all the time. However, here are two examples of
  # how you could get Exim to perform a DNS black list lookup at this point.
  # The first one denies, while the second just warns.
  #
  # deny    message       = rejected because $sender_host_address is in a black list at $dnslist_domain\n$dnslist_text
  #         dnslists      = black.list.example
  #
  # warn    message       = X-Warning: $sender_host_address is in a black list at $dnslist_domain
  #         log_message   = found in $dnslist_domain
  #         dnslists      = black.list.example
  #############################################################################

  accept  domains       = +local_domains
          endpass
          message       = unknown user
          verify        = recipient

  accept  domains       = +relay_to_domains
          endpass
          message       = unrouteable address
          verify        = recipient

  accept  hosts         = +relay_from_hosts

  accept  authenticated = *

  deny    message       = relay not permitted


######################################################################
#                      ROUTERS CONFIGURATION                         #
#               Specifies how addresses are handled                  #
######################################################################
#     THE ORDER IN WHICH THE ROUTERS ARE DEFINED IS IMPORTANT!       #
######################################################################

begin routers

# 自分のドメイン宛てじゃなければ上位の smtp サーバに丸投げ
# 失敗した場合は、次の router で自分で DNS を引く。
send_to_smart_host:
  driver = manualroute
  route_list = !+local_domains  smtp.smarthost.com ← 上位の smtp サーバを指定
  transport = remote_smtp

# 自分のドメイン宛てじゃない場合に
# 普通に DNS を引いて mx にしたがって smtp サーバに投げる
# smart_host が失敗するとこれになり、これが失敗するとエラーを返す。
dnslookup:
  driver = dnslookup
  domains = ! +local_domains
  transport = remote_smtp
  ignore_target_hosts = 0.0.0.0 : 127.0.0.0/8 : 192.168.0.0/16
  no_more

# 自分のドメイン宛ての場合に aliases をみてリダイレクトする
# この際に virtual ドメインを使えるように設定
virtual:
  driver = redirect
  domains =  +local_domains
  pipe_transport = address_pipe
  data = ${lookup{$local_part}lsearch{/etc/mail/$domain}} ← この設定で /etc/mail/subdomain1.doman.local /etc/mail/subdomain2.doman.local がそれぞれ virtual host の /etc/aliases 扱いとなる

# 各ユーザが作成した .forward ファイルを読む
userforward:
  driver = redirect
  check_local_user
  file = $home/.forward
  no_verify
  no_expn
  check_ancestor
  allow_filter ← ユーザの ~/.forward にフィルタ設定を可能にする
  file_transport = address_file
  pipe_transport = address_pipe
  reply_transport = address_reply

# 最終的にメールボックスに保存する場合
localuser:
  driver = accept
  check_local_user
  transport = local_delivery
  no_more


######################################################################
#                      TRANSPORTS CONFIGURATION                      #
######################################################################
#                       ORDER DOES NOT MATTER                        #
#     Only one appropriate transport is called for each delivery.    #
######################################################################

begin transports

remote_smtp:
  driver = smtp

# Maildir 形式に変更した上でパーミッション設定を実施
local_delivery:
  driver = appendfile
#  file = /var/spool/mail/$local_part
  delivery_date_add
  envelope_to_add
  return_path_add
  initgroups = no
  mode = 0600
  directory_mode = 700
  mode_fail_narrower = no
  check_group = no
  check_owner
  maildir_format ← Maildir 形式を設定
  directory = /home/${local_part}/Maildir/

address_pipe:
  driver = pipe
  return_output
  use_shell ← aliases 内でシェルスクリプトなどをパイプで呼び出せるようにする

address_file:
  driver = appendfile
  delivery_date_add
  envelope_to_add
  return_path_add

address_reply:
  driver = autoreply


######################################################################
#                      RETRY CONFIGURATION                           #
######################################################################

begin retry
# ------               -----       -------
*                      *           F,2h,5m; G,16h,1h,1.5; F,4d,6h

######################################################################
#                      REWRITE CONFIGURATION                         #
######################################################################

begin rewrite


######################################################################
#                   AUTHENTICATION CONFIGURATION                     #
######################################################################

begin authenticators


######################################################################
#                   CONFIGURATION FOR local_scan()                   #
######################################################################

注意 ( aliases の表記方法)

私の設定を参考にして virtual domain を構築したりしたばあい、
aliases の設定で注意する必要があります。
というのは、"@" 以降を省略した場合は、
primary のドメイン名が補完されるということです。
そのため、基本的にメールアドレスにユーザ名だけの表記は出来ません。

つまり、/etc/mail/subdomain1.doman.local は
以下のように記述してはいけません。
# Person who should get root's mail. Don't receive mail as root!
root:           k-square@yotta-zetta.com

# Basic system aliases -- these MUST be present
MAILER-DAEMON:  root
postmaster:     root

以下のように記述しましょう。
# Person who should get root's mail. Don't receive mail as root!
root:           k-square@yotta-zetta.com

# Basic system aliases -- these MUST be present
MAILER-DAEMON:  root@subdomain1.doman.local
postmaster:     root@subdomain1.doman.local
戻る

exim を使わなくなったら

Windows 上のサービスからアンインストール

Cygwin をアンインストールするときや、
exim を使わなくなったときなどはサービスからアンインストールしましょう。

以下のコマンドでアンインストールができます。
$ cygrunsrv -R exim
サービスから名前が消えていることを確認してください。
Valid XHTML 1.0 Strict Valid CSS!
戻る