ローカルからのメール送信設定を行う (CentOS 5.4)


ローカルからのメール送信

CentOS 5.4 では、既定では mail コマンドを使用してローカルからのメール送信が行えるようになっているようです。

ただ、この mail コマンドは、どうやら自分自身で実行している sendmail を利用して、メール送信を行おうとする様子です。そのため、OP25B (Outbound Port 25 Blocking) で外部 SMTP サーバーとの通信が制限されているプロバイダを利用している場合など、環境によってはメール送信を行えない場合があります。

 

それを回避するためには、自分自身で稼働している sendmail の設定を適切なものに調整する必要があります。

ここでは、多くのプロバイダーで採用されている 587 番 (Submission) ポートを利用したメール送信に対応させてみようと思います。

 

メールの送信チェックを行う

それに先だって、まずはローカルからのメール送信が可能であるかのチェックを行う方法を記しておこうと思います。

これには、例えば "xxx@xxx.xxx.xx" 宛へのメールが送信できるかどうかをチェックするには、次のような命令をコマンドラインから実行します。

hostname | mail -s "TEST" xxx@xxx.xxx.xx

これでメールが届くようでしたら、既にメール送信ができるように設定されていることになります。

ただし、自宅サーバーなどでローカルにメールサーバーが存在するような場合には、自分のメールサーバーにだけ届くといったことも考えられます。テストの際は、フリーメールや携帯電話のメールなど、外部の宛先を指定するのが良いでしょう。

もっとも、フリーメールの場合は稀にメールが届かず行方不明になることもありますし、携帯メールの場合も迷惑メールフィルターやメールサーバーがブラックリストに登録されるなど、必ずしも届かない原因が mail コマンドにあるとは限らないので注意が必要ですけれど。

 

Submission ポートを用いたメールの送信設定を行う

今回は Submission ポートが利用できる場合に、それを利用してローカルからのメールの送信を行う設定を行います。

今回使用する Submission ポートの情報が次のようになっているとします。

SMTP サーバー smtp.xxxx.xxx.xx
ポート番号 587
認証アカウント AUTH_ACCOUNT
認証パスワード AUTH_PASSWORD

認証情報の確認

このとき、まずは設定に必要な情報を取得します。

telnet smtp.xxxx.xxx.xx 587

コマンドラインからこのようにすると、メールサーバーから応答があるので、"EHLO" と入力します。

250-smtp.xxxx.xxx.xx

250-AUTH LOGIN PLAIN

250-AUTH=LOGIN PLAIN

250-PIPELINING

250 8BITMIME

上記のようなメッセージが表示されたら、"QUIT" と入力して、コマンドラインに戻ります。

ここで表示された "AUTH=" の後ろの情報を、後で使用するので控えておきます。

 

 

続いて、sendmail の設定ファイルを書き換えます。

CentOS 5.4 の場合、設定ファイルは "/etc/mail" ディレクトリに格納されているようです。ここの "sendmail.mc" 等を編集して "m4" コマンドを使用して "sendmail.cf" ファイルを生成する流れで sendmail の設定を行うようですので、それにならって設定しようと思います。

以下の設定は、"/etc/mail" ディレクトリ内で行います。

authinfo.db ファイルの作成

"/etc/mail/sendmail.cf" の設定に先立って、Submission ポートへの接続に必要な情報を揃えた authinfo.db ファイルを作成します。

そのために、まずはテキストエディタを用いて、以下の内容で "/etc/mail/authinfo" ファイルを作成します。

AuthInfo:smtp.xxxx.xxx.xx "U:AUTH_ACCOUNT" "P:AUTH_PASSWORD" "M:LOGIN PLAIN"

ここで、"M:LOGIN PLAIN" のところは、事前に調べた AUTH の情報を記載します。他、"U:" で認証アカウントを "P:" で認証パスワードを指定する形になっています。

"/etc/mail/authinfo" が作成できたら、次のようにして "/etc/mail/authinfo.db" ファイルを生成します。

