文系プログラマによるTIPSブログ

文系プログラマ脳の私が開発現場で学んだ事やプログラミングのTIPSをまとめています。

macのmarvericksでpostfixを起動してローカルにメールサーバーをたてる

手軽にやっちゃいましょう〜


f:id:treeapps:20170829002500p:plain

プログラム開発をしていると、メール送信するプログラムをよく書きます。
この時、外部から25ポートを許可しないサーバが多く、ローカル環境でコーディングし、ローカルからメール送信したい場合に困ってしまいます。今回はmacのmarvericksでローカルをメールサーバ化し、メール送信関連の開発をし易くためのpostfixの設定手順を公開してみます。

いきなりpostfixを起動してみる

treemacpro-2:~ tree$ sudo postfix start
Password:

postfix: fatal: chdir(/Library/Server/Mail/Data/spool): No such file or directory

こんなエラーが出る場合、以下の対応をする必要があります。

必要なフォルダ生成と初期化

sudo mkdir -p /Library/Server/Mail/Data/spool
sudo /usr/sbin/postfix set-permissions

これで起動はするようになります。

submit.credの用意

しかし、いざメール送信ようとすると、以下のエラーが出る場合があります。

treemacpro-2:log tree$ sudo less /var/log/mail.log

Jun 11 21:08:40 treemacpro-2.local postfix/smtpd[37271]: fatal: open /etc/postfix/submit.cred: No such file or directory

この場合、

sudo vi /etc/postfix/submit.cred

とし、以下の内容を書き込みます。

submitcred version 1
hostname|user|password

続いて作成したsubmit.credの権限を変更します。

sudo chmod 600 /etc/postfix/submit.cred

postfixのリロード

一通り設定ができたので、reloadすれば完了です。

treemacpro-2:log tree$ sudo postfix reload
postfix/postfix-script: refreshing the Postfix mail system

これでローカルにpostfixでメールサーバーをたてることができました。

log4j.xmlの設定例

ついでにlog4jで、log.error()のイベントが発生した際にメール送信されるように設定してみます。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    <appender name="logMail" class="org.apache.log4j.net.SMTPAppender">
        <param name="Threshold" value="ERROR" />
        <param name="BufferSize" value="15" />
        <param name="SMTPHost" value="localhost" />
        <param name="Subject" value="server error" />
        <param name="From" value="hoge@gmail.com" />
        <param name="To" value="hoge@gmail.com" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5p %d [%t] %m%n" />
        </layout>
    </appender>

    <root>
        <level value="INFO" />
        <appender-ref ref="logMail" />
    </root>
</log4j:configuration>

こんな感じでSMTPHostをローカルに設定すると、ローカルのpostfixによってメールが送信されます。
メール送信処理実行後、少し経つと以下のようなログが出力されると同時にメールが送信されます。

Jun 11 21:08:40 treemacpro-2.local postfix/smtp[7168]: 27C4B9A21D9: to=<treeapps5@gmail.com>, relay=gmail-smtp-in.l.google.com[74.125.25.27]:25, delay=2.9, delays=0.04/0.03/1/1.8, dsn=2.0.0, status=sent (250 2.0.0 OK 1402488520 mn6si37884277pbc.17 - gsmtp)
Jun 11 21:08:40 treemacpro-2.local postfix/cleanup[7165]: 1115D9A21DE: message-id=<20140611120840.1115D9A21DE@treemacpro-2.local>
Jun 11 21:08:40 treemacpro-2.local postfix/bounce[7169]: 27C4B9A21D9: sender non-delivery notification: 1115D9A21DE
Jun 11 21:08:40 treemacpro-2.local postfix/qmgr[7135]: 1115D9A21DE: from=<>, size=2240, nrcpt=1 (queue active)
Jun 11 21:08:40 treemacpro-2.local postfix/qmgr[7135]: 27C4B9A21D9: removed
Jun 11 21:08:40 treemacpro-2.local postfix/local[7170]: 1115D9A21DE: to=<tree@treemacpro-2.local>, relay=local, delay=0.03, delays=0/0.02/0/0, dsn=2.0.0, status=sent (delivered to mailbox)
Jun 11 21:08:40 treemacpro-2.local postfix/qmgr[7135]: 1115D9A21DE: removed

mail.logをtailしていると、メール送信のタイミングが解りやすくなります。

ポートの開放等

ポート開放等は不要です。
システム環境設定 → 共有 → リモートログイン
等をいじる必要はありません。

雑感

ローカルにメールサーバをたてると以下のようなメリットがあります。

  • ポート開放等のアクセス制限を気にしなくてよくなる。
  • ネットワークに繋がっていなくてもスタンドアローンで動作する。
  • bashでメール送信するスクリプト作成などをローカル環境のみで行える。

私の開発現場では、基本的にSMTPHostはlocalhost以外許可しないサーバが多いです。
つまりローカルからサーバにあるpostfixを利用してメール送信できないのです。
そういう時、macだと簡単にpostfixでメールサーバがたてられるので楽なのです。

ちなみにbashでメール送信するシェルスクリプトについては以前以下の記事を書きました。