Postfix で Microsoft 365 経由でメール送信できるようにする( SMTP から SMTP-AUTH )

メモ:  Category:ubuntu

ファイル サーバー リソース マネージャー ( FSRM )や某 UPS のソフトウェアが SMTP-AUTH に対応していないため、内部の Postfix から外部の SMTP サーバを利用(リレー)して送信するように環境を構築します。

Postfix のインストール

Ubuntu サーバー(24.04.0)へ Postfix をインストールします。

$ sudo apt-get update
$ sudo apt-get install postfix

インストール中に設定の種類を聞かれます。ここでは、各種パラメータについて理解したいため 「 No configuration 」を選択しました。

Postfix の初期設定

インストールは、以上で完了します。

Postfix の設定

Postfix の設定は、全体的な設定を行う main.cf と、各デーモン毎の設定を行う master.cf があります。

今回実現したい環境では、 master.cf の変更が必要なさそうなので main.cf を用意していきます。

インストール時に「 No configuration 」を選択したため、 main.cf が作成されていませんので設定ファイルを作成します。

$ sudo vi /etc/postfix/main.cf

まずは、メール送信に必要な設定を行っていきます。

myhostname = smtp.bnote.hoge
mydomain = bnote.hoge
myorigin = $mydomain
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
mynetworks = 127.0.0.0/8
smtpd_banner = $myhostname ESMTP $mail_name
syslog_facility = mail
smtpd_relay_restrictions =  permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination

myhostname は、 Postfix が動いているマシンの完全修飾ドメイン名を指定します。

mydomain は、 myhostname の親ドメインを指定します。 mydomain を設定しない場合、myhostname から最初の要素(最初のピリオドまで)を除いたもが自動的に適用されます。

myorigin は、ローカルで投函されたメールがどのドメインから来るように見えるかを指定します。

サーバー上から直接メールをローカル配信した場合に自動的に補われるドメイン名とのことですので、 mydomein を指定しています。この設定により「@」以降が「bnote.hoge」となります。

mydestination は、 このマシンが他のマシンに転送せずにローカルに配送するドメインを指定します。メール配送がループしてしまわないように $mydomain など自分宛てのアドレスになるものを指定します。

mynetworks は、配送(リレー)することを許可する IP のリストを指定します。とりあえず、ローカルのみとしています。

smtpd_banner は、 SMTP サーバーへ接続したときの最初のあいさつで、状態コード(220)の後に続くメッセージを指定します。

syslog_facility は、 syslog で定義されている mail を指定します。ログは、 /var/log/ へ  mail.log といったファイルで出力されます。

smtpd_relay_restrictions は、 Postfix 2.10 以降に用意されたメール中継のアクセス制限に関するパラメータになります。 2.10 以降では、この設定が無いと適切に配送してくれません。

それでは、最初の設定はここまでとして Postfix を再起動します。

$ sudo systemctl restart postfix

Postfix に接続してみる

Telnet で Postfix へ接続して動作確認を行います。

$ telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 smtp.bnote.hoge ESMTP Postfix

状態コード(220 )が返ってくればとりあえず動作しています。

クライアントから送信できるよう設定する

Postfix を導入したマシン以外から送信できるようにしたいため main.cf を次のように修正します。

mynetworks = 192.168.1.0/24,127.0.0.0/8

この設定により、192.168.1 に所属する端末からの接続を許可します。

次に SMTP のための 25 番ポートを開けるようにします。今回の目的は、SMTP-AUTH に対応していないシステムのために環境構築出もありますので 25 番ポートのみをターゲットとしています。

まず、ファイアウォールの設定をするため ufw で状態を確認します。

$ sudo ufw status
Status: inactive

今回は、「 inactive 」になっていたので、 ufw を有効にします。

$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)?

「現在の ssh 接続を中断させる可能性があります。操作を続けますか?」と聞かれるので「 y 」を入力します。 これで設定可能になったので、必要なポートを開けていきます。

$ sudo ufw allow 25/tcp
$ sudo ufw reload

ファイアウォールの設定が正しくできたかは、次のコマンドで確認できます。

$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
25/tcp                    ALLOW       Anywhere
25/tcp (v6)               ALLOW       Anywhere (v6)

​ 動作確認する

SMTP で外部に送信できる環境がある場合、ここまでの設定でメールの送信ができるようになります。 Thunderbird などの MUA に環境構築したマシンを SMTP サーバーとして設定し送信してみます。

正しく送信ができない場合は、 /var/log/mail.log を確認し問題を確認します。例えば mynetworks を設定していない場合、次のログが出力されていました。

2024-12-02T07:24:57.383713+00:00 hoge postfix/smtpd[9718]: NOQUEUE: reject: RCPT from unknown[192.168.x.x]: 554 5.7.1 <bnote@aaa.hoge>: Relay access denied; from=<bnote@aaa.hoge> to=<bnote@aaa.hoge> proto=ESMTP helo=<[192.168.x.x]>

Microsoft 365 経由でメール送信できるよう設定する

メールの配送を Microsoft 365 へ向けるため main.cf へメールのリレーにかかわる設定と SMTP 認証の設定を次のように追記します。

transport_maps = hash:/etc/postfix/transport
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/relay_password
smtp_sasl_security_options = noanonymous
smtp_tls_security_level = may

transport_maps は、指定したファイルに宛先ドメインごとに配送先メールサーバを定義します。例えば、 transport ファイルに次のような設定をすると bnote.hoge はローカルの SMTP サーバでメール配信、 gmail.com は GMAIL の SMTP サーバ経由、それ以外は office365 の SMTP サーバ経由になります。

bnote.hoge   :
gmail.com      smtp:[smtp.gmail.com]:587
*              smtp:smtp.office365.com:587

smtp_sasl_auth_enable は、 SMTP 認証を有効にします。

smtp_sasl_password_maps は、リレー先サーバのアドレスと、認証で使用するユーザ名/パスワードを定義したファイルを指定します。

smtp_sasl_security_options は、リレー先メールサーバの TLS 暗号化で使うセキュリティオプションを指定します。匿名ユーザ(anonymous)でのログインを許可しないように「 noanonymous 」設定します。

smtp_tls_security_level は、リレー先 SMTP サーバとの通信で SSL/TLS 通信を使うかをしていします。 may を指定した場合、宛先メールサーバが SSL/TLS に対応していれば暗号化通信するが、対応していなければ平文通信を行います。

main.cf に設定を追加出来たら、 transport_maps と smtp_sasl_password_maps で指定したファイルを準備します。

$ sudo vi /etc/postfix/relay_password

次のようにリレー先サーバと、認証で使用するユーザ名/パスワードを追加します。

smtp.office365.com:587 ユーザー名:パスワード

次に配送先を定義する transport ファイルを作成します。

$ sudo vi /etc/postfix/transport

次のように Microsoft 365 のサーバーを設定します。

*       smtp:smtp.office365.com:587

作成した 2 つのファイルを postmap コマンドでハッシュ化します。

$ sudo postmap /etc/postfix/relay_password
$ sudo postmap /etc/postfix/transport

一通り設定できましたので、 Postfix を再起動しておきます。

$ sudo systemctl restart postfix

ここでの設定は、外部へ向かうすべてのメールを Microsoft 365 のサーバー へ向けていますので、  relay_password に設定したユーザー(メールアドレス)を Mail From に指定するとメールが配送され、それ以外だと配送されません。

bluenote by BBB