postfixのインストール - メール送信 sendmailコマンド

メールを送信するためのsendmailコマンドを使うためにpostfixをインストールしましょう。

sudo apt install postfix

Webシステム開発では、postfixは受信メールサーバーになる必要はないです。postfixのインストールは、送信メールを配送するサーバーとして機能することと、sendmailコマンドが使えるようにすることが、主な目的です。

メール送信は、お問い合わせフォームにおけるメール送信や、アカウント登録機能のメール認証で利用します。

インストールコマンドを実行すると、GUIの画面が立ち上がってびっくりします。

(CUIで行う方法知っておられましたら「kimoto.yuki@gmail.com」まで、お願いします。)

キーボードの右を押すと、Okが光ります。Enterを押します。

上下キーで「No configuration」を選択します。右キーを押すとOkに勧めるので、Enterを押します。

インストールが始まります。

postfixがインストールされたことの確認

postfixがインストールされたことを確認するためにsystemctlコマンドのstatusを使いましょう。

sudo systemctl status postfix

inactiveで起動はしていないですが、インストールはできています。

● postfix.service - Postfix Mail Transport Agent
   Loaded: loaded (/lib/systemd/system/postfix.service; enabled; vendor preset: enabled)
   Active: inactive (dead)
Condition: start condition failed at Sat 2020-05-16 15:36:13 JST; 2 days ago

postfixが起動していないのは、設定ファイルがないためです。

メールの送信だけでよいので最低限の設定を追加します。このようなものをnullクライアントというらしいです。

myhostnameだけ、書き換えてください。メールがどのサーバーから送信されたかの情報になります。

「ホスト名.ドメイン名」です。ホスト名は、ローカルマシンを識別する名前。web_server1などです。ドメイン名は、あなたの運用しているサイトのひとつのドメイン名などを入れます。

変数「$mydomain」は、myhostnameから自動的に決定されます。

sudo sh -c 'perl > /etc/postfix/main.cf'
print << 'EOS';
myhostname = hostname.example.com
myorigin = $mydomain
relayhost = $mydomain
inet_interfaces = loopback-only
mydestination =
EOS

shの-cオプションを使っているのは、リダイレクトにroot権限を持たせるためです。

perlとリダイレクトを使って複数行の設定ファイルを書き込んでいます。

入力の後はCtrl + Dを押してください。

パラメーターの意味

postfixのパラメータの意味です。以下、ドキュメントから自動翻訳。

myhostname

myhostnameパラメータは、このメールシステムのホスト名を指定します。 デフォルトでは、gethostname()からの完全修飾ドメイン名を使用します。 $myhostnameは多くのデフォルト値として使用されます。その他の構成パラメーター。

myorigin

myoriginパラメータは、ローカルに投稿されたメールの送信元と思われるドメインを指定します。 デフォルトでは、$myhostnameを追加します。これは、小規模なサイトに適しています。 複数のドメインを実行している場合マシンでは、(1)これを$mydomainに変更し、(2)各ユーザーをuser@that.users.mailhostにエイリアスするドメイン全体のエイリアスデータベースを設定する必要があります。

relayhost

relayhostパラメータは、オプションのtransport(5)テーブルで一致するエントリがない場合にメールを送信するデフォルトのホストを指定します。 relayhostが指定されていない場合、メールは宛先に直接ルーティングされます。

イントラネットで、組織のドメイン名を指定します。 内部DNSがMXレコードを使用しない場合は、代わりにイントラネットゲートウェイホストの名前を指定します。

SMTPの場合、ドメイン、ホスト、ホスト:ポート、[ホスト]:ポート、[アドレス]または[アドレス]:ポートを指定します。 [host]の形式はMXルックアップをオフにします。

inet_interfaces

inet_interfacesパラメータは、このメールシステムがメールを受信するネットワークインターフェースアドレスを指定します。 デフォルトでは、ソフトウェアはマシン上のすべてのアクティブなインターフェースを要求します。 の

パラメータは、user @ [ip.address]へのメールの配信も制御します。

プロキシまたはネットワークアドレストランスレータを介して転送されるネットワークアドレスについては、proxy_interfacesパラメータも参照してください。

注:このパラメーターが変更された場合、Postfixを停止/開始する必要があります。

mydestination

mydestinationパラメーターは、このマシンが自分自身を最終的な宛先と見なすドメインのリストを指定します。

