LinuxでBash/シェルスクリプトからメールを送信する方法 – MSMTPとMuttの設定手順と実用例
この記事では、Linuxのコマンドラインやシェル、さらにBash/シェルスクリプトからメールを送信する複数の方法を、具体例とともに解説します。
なぜコマンドラインからメールを送りたいのでしょうか? 日常的なやり取りであれば、ほとんどの人は使いやすいUIを備えたメールクライアントを使用します。しかし、タスクの完了時やイベント発生時に、コンピュータへ自動的にメール通知を送らせたいケースは少なくありません。
こうしたメール通知は、ディスク容量不足の警告や、エラー発生・停電時の緊急連絡などによく活用されています。さらに工夫すれば、自作アプリへの新規ユーザー登録数を毎日サマリーとして通知する仕組みを作ることも可能です。以下では、これを実現できるツールとその使用例を紹介します。
メール送信に関する注意点
この記事の例はすべて、外部のSMTPサーバーを使ってメールを送信することを前提としています。Amazon SESやMailGunのような専用のメール配信サービスでもよいですし、GmailやOutlook.comなどのオンラインメールプロバイダが提供するSMTP情報を使って送信しても構いません。
あえて自分のSMTPホストからの直接送信を扱わない理由はシンプルです。住宅用IPアドレスから送信されたメッセージはブロックされやすく、「メール通知が正しく機能しているのか」「単にブロックされているだけなのか」の切り分けが非常に難しくなるからです。
適切なツールの選択
メールを送信できるソフトウェアパッケージは非常に多く存在しますが、すべてを網羅するつもりはありません。「とにかく確実に動くもの」をお探しの方のために、おすすめを一つ挙げます。
MSMTPはこの用途に最適なツールです。この記事ではMSMTPの使い方に焦点を当てて解説します。
以前はSSMTPが定番でしたが、開発が停止してしまったため、現在はMSMTPが良い代替となります。
その他の選択肢としては、sendmail、mail、muttなどのコマンドがあります。いずれも機能しますが、MSMTPは設定が簡単で、システムメールに干渉しない独立した設定を維持できる点が優れています。
MSMTPでメールを送信する
MSMTPはメール送信専用(送信のみ)の軽量プログラムで、Bashスクリプトからメールを送るのに最適です。
MSMTPをインストールしたら、以下のコマンドでユーザーマニュアルを確認できます。
man msmtp
MSMTPのインストール
Debian/Ubuntu系システムでは、以下のコマンドで必要なMSMTPパッケージと、未インストールの場合はca-certificatesパッケージをインストールします。
sudo apt update
sudo apt install msmtp ca-certificates
この記事全体を通じて、sudoコマンドはroot(管理者)権限でコマンドを実行するために使用しています。
MSMTPの設定
MSMTPはユーザーごとの設定とシステム全体のグローバル設定の両方に対応しています。ここでは、すべてのサービスがMSMTPでメールを送信できるよう、グローバル設定を行います。
MSMTPにはサンプル設定ファイルが付属しているので、これをテンプレートとして利用できます。まず/etc/フォルダにコピーしましょう。
sudo cp /usr/share/doc/msmtp/examples/msmtprc-system.example /etc/msmtprc
nanoテキストエディタで設定ファイルを編集します。
sudo nano /etc/msmtprc
次に、メール送信に使用するSMTPサーバーの詳細を記入します。異なるサーバーやアドレスから送信したい場合は、複数のメールアカウントを定義することも可能です。
以下は、2つのGmailアドレスを使用する場合の設定例です。
# 以降の全アカウントに適用されるデフォルト値を設定 defaults auth on tls on tls_trust_file /etc/ssl/certs/ca-certificates.crt logfile ~/.msmtp.log # Gmail アカウント1 account gmail1 host smtp.gmail.com port 587 from admin@wsxdn.com user username1 password password1 # Gmail アカウント2 account gmail2 host smtp.gmail.com port 587 from admin@wsxdn.com user username2 password password2 # デフォルトアカウントを設定 account default : gmail1
ファイルを保存すれば、MSMTPの準備は完了です。
メールを送信する
MSMTPの設定が完了したら、すぐに使い始められます。メール送信に追加のソフトウェアは不要です。printfコマンドでメールを作成し、パイプでmsmtpコマンドに渡すだけで送信できます。
printf "Subject: Testing\nHello there!." | msmtp -a gmail2 admin@wsxdn.com
"Subject: Testing\nHello there!." – これが送信されるメールの内容です。Subject:の後に件名テキストを続けて件名を定義します。\nは改行を表し、その後にメール本文が続きます。必要に応じて\nを追加することで、整形されたプレーンテキストメッセージを作成できます。
-aオプションは、どのメールアカウントから送信するかを指定します。省略した場合はデフォルトアカウントが使用されます。
Muttで添付ファイル付きメールを送信する
添付ファイル付きのメール送信は少し複雑で、作業を簡単にするには追加のソフトウェアが必要です。muttは、スクリプトでの利用に最小限の手間でこの機能を追加できるメールクライアントです。
以下のコマンドでインストールします。
sudo apt install mutt
muttのインストール時には、依存関係としてPostfixメール転送エージェント(MTA)が導入され、メール設定を尋ねられることがあります。No configuration(設定なし)を選んで問題ありません。Postfixの設定は不要です。前述のとおり、スパムフィルタリングによって宛先に届かない可能性があるため、このシステムから直接メールを送信することは想定していません。
MSMTPと同様に、muttにもユーザーごとの設定とグローバル設定があります。ここでは、すべてのユーザー/サービスが添付ファイル付きメールを送信できるよう、グローバル設定を使用します。nanoテキストエディタでファイルを作成・編集します。
nano /etc/muttrc
以下の設定を入力します(値はご自身のメール設定に置き換えてください)。
set sendmail="/usr/bin/msmtp" set use_from=yes set realname="Your Name" set from=admin@wsxdn.com set envelope_from=yes
これでmuttの設定は完了し、添付ファイル付きメールを送信できるようになりました。
echo "Email message body" | mutt -a attachment.txt -s "My Subject" -- admin@wsxdn.com
-aオプションで添付ファイルを、-sオプションで件名を指定します。宛先アドレスの前に--を置くことで、オプションと宛先を明確に区別できます。
ユーザーごとの設定とグローバル設定の使い分け
上記ではグローバル設定を定義しました。設定を特定のユーザーにのみ適用したい場合(例えば、各ユーザーが自分のユーザーアカウントからのみ送信できるようにしたい場合など)は、代わりに各ユーザーのホームディレクトリにある以下のファイルに設定を記述してください。
~/.msmtprc
~/.muttrc
ユーザーごとの設定ファイルは、グローバル設定(/etc/msmtprc、/etc/muttrc)よりも優先されます。セキュリティの観点から、~/.msmtprcにはパスワードが含まれる可能性があるため、所有者以外が読み取れないようchmod 600 ~/.msmtprcで権限を制限しておくことをおすすめします。
-
Windows 10にLinux Bashシェルをインストールする方法【WSL設定ガイド】
Bashシェルとは?Windows 10でLinuxが動く仕組み Bashシェルは、長年にわたりLinuxに搭載されてきたコマンドラインユーティリティです。そして現在、MicrosoftはこのBashシェルをWindows 10に直接組み込みました。これは仮想マシンでも、コンテナでも、Windows向けにコンパイルされたソフトウェアでもありません。実態は、Linuxソフトウェアを実行するための「Windows Subsystem for Linux(WSL)」というサブシステムであり、AndroidアプリをWindows上で動かすために開発されていた(後に中止された)Project Asto
-
実用的な5つの例で学ぶBashスクリプト入門チュートリアル
Unix SedやUnix Awkシリーズと同様に、本シリーズではBashスクリプティングに関する記事を複数回にわたって公開します。実用的なサンプルを交えながら、Bashスクリプティングのテクニックを幅広く解説していきます。 シェルとは、ユーザーが入力したコマンドを解釈して実行するプログラムです。コマンドはユーザーが直接入力するか、「シェルスクリプト」と呼ばれるファイルから読み込まれます。 ユーザーからの入力を直接読み取る場合、そのシェルは対話型(インタラクティブ)シェルと呼ばれます。 一方、ファイルからコマンドを読み込んで実行する場合は非対話型(ノンインタラクティブ)シェルと呼ばれます。この