Postfix(SMTPメールサーバー)を設定し、Gmailへメール送信するまで
サーバーアプリケーションでメール送信機能を実装したいため、ChatGPTに相談しながら色々考えました。
- SendGrid
- Mailgun
- Amazon SES (Simple Email Service)
- SMTPサーバー (例: Postfix, Exim)
SendGrid のサービスを使えばSMTPサーバーを自前で用意する必要がなくなります。料金も比較的安いと思いますし、開発コストを抑えたい場合は、このようなサービスを利用するのもありかと思います。
今回はSMTPサーバーを実装する方向で、開発環境でテストしてみました。
また、Postfixを自前のSMTPサーバーとして運用し、GmailなどのSMTPサーバーを使わずにメールを送信する場合、自分のドメインから直接メールを送信するためにいくつかの設定と構成を行う必要があります。以下の手順で、Postfixを自前のSMTPサーバーとして設定し、メールを送信できるようにします。
UbuntuにPostfixをインストールする
Postfixのインストールと基本設定
まず、Postfixをインストールし、基本設定を行います。
sudo apt update
sudo apt install postfix libsasl2-modules mailutils
インストール中に「インターネットサイト」を選択し、システムメール名を設定します(例:example.com)。
/etc/postfix/main.cfの編集
次に、/etc/postfix/main.cfを編集して、基本的な設定を行います。
sudo vi /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を再起動して設定を反映させます。
sudo systemctl restart postfix
テストメールの送信
自前のPostfixサーバーを使用してテストメールを送信します。
echo "Test email body" | mail -s "Test Email" sender@example.com
これで、自前のPostfixサーバーを使ってメールを送信できるようになります。設定の詳細については、必要に応じて調整してください。
macOSにPostfixをインストールする
macOSにはPostfixがデフォルトでインストールされていますが、必要に応じて最新バージョンをインストールすることも可能です。
Postfixの有効化と設定ファイルの編集
/etc/postfix/main.cf を編集して、基本設定を行います。sudo nano /etc/postfix/main.cf
以下の設定を変更または追加します。
# サーバー情報
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を起動して、動作を確認します。
sudo postfix start
メールキューの状態を確認するには、以下のコマンドを使用します。
postqueue -p
メールの送信テスト
以下のコマンドを使用して、ローカルユーザーにメールを送信します。
echo "This is a test email" | mail -s "Test Postfix" your_username@localhost
メールの受信確認
受信したメールは、ユーザーのホームディレクトリの Maildir フォルダに保存されます。メールクライアントを使用して、メールを確認することもできます。
実際にはこんな感じでメールが格納されいます。
$ 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 を作成または編集
sudo vi /etc/postfix/generic
以下のように設定します:
xxxxxx@xxxxxxxxxxxxx.sakura.ne.jp yourname@yourdomain.com
generic マッピングをPostfixに適用
generic マッピングをPostfixに適用するために、以下の設定を行います。generic マッピングデータベースを作成します。sudo postmap /etc/postfix/generic
smtp_generic_maps = hash:/etc/postfix/generic
設定を反映させるために、Postfixを再起動します。
sudo systemctl restart postfix
これで、Postfixが送信するメールの送信元アドレスが独自ドメインを使用するようになりました。
日本語でメールを送信する
日本語でメールを送信するためには、mailコマンドと適切なエンコーディングを使用する必要があります。以下は日本語のメールを送信するための手順です。
日本語メールの内容をファイルに保存
まず、日本語のメール内容をファイルに保存します。例えば、email.txtというファイルに以下の内容を保存します。
From: sender@example.com
To: 宛先のメールアドレス
Subject: テストメールです
Content-Type: text/plain; charset=UTF-8
これはテストメールです。日本語で送信されています。
sendmailコマンドを使用してメールを送信
sendmailコマンドを使用して、日本語のメールを送信します。sendmail -t < email.txt
暗号化して安全にメールを送信する
Gmailなどへメールを送信した際に「このメールはvs.sakura.ne.jp で暗号化されませんでした」と表示されます。
以下の手順に従って、Postfixで Let's Encrypt の証明書を使用して暗号化メールを送信する設定を行います。
証明書の確認
まず、Let's Encryptの証明書が正しい場所に存在するか確認します。通常、以下のパスに証明書が格納されます。
/etc/letsencrypt/live/your_domain/fullchain.pem
/etc/letsencrypt/live/your_domain/privkey.pem
証明書がなければ適宜、cerbotを使って発行しておきます。
Postfix設定ファイルの編集
次に、/etc/postfix/main.cfを編集して、Let's Encryptの証明書を使用するように設定します。
sudo vi /etc/postfix/main.cf
以下の行を追加または修正します。
# 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
設定を反映させるためにPostfixを再起動します。
sudo systemctl restart postfix
これで暗号化されたメール送信ができるようになりました。
メール送信後、ログファイルを確認してTLSが使用されていることを確認します。
sudo tail -f /var/log/mail.log