シェルスクリプトでメールを送信する

公開日: : プログラム ,

このブログを運用している Linux サーバの監視スクリプトを作成した記事を書きました。

このスクリプトは負荷が閾値を超えた場合に警告メールを送信するようにしていて、メール送信には mail コマンドを使ってます。

この mail、初めて使ってみたので動作確認してみました。
動作確認を進めるなかで mail のようにメール送信できる mutt コマンドも触ったので、これらの検証内容をメモしておきます。

icatch-_9692711856

photo credit: dreams & pancakes via photopin cc

目次

1. パターン1:件名あり・本文なし・添付ファイルなしでメールを送信する

上の記事で書いた監視スクリプトが送信する警告メールは、件名だけのメールにしています。
「ちょっと気にかけたほうがいいかも」ってことが分かればいいので、シンプルに件名だけにしました。

件名あり・本文なし・添付ファイルなしでメールを送信するには、-s オプションで件名を指定し、メールアドレスを引数に渡して mail を実行します。

本文なしの場合でも空白文字を echo とかのコマンドで mail に渡さないと処理が止まってしまう(本文が入力されるのを待ってしまう)仕様になっているようです。

サンプルコードはこんな感じです。

#!/bin/sh

PROJECT_NAME=`dirname $0 | sed -e 's#\(.*\)\/\(.*\)#\2#g'`
if [ ${PROJECT_NAME} = '.' ]; then
        # スクリプトが置かれているディレクトリで実行した場合は pwd を使う
        PROJECT_NAME=`pwd | sed -e 's#\(.*\)\/\(.*\)#\2#g'`
fi
SCRIPT_NAME=`basename $0`

MAIL_ADDRESS=mail@addr.ess
SUBJECT="[${PROJECT_NAME}]${SCRIPT_NAME}"
BODY=

echo ${BODY} | mail -s ${SUBJECT} ${MAIL_ADDRESS}

件名にはプロジェクト名と実行スクリプト名を入れています。

2. パターン2:件名あり・本文あり・添付ファイルなしでメールを送信する

次に本文ありのパターンです。

これはパターン1とほぼ同じです。
違いは mail に渡す文字が空白文字ではなくなったところだけです。

サンプルコードはこんな感じです。

#!/bin/sh

PROJECT_NAME=`dirname $0 | sed -e 's#\(.*\)\/\(.*\)#\2#g'`
if [ ${PROJECT_NAME} = '.' ]; then
        # スクリプトが置かれているディレクトリで実行した場合は pwd を使う
        PROJECT_NAME=`pwd | sed -e 's#\(.*\)\/\(.*\)#\2#g'`
fi
SCRIPT_NAME=`basename $0`

MAIL_ADDRESS=mail@addr.ess
SUBJECT="[${PROJECT_NAME}]${SCRIPT_NAME}"
BODY="メール本文をここに書く"

echo ${BODY} | mail -s ${SUBJECT} ${MAIL_ADDRESS}

3. パターン3:件名あり・本文なし・添付ファイルありでメールを送信する

本文はないけど添付ファイルはありというパターンです。

mail を使って本文あり・添付ファイルありで送信できるんじゃないかと試行錯誤しましたが、うまくできませんでした。なので、本文なし・添付ファイルありになっています(別のコマンドを使って本文あり・添付ファイルありで送信できたので、それは次で紹介します)。

で、mail はテキストを送信するように実装されているので、 mail 単体では添付ファイルは扱えないみたいです。参照元を引用しておきます。

mailはテキストを特定の書式で送るのが原理のため

戯言と技術: Linuxでmailに添付ファイルを付ける【uuencodeを利用しない】

そこで、uuencode を使って添付ファイルをエンコードして送信する、という方法を取るのが一般的なようです。これも参照元から引用しておきます。

uuencodeは、バイナリデータをテキストデータに変換するUNIX及びUnix系OSのコマンド。或いは、それによって生成されるテキストデータのフォーマット。

