Bashプログラミング
 Computer >> コンピューター >  >> プログラミング >> Bashプログラミング

LinuxでBash/シェルスクリプトからメールを送信する方法 – MSMTPとMuttの設定手順と実用例

この記事では、Linuxのコマンドラインやシェル、さらにBash/シェルスクリプトからメールを送信する複数の方法を、具体例とともに解説します。

なぜコマンドラインからメールを送りたいのでしょうか? 日常的なやり取りであれば、ほとんどの人は使いやすいUIを備えたメールクライアントを使用します。しかし、タスクの完了時やイベント発生時に、コンピュータへ自動的にメール通知を送らせたいケースは少なくありません。

こうしたメール通知は、ディスク容量不足の警告や、エラー発生・停電時の緊急連絡などによく活用されています。さらに工夫すれば、自作アプリへの新規ユーザー登録数を毎日サマリーとして通知する仕組みを作ることも可能です。以下では、これを実現できるツールとその使用例を紹介します。

メール送信に関する注意点

この記事の例はすべて、外部のSMTPサーバーを使ってメールを送信することを前提としています。Amazon SESやMailGunのような専用のメール配信サービスでもよいですし、GmailやOutlook.comなどのオンラインメールプロバイダが提供するSMTP情報を使って送信しても構いません。

あえて自分のSMTPホストからの直接送信を扱わない理由はシンプルです。住宅用IPアドレスから送信されたメッセージはブロックされやすく、「メール通知が正しく機能しているのか」「単にブロックされているだけなのか」の切り分けが非常に難しくなるからです。

適切なツールの選択

メールを送信できるソフトウェアパッケージは非常に多く存在しますが、すべてを網羅するつもりはありません。「とにかく確実に動くもの」をお探しの方のために、おすすめを一つ挙げます。

MSMTPはこの用途に最適なツールです。この記事ではMSMTPの使い方に焦点を当てて解説します。

以前はSSMTPが定番でしたが、開発が停止してしまったため、現在はMSMTPが良い代替となります。

その他の選択肢としては、sendmailmailmuttなどのコマンドがあります。いずれも機能しますが、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で権限を制限しておくことをおすすめします。

  1. 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

  2. 実用的な5つの例で学ぶBashスクリプト入門チュートリアル

    Unix SedやUnix Awkシリーズと同様に、本シリーズではBashスクリプティングに関する記事を複数回にわたって公開します。実用的なサンプルを交えながら、Bashスクリプティングのテクニックを幅広く解説していきます。 シェルとは、ユーザーが入力したコマンドを解釈して実行するプログラムです。コマンドはユーザーが直接入力するか、「シェルスクリプト」と呼ばれるファイルから読み込まれます。 ユーザーからの入力を直接読み取る場合、そのシェルは対話型(インタラクティブ)シェルと呼ばれます。 一方、ファイルからコマンドを読み込んで実行する場合は非対話型(ノンインタラクティブ)シェルと呼ばれます。この