これらのドメインは、local_transportパラメータ設定で指定された配信エージェントにルーティングされます。デフォルトでは、これは/ etc / passwdおよび/ etc / aliasesまたはそれらに相当するもののすべての受信者を検索するUNIX互換の配信エージェントです。

デフォルトは$ myhostname + localhost。$ mydomainです。メールドメインゲートウェイでは、$ mydomainも含める必要があります。

仮想ドメインの名前は指定しないでください。これらのドメインは他の場所で指定されています(VIRTUAL_READMEを参照)。

このマシンがバックアップMXホストであるドメインの名前を指定しないでください。 SMTPサーバーのrelay_domains設定を介してこれらの名前を指定するか、怠惰な場合はpermit_mx_backupを使用します(STANDARD_CONFIGURATION_READMEを参照)。

ローカルマシンは常に、メールシステムがメールを受信するインターフェースのuser @ [the.net.work.address]宛てのメールの最終的な宛先です(inet_interfacesパラメーターを参照)。

ホスト名またはドメイン名のリスト、/ file / nameまたはtype:tableパターンをコンマまたは空白で区切って指定します。 / file / nameパターンはその内容で置き換えられます。 type:tableは次の場合に一致します

名前はルックアップキーと一致します(右側は無視されます)。空白で次の行を開始して、長い行を続けます。

以下のセクション「不明なローカルユーザーのメールを拒否する」も参照してください。

postfixの起動と設定ファイルの読み込み

postfixを起動しましょう。

sudo systemctl start postfix

状態を確認。

sudo systemctl status postfix

今度は起動できています。

● postfix.service - Postfix Mail Transport Agent
   Loaded: loaded (/lib/systemd/system/postfix.service; enabled; vendor preset: enabled)
   Active: active (exited) since Tue 2020-05-19 13:53:27 JST; 3s ago
  Process: 12253 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
 Main PID: 12253 (code=exited, status=0/SUCCESS)

May 19 13:53:27 development-batch systemd[1]: Starting Postfix Mail Transport Agent...
May 19 13:53:27 development-batch systemd[1]: Started Postfix Mail Transport Agent.

もし設定ファイルだけを再読み込みするにはreloadを使います。

sudo systemctl reload postfix

これでメールを送信するためのsendmailコマンドが使えるようになります。

postfixの詳細な設定については、後程解説します。

sendmailコマンドが使えることの確認

sendmailがインストールされたことを確認しましょう。

sendmail

以下出力結果です。sendmailコマンドは認識されています。

sendmail: fatal: bad string length 0 < 1: setgid_group =

ではメールを送信してみましょう。[メール]のところを自分のメールにしてください。

sendmailでは、標準入力が、本文になります。

-fはfromでメール送信元を指定します。メール送信元がない場合は、メールがはじかれるという経験が多いので、指定しています。

その後ろに、メールの送信先を指定します。試験するときは、送信先、送信元どちらも同じで大丈夫です。

echo Hello | sendmail -f メール送信元 メール送信先

ポート25がブロックされているとsendmailでメールは送れない

クラウドサーバーなどで、ポート25番のアウトバウンドがブロックされていると、sendmailではmailが送れません。

パブリッククラウドでは、仕組上、アウトバンドのリクエストは、グローバルIPを使いまわすらしく、ブロックリストに入れられる可能性があり、メールが送れなくなってしまうので、デフォルトで、ブロックされているようです。

ifconfigで、固定グローバルIPが確認できると、大丈夫なのかな。そうでなければ、これを疑う。

mailqで、送信メールのキューを表示できます。sendmailの送信が失敗している場合は、ここで確認することができます。

mailq

解決策

ポート25がブロックされている場合は、Amazon SESやSendGridなどの、クラウドメール配信サービスを使うようです。Web API経由で、メール送信リクエストを投げて、信頼されている外部のメールサーバーから、メールを送ってもらう感じですね。

あるメールの送信件数を超えると月額の料金がかかります。

既存のシステムにおける、アプリケーションは、sendmailを呼び出していると思います。

ここから、パブリッククラウドサーバーに移転する場合に、アプリケーションの変更なしに、メールを送信するには、どうすればよいのでしょう。

良い解決策は、postfixをメールのリレーサーバーとして利用して、クラウドメール配信サービスに接続することのようです。(2020年5月20日の段階では、まだ試していません)

PostFixでメール送信 - SendGrid

プログラムを開いて、Web APIに変更というアプリケーション側の変更をしないで済みます。