mailコマンドで添付ファイル付きメールを送信 – shibainu55日記

環境に uuencode がインストールされているかは which で確認できます。
インストールされていないと次のように表示されます。

$ which uuencode
uuencode not found

uuencodeyum でインストールします。uuencode は sharutils パッケージに含まれているようです。

$ sudo yum -y install sharutils
:
:
$ which uuencode
/usr/bin/uuencode

uuencode を使ったサンプルコードはこんな感じです。
添付ファイルを引数で指定するようにしてみました。

#!/bin/sh

SCRIPT_NAME=`basename $0`

if [ $# -ne 1 ];then
    # スクリプトの第一引数に添付ファイルのパスを指定してもらう
    echo "Usage: ${SCRIPT_NAME} attachment_file_path" 1>&2
    exit 1
fi
ATTACHMENT_FILE_PATH=$1
ATTACHMENT_FILE=`basename ${ATTACHMENT_FILE_PATH}`

PROJECT_NAME=`dirname $0 | sed -e 's#\(.*\)\/\(.*\)#\2#g'`
if [ ${PROJECT_NAME} = '.' ]; then
    # スクリプトが置かれているディレクトリで実行した場合は pwd を使う
    PROJECT_NAME=`pwd | sed -e 's#\(.*\)\/\(.*\)#\2#g'`
fi

MAIL_ADDRESS=mail@addr.ess
SUBJECT="[${PROJECT_NAME}]${SCRIPT_NAME}"

uuencode ${ATTACHMENT_FILE_PATH} ${ATTACHMENT_FILE} | mail -s ${SUBJECT} ${MAIL_ADDRESS}

4. パターン4:件名あり・本文あり・添付ファイルありでメールを送信する

最後に本文あり・添付ファイルありのパターンです。

いろいろ調べてみると、mail ではなく mutt というコマンドを使うとできるようです(mutt というのは、”Mutt Mail User Agent” の略称のようです)。

さっそく環境に mutt をインストールします。
インストールには uuencode と同様に yum を使います。

$ which mutt
mutt not found
$ sudo yum -y install mutt
:
:
$ which mutt
/usr/bin/mutt

ちなみにインストールした mutt のバージョンは次の通りでした。

$ mutt -v
Mutt 1.5.20 (2009-12-10)

で、mutt を使った件名あり・本文あり・添付ファイルありでメールを送信するサンプルコードはこんな感じです。
添付ファイルは引数で指定します。

#!/bin/sh

SCRIPT_NAME=`basename $0`

if [ $# -ne 1 ];then
    # スクリプトの第一引数に添付ファイルのパスを指定してもらう
    echo "Usage: ${SCRIPT_NAME} attachment_file_path" 1>&2
    exit 1
fi
ATTACHMENT_FILE_PATH=$1

PROJECT_NAME=`dirname $0 | sed -e 's#\(.*\)\/\(.*\)#\2#g'`
if [ ${PROJECT_NAME} = '.' ]; then
    # スクリプトが置かれているディレクトリで実行した場合は pwd を使う
    PROJECT_NAME=`pwd | sed -e 's#\(.*\)\/\(.*\)#\2#g'`
fi

MAIL_ADDRESS=mail@add.ress
SUBJECT="[${PROJECT_NAME}]${SCRIPT_NAME}"
BODY="ここに本文を書く"

echo ${BODY} | mutt -s ${SUBJECT} -a ${ATTACHMENT_FILE_PATH} -- ${MAIL_ADDRESS}

このスクリプトを作成するにあたって、関係ありそうな部分を man でざっとさらってみたのでメモしておきます。

  • 本文の指定は mail と同じ
  • 件名も mail と同じく -s オプションで指定する
  • 添付ファイルの指定は -a オプションを使う
    • -a オプションは、オプションの一番最後に指定する
    • -a オプションを使う場合、メールアドレスとの区切りには “–” を指定する

5. まとめ

以上、mailmutt コマンドを使った基本的なメール送信パターンの紹介でした。

連絡手段は多様化していますが、業務ではメール連絡がまだまだ一般的なので「こんなことができる」ってことをさらりと知っておくいいかもしれないですね。

  • 件名指定には -s オプション
  • 本文は echo などを使ってコマンドに渡す
  • ファイル添付は、、、
    • mail なら uuencode でエンコードする
    • mutt なら mutt 単体で送信できる
  • 本文あり、かつ、添付ファイル付きのメールを送信する場合は mutt を使う

6. その他 Linux に関する記事

その他の Linux に関する記事は次の通りです。
気になる記事があったらぜひチェックしてみてください!

Googleアドセンス用(PC)

  • このエントリーをはてなブックマークに追加
  • follow us in feedly

関連記事

20140811-00

64ビット版のCentOSをVMwareにインストールできない場合の対処法

Linux で検証したい作業が多かったので VMware に検証環境を作りました。OS は Cent

記事を読む

icatch-2015-005-1

ユニットテストの偏りを防ぐ命名規則の付け方

ユニットテスト名に以下の命名規則を付けるようにして二ヶ月ぐらい経った。 正常系テストの場合: 正

記事を読む

icatch_8617990318-resized

yum が参照するミラーサイトの baseurl を変更して日本国内のものに設定する

yum が参照するリポジトリのミラーサイトは変更することができます。 このミラーサイトを日本国内のも

記事を読む

icatch-markdown_14bd207bd7_mini-thumbnail

Markdown記法のテキストに書いたソースコードをシンタックスハイライトするプラグイン

SublimeText3 で拡張子が md のファイルを開いたときに、文章中に書かれたプログラムのソ

記事を読む

icatch-jersey_multi_pathparams

Jerseyの@PathParamはスラッシュの間に複数指定できる

http://hoge-api/user/{id}.{format} のような URL も以下のよう

記事を読む

icatch-8785445626_587fdac14d_z-resized

検証用の CentOS をインストールした直後に行う初期設定手順

職場でも自宅でも Linux で検証したい作業があったので VMware に 64 ビット版の Ce

記事を読む

icatch-back-scratcher_3553512020_mini-thumbnail

Sublime Text3 で JavaScript を書くために設定したプラグインとキーバインド

プロフィール にもあるように、ボクは Java をメインとしたプログラマです。 IDE には Ecl

記事を読む

no image

より安全にパスワードを保存するために考えること

知ってる人にとっては当たり前のことだろうが、あまり深く考えたことがなかったので調べてみた。 前提

記事を読む

icatch-2015-002

Optionalから値を取り出すにはorElseGet()を使う

「Optional が値を持っていない場合のみ ◯◯ を実行する」を実装するときは Optional

記事を読む

icatch-2015-004-1

Vagrantで起動したCentOS上のOctopressをホストOSから確認する設定

タイトルの通りだが、Vagrant を使って起動した CentOS に Octopress をインス

記事を読む

Googleアドセンス用(PC)

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


− 二 = 2

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Googleアドセンス用(PC)

icatch-jersey_multi_pathparams
Jerseyの@PathParamはスラッシュの間に複数指定できる

http://hoge-api/user/{id}.{format}

icatch-vagrant_box_customize
VagrantのBoxファイルをカスタマイズして独自のBoxファイルを作成する

配布されている Vagrant の Box ファイルを使って検証環境を

icatch-2015-006-1
バリデーションチェックにJava8のOptionalを使ってスマートに書く(自分比)

Web アプリのバリデーションチェックにアノテーションを使うことが増え

icatch-2015-005-1
ユニットテストの偏りを防ぐ命名規則の付け方

ユニットテスト名に以下の命名規則を付けるようにして二ヶ月ぐらい経った。

icatch-2015-004-1
Vagrantで起動したCentOS上のOctopressをホストOSから確認する設定

タイトルの通りだが、Vagrant を使って起動した CentOS に

→もっと見る

PAGE TOP ↑