コンテンツにスキップ

Ubuntuにmsmtpをインストール

外部メールサーバー(SMTP)経由でメールを送信する方法を紹介します。

パッケージのインストール

msmtpをインストールします。

Terminal window
sudo apt update
sudo apt install msmtp

設定ファイル

/etc/msmtprcを編集します。hostportuserpasswordなどの情報は、各メールサーバーから取得してください。

/etc/msmtprc
auth on
tls on
tls_starttls on
host XXXXXXXXXXXXX.sakura.ne.jp
port 587
from contact@XXXXXXXXXXXXX.sakura.ne.jp
user contact@XXXXXXXXXXXXX.sakura.ne.jp
password smtp-password
# LOG_USERではなくLOG_MAIL(`/var/log/mail.log`など)でログを管理
syslog LOG_MAIL

メール送信

send-to@example.com(送信先のメールアドレス)にメールを送信します。

詳細
printf %b "From: 送信元 <contact@XXXXXXXXXXXXX.sakura.ne.jp>
To: send-to@example.com
Subject: 件名
こんにちは!
現在の日時: $(date '+%Y-%m-%d %H:%M:%S')" | sudo msmtp send-to@example.com

パスワードを別のファイルから取得

passwordevalを使用することで、平文でパスワードを保存することを避け、外部プログラムから取得できます。

GPG 鍵の生成

Terminal window
sudo gpg --batch --passphrase '' --quick-generate-key root default default 0
# gpg [オプション] --quick-generate-key USER-ID [ALGO [USAGE [EXPIRE]]]

暗号化

SMTP パスワードを暗号化し、/etc/.msmtp-password.gpgに出力します。

Terminal window
echo "Please enter SMTP password:"
read -r -s smtp_password
echo "$smtp_password" | sudo gpg --default-recipient-self -e -o /etc/.msmtp-password.gpg
unset smtp_password

復号

以下のコマンドでパスワードを復号できます。

Terminal window
sudo gpg --quiet --for-your-eyes-only --no-tty --decrypt /etc/.msmtp-password.gpg

改善後の設定ファイル

/etc/msmtprc
auth on
tls on
tls_starttls on
host XXXXXXXXXXXXX.sakura.ne.jp
port 587
from contact@XXXXXXXXXXXXX.sakura.ne.jp
user contact@XXXXXXXXXXXXX.sakura.ne.jp
# password smtp-password
passwordeval gpg --quiet --for-your-eyes-only --no-tty --decrypt /etc/.msmtp-password.gpg
# LOG_USERではなくLOG_MAIL(`/var/log/mail.log`など)でログを管理
syslog LOG_MAIL

一般ユーザーが復号できるように設定

セキュリティ上のリスクは高いですが、root の GPG 秘密鍵を一般ユーザーと共有することで、一般ユーザーがgpg --quiet --for-your-eyes-only --no-tty --decrypt /etc/.msmtp-password.gpgを実行してパスワードを復号できるようにします。

Terminal window
sudo gpg --export-secret-keys -a > root_secret_key.asc
gpg --import root_secret_key.asc
rm root_secret_key.asc

これにより、パスワードをそのまま記述することなく、一般ユーザーがsudoなしでmsmtpコマンドを実行してメールを送信できるようになります。

また、~/.msmtprcに設定ファイルを作成し、一般ユーザーごとにパスワードや認証情報を管理することも可能です。

後片付け

msmtpが不要になった場合は以下の手順で GPG 鍵を削除できます。

GPG 鍵の削除

GPG 鍵の一覧を表示して、削除したい鍵の ID を確認します。

Terminal window
sudo gpg --list-keys root
実行結果
gpg: checking the trustdb
gpg: marginals needed: 3 completes needed: 1 trust model: pgp
gpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u
pub rsa3072 2025-04-30 [SC]
1A2B3C4D5E6F7G8H9I0J1K2L3M4N5O6P7Q8R9S0T
uid [ultimate] root
sub rsa3072 2025-04-30 [E]

出力から得られる鍵 ID(上記例では 1A2B3C4D5E6F7G8H9I0J1K2L3M4N5O6P7Q8R9S0T)を使って、GPG 鍵を削除します。

Terminal window
# 秘密鍵を削除(--batchは対話なし、--yesは確認に自動的にYesと応答)
sudo gpg --batch --yes --delete-secret-keys 1A2B3C4D5E6F7G8H9I0J1K2L3M4N5O6P7Q8R9S0T
# 公開鍵を削除
sudo gpg --batch --yes --delete-keys 1A2B3C4D5E6F7G8H9I0J1K2L3M4N5O6P7Q8R9S0T
# または、以下で秘密鍵と公開鍵をまとめて削除
sudo gpg --batch --yes --delete-secret-and-public-keys 1A2B3C4D5E6F7G8H9I0J1K2L3M4N5O6P7Q8R9S0T

一般ユーザーと共有した場合は、そのユーザーでも同様の手順で削除します。

Terminal window
gpg --batch --yes --delete-secret-and-public-keys 1A2B3C4D5E6F7G8H9I0J1K2L3M4N5O6P7Q8R9S0T

その他削除

SMTP パスワードの暗号化ファイルも削除します。

Terminal window
sudo rm /etc/.msmtp-password.gpg

msmtpも削除します。

Terminal window
sudo apt purge msmtp
sudo apt autoremove
sudo rm -f /etc/msmtprc
rm -f ~/.msmtprc