既にPostfixがインストールされている場合、おそらく何もしなくても外部にメールを送信できる(できてしまう)設定になっているのではないでしょうか。
本記事ではローカルからからのみ外部へメール送信して、他のサーバーからのアクセスは受け付けないようにPostfixを設定する方法を解説します。
Contents
サーバーを用意する
今回はUbuntu LinuxがインストールされたカゴヤVPSを使いますが、OSが異なっていてもUnix系のOSであれば同じような操作ができます。
VPSの通信制御機能やOSのファイアウォールでアクセス制限している場合、外向けのメール通信が通過するように設定してください。
Linux VPSでIPアドレス制限をする複数の方法を解説|さくらのVPSは要注意さくらのVPSの場合、無料お試し期間中は外向けのメール送信に制限がありますから注意してください。
Postfixがインストールされているか確認する
Debian系の場合はdpkt -l | grep postfix
でインストール済みか確認できます。インストールされていない場合はapt install postfix
でインストールしてください。
$ dpkg -l | grep postfix $
RedHat系の場合はrpm -q postfix
でインストール済みか確認できます。インストールされていない場合はdnf install postfix
でインストールしてください。
$ rpm -q postfix package postfix is not installed $
Postfixをインストールする場合
新規にPostfixをインストールする場合は次のように進めます。
まず設定について確認されるので、外部へメール送信するため「2」を選びます。
1. No configuration 2. Internet Site 3. Internet with smarthost 4. Satellite system 5. Local only General mail configuration type: 2
次にホスト名を設定します。ここはFQDN(ホスト名+ドメインメイン)で指定します。
System mail name: mail.example.com
Postfixが起動していない場合は起動します。
systemctl start postfix
自動起動も有効にしておきます。
systemctl enable postfix.service
Postfixを設定する
このままでも使えるのですが、必要最低限の設定をしておきましょう。まず最初に設定をバックアップしておきます。
$ sudo cp -v /etc/postfix/main.cf{,_backup} '/etc/postfix/main.cf' -> '/etc/postfix/main.cf_backup' $
sudo cp -v /etc/postfix/main.cf{,_backup}
というコマンドを実行しました。わたしの環境は一般ユーザーで作業するのでsudo
を付けていますが、rootユーザーで実行する場合はsudo
は不要です。
バックアップしたら/etc/postfix/main.cf
をエディタで編集していきます。
myhostname
myhostnameはFQDN(ホスト名+ドメイン)を指定します。
myhostname = hoge.example.com
myhostnameは初期設定のままでも問題ないかと思いますが、わたしは正しく設定しています。
inet_interfaces
わたしの環境ではallが設定されていました。その場合はインターネットからメールサーバーにアクセスでき、通常のメールサーバーのようにメールを配送できます。
inet_interfaces = all
今回は他のサーバーからメールを受信する設定にはしない(ローカルからメールを送信するのみ)のでall
からlocalhost
に変更します。これで自分自身からのみメールを送信できるようになります。
inet_interfaces = localhost
最低限必要なのはこれだけです。簡単ですね。
設定を確認し反映させる
main.cf
の編集を終えたらpostconf -n
コマンドを実行してみてください。
$ postconf -n alias_database = hash:/etc/aliases alias_maps = hash:/etc/aliases append_dot_mydomain = no biff = no compatibility_level = 3.6 inet_interfaces = localhost inet_protocols = all mailbox_size_limit = 0 mydestination = $myhostname, localhost.localdomain, localhost myhostname = foo.expample.com mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 readme_directory = no recipient_delimiter = + relayhost = smtp_tls_CApath = /etc/ssl/certs smtp_tls_security_level = may smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu) smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination smtpd_tls_cert_file = /etc/ssl/certs/ssl-cert-snakeoil.pem smtpd_tls_key_file = /etc/ssl/private/ssl-cert-snakeoil.key smtpd_tls_security_level = may $
変更した箇所が反映されている事を確認します。他に変更したい箇所があれば適宜main.cf
を編集してください。
次にpostfixの設定ファイルをチェックするpostfix check
コマンドを実行します。
$ postfix check postfix: error: to submit mail, use the Postfix sendmail command postfix: fatal: the postfix command is reserved for the superuser $
エラーが発生してしまいましたが、コンフィグの誤りではありません。sudo
を付けて再度実行します。
$ sudo postfix check [sudo] password for foo: $
何もエラーが表示されなければOKです。Postfixを再起動して設定を反映させましょう。
systemctl reload postfix
コマンドを実行します。一般ユーザーで作業している方はsudo
を先頭に付けてください。
$ sudo systemctl reload postfix $
コマンドラインでメールを送信してみる
sendmailコマンドを使うと簡単にメールを送信できます。
使い方は簡単です。
sendmail -f 送信元メールアドレス 送信先メールアドレス
$ sendmail -f foo@example.com bar@example.com test test2 test3 . $
メールの内容(この例では「test test2 test3」を入力して「.」だけの行を入力するとメールが送信されます。
コマンドの実行結果をメールで送信したい場合はパイプで渡すだけです。
$ echo "TEST" | sendmail -f foo@example.com bar@example.com $
タイトルを付けたい場合は-t
オプションでヘッダーを付与します。少し面倒ですが次のようにします。
$ echo -e "To:bar@example.com\nFrom:foo@example.com\nSubject:TestMail\ntest\ntest2\ntest3" | sendmail -t $
もしくは次のようにします。送信先メールアドレスをヘッダーで指定するか否かの違いです。
$ echo -e "From:foo@example.com\nSubject:TestMail\ntest\ntest2\ntest3" | sendmail -t bar@example.com $
SPFレコードを設定する
迷惑メール判定を避けるため、可能であればSPFレコードを設定しておきましょう。SPFレコードはDNSの設定でおこないます。
わたしはエックスサーバーを使っているため現在のSPFレコードは次のようになっています。
v=spf1 +a:sv13115.xserver.jp +a:vpscafe.net +mx include:spf.sender.xserver.jp ~all
このフィールドにVPSのIPアドレスを追加します。「ip4:x.x.x.x」の箇所が追加したものです(x.x.x.xはVPSのグローバルIPアドレスに変換してください)。
v=spf1 +a:sv13115.xserver.jp +a:vpscafe.net +mx include:spf.sender.xserver.jp ip4:x.x.x.x ~all
設定したらdig vpscafe.net txt
コマンドで簡単に確認できます。
$ dig vpscafe.net txt ; >> DiG 9.18.12-0ubuntu0.22.04.3-Ubuntu >> vpscafe.net txt ;; global options: +cmd ;; Got answer: ;; ->>HEADER- opcode: QUERY, status: NOERROR, id: 27492 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 13 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 65494 ;; QUESTION SECTION: ;vpscafe.net. IN TXT ;; ANSWER SECTION: vpscafe.net. 300 IN TXT "v=spf1 +a:sv13115.xserver.jp +a:vpscafe.net +mx include:spf.sender.xserver.jp +ip4:x.x.x.x ~all"
digやnslookupコマンドが利用できない環境の場合、弊社が提供しているオンラインの実行環境をご利用ください。
dig http://network.netwiz.co.jp/dig
nslookup http://network.netwiz.co.jp/nslookup