Postfixサーバーを構築する

この記事に書いてあること

  1. 外部のサーバーとSMTP通信できるPostfixサーバーの構築
  2. 自分自身へのメールの送り方
  3. Postfixのメールがどこにあるか

0.環境

OS: Rocky Linux8.8 仮想ソフトウェア: VirtualBox7.0

1.Postfixのインストール

dnfでインストールする

$ sudo dnf -y install postfix

2. 外部通信のためのfirewall設定

外部のサーバーとSMTP通信するため、以下のコマンドでfirewallに穴をあける

$ sudo firewall-cmd --add-service=smtp --permanent
success
$ sudo firewall-cmd --reload
success

上記のようにsuccessと出れば成功

以下のコマンドを打ち、servicesにsmtpが加えられているか確認しても良い

$ sudo firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp0s3
  sources:
  services: cockpit dhcpv6-client smtp ssh
  ports:
  protocols:
  forward: no
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

3. Postfixの設定

/etc/postfix/main.cfのinet_interfacesの設定をlocalhostからallに変更する

inet_interfaces = localhost
↓
inet_interfaces = all

Postfixを起動させる。以下のように起動させると再起動時にも自動でPostfixが立ち上がるようになる

$ systemctl enable postfix --now

4. メールの送信テスト

telnetsendmailでの2通りのテスト方法を記述する。

telnetを用いてテストすると実際に自分でSMTPのシーケンスを打ち込んでメールを送信する流れを体感できる

sendmailコマンドを用いたテストは手早く簡単にテストでき、メールのheader fromなどのヘッダーを自動入力してくれる

4-1. telnetを用いたテスト

telnetをインストールする

$ sudo dnf -y install telnet

ループバックアドレス(127.0.0.1)、自分自身のIPアドレスまたは自分自身のホストネームとポート番号25を指定してtelnetSMTP通信を開始できる。telnetはquitを入力すると終了できる。

$ telnet 127.0.0.1 25
or
$ telnet [自分自身のIPアドレス]
or
$ telnet [自分自身のホストネーム]

RFCによって定められてSMTPコマンドを打ちこんでメールを送信することができる。以下にSMTPセッションの例を示す(一部加工してある)。

$ telnet 127.0.0.1 25
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
220 [Postfixサーバーのホスト名] ESMTP Postfix
HELO kk
250 test.num01.kk
MAIL FROM: test@hoge.com
250 2.1.0 Ok
RCPT TO: [宛先メールアドレス]
250 2.1.5 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
test mail!
.
250 2.0.0 Ok: queued as CD37E88FADC
quit
221 2.0.0 Bye
Connection closed by foreign host.
新しいメールが /var/spool/mail/admin にあります

簡単なSMTPコマンドの説明は以下。上から順に打ち込んでいけばメールを送信できる。 1. HELO [てきとうな文字列] 2. MAIL FROM: [送信元メールアドレス] 3. RCPT TO: [宛先メールアドレス] 4. DATA .(ピリオド)のみの行に改行を入力するまで、メール本文を打ち込める

4-2. sendmailコマンドを用いたテスト

$ sendmail [ユーザー名]@[自分自身のホストネーム]をターミナルに入力しメール本文を入力する。メール本文の入力は.(ピリオド)のみの行と改行を入力することで終了できる。

$ sendmail [ユーザー名]@[自分自身のホストネーム]
test mail2!
.

5. メールの保管場所

デフォルトでは/var/spool/mail/[ユーザー名]に一つのファイルとして複数のメールが保管されている。以下の例は一部加工している

$ cat [ユーザー名]
Return-Path: <test@hoge.com>
X-Original-To: xxxxxxx@xxxxx 
Delivered-To: xxxx@xxxxx 
Received: from xx (localhost [127.0.0.1])
        by xx.xx.xxx (Postfix) with SMTP id CD37E88FADC
        for <xxxx@xxxx>; Tue, 19 Sep 2023 06:41:49 -0400 (EDT)
Message-Id: <20230919104204.CD37E88FADC@xxx.xxxx.xxx>
Date: Tue, 19 Sep 2023 06:41:49 -0400 (EDT)
From: test@hoge.com

test mail!

From xxxx@xxx  Tue Sep 19 06:53:16 2023
Return-Path: <xxxx@xxx>
X-Original-To: xxxx@xxx
Delivered-To: xxxx@xxxx 
Received: by xxxx.xxxx.xx (Postfix, from userid 1000)
        id 3017D88FADD; Tue, 19 Sep 2023 06:53:16 -0400 (EDT)
Message-Id: <20230919105316.3017D88FADD@xxx.xxx.xx>
Date: Tue, 19 Sep 2023 06:53:11 -0400 (EDT)
From: xxxx <xxxx@xxx>

test mail 2!

メールの受信形式はmain.cfを変更することで変更できる