make authinfo.db

上記では CentOS 5.4 に予め用意されていた Makefile を使用して生成しましたが、やっていることは "makemap -v hash /etc/mail/authinfo.db < /etc/mail/authinfo" と同等です。

今後、"/etc/mail/authinfo" ファイルの内容を変更した際にも、忘れずに "make authinfo.db" を実行するようにします。なお、実行すると、sendmail を再起動しなくても、設定内容は新しいものが有効になります。

sendmail.cf の設定

続いて、"/etc/mail/sendmail.cf" の設定を調整します。

CentOS 5.4 では、"/etc/mail/sendmail.mc" を編集してそれを変換することで間接的に "/etc/mail/sendmail.cf" の編集を行うようになっていました。ですので、まずは "/etc/mail/sendmail.mc" ファイルをテキストエディターで開きます。

 

編集箇所は主に次の 6 箇所です。

既定では、先頭に dnl という文字列が付加されてコメントアウトされているようなので、それを取り除いて、次のような内容でそれらを設定する必要があります。

define(`SMART_HOST', `esmtp:[smtp.xxxx.xxx.xx]')dnl

define(`ESMTP_MAILER_ARGS', `TCP $h 587')

FEATURE(authinfo, DATABASE_MAP_TYPE` -o 'MAIL_SETTINGS_DIR`authinfo')

 

dnl EXPOSED_USER(`root')dnl

MASQUERADE_AS(`xxxx.xxx.xx')dnl

FEATURE(masquerade_envelope)dnl

最初の 3 行で、"smtp.xxxx.xxx.xx" サーバーの Submission (587) ポートを "/etc/mail/authinfo.db" に書かれた認証情報で利用することを指定しています。"SMART_HOST" で指定しているメールサーバーが、ファイアーウォール等でメールサーバーを保護する場合などでも使用する、いわゆる中継メールサーバーです。qmail でいう "smtproutes" で指定するメールサーバーみたいな感じでしょうか。

残りの 3 行で、送信元メールアドレスの @ 以下を書き換える設定をしています。"xxxx.xxx.xx" で実際に存在する電子メールのドメインを指定します。こうしないと、ローカルのドメイン名がメールアドレスに適用されてしまうため、配信先メールサーバーによってはメールを破棄されてしまう場合がありました。特に携帯電話宛のメールが届かない場合には、このあたりの設定が正しく反映されているか注意すると良いかもしれません。

なお、"dnl EXPOSED_USE(`root')dnl のところは、既定では有効になっている (dnl が冒頭についていない) ようなので注意しましょう。

 

ここまでできたら、次のようにして "/etc/mail/sendmail.cf" ファイルを更新します。

make sendmail.cf

ここでも CentOS 5.4 に予め用意されていた Makefile を使用して生成しています。やっていることとしては "m4 /usr/share/sendmail-cf/m4/cf.m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf" と同等のようです。

 

"/etc/mail/sendmail.cf" を更新したら、次のようにして sendmail に読み込ませます。

make restart

こうすることで sendmail が再起動され、設定ファイルが有効になります。

これは、実際には "service sendmail restart" が実行されます。予め用意された Makefile では "restart" しか用意されていませんが、"service sendmail reload" でも、設定ファイルを読み込み直してくれるようなので、好みに応じてこちらを使用しても良いかもしれません。

 

後はこれで、冒頭にも示したように、次のようなコマンドでメールの送信が行えるかどうかを確認します。

hostname | mail -s "TEST" xxx@xxx.xxx.xx

設定が上手くいっていれば、"xxx@xxx.xxx.xx" 宛に電子メールが届くようになると思います。

上手く届かない場合には、環境によっていろいろな原因があると思うので何とも言えないところですが、他のメールアドレスなら届くのか、TELNET 等で手動で Submission ポートへ接続してみて応答があるか、Submission ポートをオープンしているメールサーバーにログが記録されているか、そういった辺りも調べてみると良いかもしれません。