Table of Contents
Postfix とは MTA(Message Transfer Agent) と呼ばれる、電子メールを扱うソフトウェアのことです。macOS には標準で Postfix がインストールされています。
ローカルサーバー環境から Postfix を使ってメールの送信を行うためには、いくつか設定しなければならない項目があります。
今回は、localhost からメールを送信するために必要な設定について説明します。
設定手順
main.cf の設定
main.cf とは、Postfix でメールを送受信するために必要な様々な設定を記述するテキストファイルです。
macOS であれば、以下のパスに保存されています。
/etc/postfix/main.cf
これを開いて、以下の項目を変更していきます。
myhostnameを変更
myhostname に使用するメールサーバのホスト名を設定します。例えば、以下のようにします。
(書かれている行数を正確に書けないため、テキストエディタ等でキーワード検索してみてください)
myhostname = joyplot.com
後述するコマンド dig によって、その有無を調べることができます。
relayhostを変更
外部へのメールを送るSMTPサーバを指定します。
25番ポートブロック(Outbound Port25 Blocking)が施されている場合は、587番ポートを使うのが一般的です。
relayhost = joyplot.com:587
ちなみに、[joyplot.com]:587 のように括弧で囲むと、Mail Exchanger の検索を防止する効果があるそうです。
[hostname] のように、転送先ホスト名を [ ] で囲むと MX検索をしなくなる。
Postfix でメールリレーの設定 (SMTP クライアント + SMTP Auth)
あるポート番号が使用可能かどうかは、後述するコマンド telnet で調べることができます。
SASLの設定を追記
SASL(Simple Authentication and Security Layer)によるSMTP認証を使用するため、main.cf の最後に以下の4行を書き加えます。
smtp_sasl_auth_enable = yes smtp_sasl_password_maps = hash:/etc/postfix/authinfo smtp_sasl_security_options = noanonymous smtp_sasl_mechanism_filter = PLAIN
authinfoの作成・SASLパスワードマップの生成
SASLを使用するための情報を記載するファイルを作り、そのファイルを利用してパスワードマップを生成します。
今回は authinfo という名前のファイルを作ってそれを使いますが、先ほど main.cf に書き加えた smtp_sasl_password_maps のパスを変更すれば、他の名前のファイルでもOKです。
つまり、
hash:/etc/postfix/authinfo
この authinfo を変更すれば、別の名前のファイルが読み込みの対象となります。
それでは authinfo を作っていきましょう。このファイルにはメール送信に使用するアカウントの情報を記入します。例えば以下のようになります。
joyplot.com:587 example@joyplot.com:password
これを保存し、以下のコマンドでdbファイルを生成します。
sudo postmap /etc/postfix/authinfo
これで、同じディレクトリに authinfo.db というファイルが現れると思います。
postfixの設定を更新して再起動
以下のコマンドで設定を読み込み直します。
sudo postfix reload
メール送信テスト
普通に使っているアカウントにメールが送れるかテストしてみましょう。
以下は、本文に現在時刻だけを記載した簡単なメールを送るコマンド例です。
date | mail test@gmail.com
先ほど設定した情報に誤りがなければ、無事にメールが届くはずです。
Postfixの設定に必要な情報の確認するためのコマンド
上記の設定で必要な値が分からないという場合、以下のコマンドを使って調べます。
dig
メール送信に利用するDNSサーバの確認等に dig コマンドを使います。
dig とは Domain Information Groper の略です。
DNSサーバーが正常に動作しているかどうか確認したい、問題がどこにあるかを突き止めたい、そんな時に「dig」を利用します。domain information groper(ドメイン情報探索ツール)という名前の由来通り、DNSサーバーに対し問い合わせを行い、その応答結果を表示するコマンドです。
…
nslookupよりも詳細な情報を確認できるdigを利用するようにしましょう。
ネットワーク管理の基本Tips:DNSサーバーが正常に動作しているかどうか確認するには? digコマンド – @IT
例えば、MXレコードの値などを調べたい時は、以下のようにします。
dig ドメイン名 mx
より詳細なコマンドの使い方は以下のサイトが参考になります。
Linuxコマンド集 – 【 dig 】 ドメイン情報をDNSサーバーから取得する:ITpro
telnet
接続できるポート番号を確かめる際に使えるコマンドです。
telnet ドメイン名 ポート番号
出力の5行目「ehlo localhost」は自分で入力するtelnetのコマンドです。
コマンド詳細については下記のページがまとまっています。
ネットワーク・コマンド道場 – telnetコマンド:ITpro
メールが送られてこない場合
メールキューの確認 mailq
コマンド mailq を使うと、送信に失敗した(遅延している)メールを確認することができます。
例えば、ホスト名(ドメイン名)の設定に誤りがあり送信できていないメールがある場合、以下のように表示されます。
-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient------- B2253B130413 343 Sat Jul 9 08:01:50 Test@MacBook-Air.local (Host or domain name not found. Name service error for name=local type=MX: Host not found, try again) test@joyplot.com
送信に成功しており、残っているメールがない場合は、以下のように出力されます。
Mail queue is empty
溜まったメールキューを削除するには、管理者権限で(sudoを付けて)以下のコマンドを使います。
sudo postsuper -d ALL
ログファイル(mail.log)の確認
メールの送信中にエラーがあった場合、以下のログファイルにその情報が記録されます。
/var/log/mail.log
このログファイルを確認するために tail コマンドをオプション -f をつけて使うと便利です。
tail -f /var/log/mail.log
-f をつけると、ファイルへの追記をリアルタイムで確認できます。
例えば、正しくないホスト名などを relay_host に設定していた場合、以下のようなエラーログが書き込まれます。
fatal: valid hostname or network address required in server description: [設定した値]
less コマンドでもログの表示ができます。
less /var/log/mail.log
古いログも一気に表示されるのがちょっと見辛いと感じたので、個人的には tail を使うのが好みです。
同じドメインの宛先に届かない場合
例えば myhostname = hoge.com とした場合、test@hoge.com にメールを送ろうとしても、以下のようなエラーになることがあります。
sender non-delivery notification: ~~~
この場合、mydestination を書き換える必要があります。
mydestination に myhostname が入っている場合、そのホスト名がローカルだと認識されてしまうため、除去しなければなりません。
mydomain が myhostname と同じものを指している場合は、mydomain も取り除きます。
つまり
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
これを以下のように書き換えます。
mydestination = localhost.$mydomain, localhost
これで、同じドメインにもメールが届くようになると思います。
以上が localhost から Postfix でメールを送信するための設定です。