MacでPostfixを使ってlocalhostからメールを送信する方法

By | 2016年11月7日

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

digコマンドの使用例

より詳細なコマンドの使い方は以下のサイトが参考になります。

Linuxコマンド集 – 【 dig 】 ドメイン情報をDNSサーバーから取得する:ITpro

telnet

接続できるポート番号を確かめる際に使えるコマンドです。

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 でメールを送信するための設定です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です