Postfix(SMTPメールサーバー)を設定し、Gmailへメール送信するまで

サーバーアプリケーションでメール送信機能を実装したいため、ChatGPTに相談しながら色々考えました。

  1. SendGrid
  2. Mailgun
  3. Amazon SES (Simple Email Service)
  4. SMTPサーバー (例: Postfix, Exim)

SendGrid のサービスを使えばSMTPサーバーを自前で用意する必要がなくなります。料金も比較的安いと思いますし、開発コストを抑えたい場合は、このようなサービスを利用するのもありかと思います。

今回はSMTPサーバーを実装する方向で、開発環境でテストしてみました。

また、Postfixを自前のSMTPサーバーとして運用し、GmailなどのSMTPサーバーを使わずにメールを送信する場合、自分のドメインから直接メールを送信するためにいくつかの設定と構成を行う必要があります。以下の手順で、Postfixを自前のSMTPサーバーとして設定し、メールを送信できるようにします。

UbuntuにPostfixをインストールする

Postfixのインストールと基本設定

まず、Postfixをインストールし、基本設定を行います。

bash
sudo apt update
sudo apt install postfix libsasl2-modules mailutils

インストール中に「インターネットサイト」を選択し、システムメール名を設定します(例:example.com)。

/etc/postfix/main.cfの編集

次に、/etc/postfix/main.cfを編集して、基本的な設定を行います。

bash
sudo vi /etc/postfix/main.cf

以下のように設定しました。

/etc/postfix/main.cf
smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no
append_dot_mydomain = no
readme_directory = no
compatibility_level = 3.6
myhostname = example.com
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = $myhostname, localhost.$mydomain, localhost
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = ipv4

さらに、/etc/mailname には自分のドメイン名を追記します。ドメイン管理のDNSは適宜設定しておきます。

Postfixの再起動

すべての設定が完了したら、Postfixを再起動して設定を反映させます。

bash
sudo systemctl restart postfix

テストメールの送信

自前のPostfixサーバーを使用してテストメールを送信します。

bash
echo "Test email body" | mail -s "Test Email" sender@example.com

これで、自前のPostfixサーバーを使ってメールを送信できるようになります。設定の詳細については、必要に応じて調整してください。

macOSにPostfixをインストールする

macOSにはPostfixがデフォルトでインストールされていますが、必要に応じて最新バージョンをインストールすることも可能です。

Postfixの有効化と設定ファイルの編集

/etc/postfix/main.cf を編集して、基本設定を行います。
sh
sudo nano /etc/postfix/main.cf

以下の設定を変更または追加します。

sh
# サーバー情報
myhostname = localhost
mydomain = local
myorigin = $myhostname

# メールの受信を許可するドメイン
mydestination = $myhostname, localhost.$mydomain, localhost

# ネットワーク設定
mynetworks = 127.0.0.0/8

# メールボックスの設定
home_mailbox = Maildir/

# SMTP接続の設定
inet_interfaces = loopback-only

Postfixの起動と確認

Postfixを起動して、動作を確認します。

sh
sudo postfix start

メールキューの状態を確認するには、以下のコマンドを使用します。

sh
postqueue -p

メールの送信テスト

以下のコマンドを使用して、ローカルユーザーにメールを送信します。

sh
echo "This is a test email" | mail -s "Test Postfix" your_username@localhost

メールの受信確認

受信したメールは、ユーザーのホームディレクトリの Maildir フォルダに保存されます。メールクライアントを使用して、メールを確認することもできます。

実際にはこんな感じでメールが格納されいます。

zsh
$ cat Maildir/new/1720238174.V1000011I18ff305M712029.mac.local
Return-Path: <your_username@localhost>
X-Original-To: your_username@localhost
Delivered-To: your_username@localhost
Received: by localhost (Postfix, from userid 501)
    id AB90518FF374; Sat,  6 Jul 2024 10:59:34 +0900 (JST)
To: your_username@localhost
Subject: Test Postfix
Message-Id: <20240706015934.AB90518FF374@localhost>
Date: Sat,  6 Jul 2024 10:59:34 +0900 (JST)
From: your_username@localhost (Toshihiko Arai)

