Postfixを設定してローカルから外部へメール送信する方法|外部からはアクセスさせない

既にPostfixがインストールされている場合、おそらく何もしなくても外部にメールを送信できる(できてしまう)設定になっているのではないでしょうか。

本記事ではローカルからからのみ外部へメール送信して、他のサーバーからのアクセスは受け付けないようにPostfixを設定する方法を解説します。

サーバーを用意する

今回は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