手軽にやっちゃいましょう〜
プログラム開発をしていると、メール送信するプログラムをよく書きます。
この時、外部から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でメール送信するシェルスクリプトについては以前以下の記事を書きました。