This is a test email

とりあえず成功です!ただしこのままではGmailへ送信できませんので、TLSなどの設定を行う必要があります。

送信元アドレスを明示的に設定

メール送信できたのですが、送信先のアドレスがさくらサーバーのホスト名になっており、設定した独自ドメインが反映されていませんでした。そこで、Postfixが送信するメールの送信元アドレスを明示的に設定します。これを行うには、generic マッピングを使用します。

/etc/postfix/generic を作成または編集

bash
sudo vi /etc/postfix/generic

以下のように設定します:

plaintext
xxxxxx@xxxxxxxxxxxxx.sakura.ne.jp    yourname@yourdomain.com

generic マッピングをPostfixに適用

generic マッピングをPostfixに適用するために、以下の設定を行います。generic マッピングデータベースを作成します。
bash
sudo postmap /etc/postfix/generic
/etc/postfix/main.cf に以下の行を追加または編集します。
/etc/postfix/main.cf
smtp_generic_maps = hash:/etc/postfix/generic

設定を反映させるために、Postfixを再起動します。

bash
sudo systemctl restart postfix

これで、Postfixが送信するメールの送信元アドレスが独自ドメインを使用するようになりました。

日本語でメールを送信する

日本語でメールを送信するためには、mailコマンドと適切なエンコーディングを使用する必要があります。以下は日本語のメールを送信するための手順です。

日本語メールの内容をファイルに保存

まず、日本語のメール内容をファイルに保存します。例えば、email.txtというファイルに以下の内容を保存します。

sh
From: sender@example.com
To: 宛先のメールアドレス
Subject: テストメールです
Content-Type: text/plain; charset=UTF-8

これはテストメールです。日本語で送信されています。

sendmailコマンドを使用してメールを送信

sendmailコマンドを使用して、日本語のメールを送信します。
sh
sendmail -t < email.txt

暗号化して安全にメールを送信する

Gmailなどへメールを送信した際に「このメールはvs.sakura.ne.jp で暗号化されませんでした」と表示されます。

以下の手順に従って、Postfixで Let's Encrypt の証明書を使用して暗号化メールを送信する設定を行います。

証明書の確認

まず、Let's Encryptの証明書が正しい場所に存在するか確認します。通常、以下のパスに証明書が格納されます。

sh
/etc/letsencrypt/live/your_domain/fullchain.pem
/etc/letsencrypt/live/your_domain/privkey.pem

証明書がなければ適宜、cerbotを使って発行しておきます。

Postfix設定ファイルの編集

次に、/etc/postfix/main.cfを編集して、Let's Encryptの証明書を使用するように設定します。

sh
sudo vi /etc/postfix/main.cf

以下の行を追加または修正します。

sh
# TLS parameters
smtpd_tls_cert_file=/etc/letsencrypt/live/your_domain/fullchain.pem
smtpd_tls_key_file=/etc/letsencrypt/live/your_domain/privkey.pem
smtpd_use_tls=yes
smtpd_tls_auth_only = yes
smtpd_tls_security_level = may
smtp_tls_security_level = may
smtpd_tls_received_header = yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache
smtpd_tls_loglevel = 1

# Recommended settings for TLS security
smtpd_tls_protocols=!SSLv2,!SSLv3,!TLSv1,!TLSv1.1
smtp_tls_protocols=!SSLv2,!SSLv3,!TLSv1,!TLSv1.1
smtpd_tls_ciphers=high
smtp_tls_ciphers=high
your_domainを実際のドメイン名に置き換えてください。

設定を反映させるためにPostfixを再起動します。

sh
sudo systemctl restart postfix

これで暗号化されたメール送信ができるようになりました。

メール送信後、ログファイルを確認してTLSが使用されていることを確認します。

sh
sudo tail -f /var/log/mail.log

関連記事

最後までご覧いただきありがとうございます!

▼ 記事に関するご質問やお仕事のご相談は以下よりお願いいたします。
お問い合わせフォーム

関連記事