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

公開日: : プログラム ,

このブログを運用している 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

関連記事

icatch_5623339500-resized

Bundler を使ってプロジェクト用の Gem をインストールして Gemfile をバージョン管理ツールに登録するまでの流れ

Bundler を使い始める人向けにまとめた次の記事を書きました。 CentOSにRubyのBu

記事を読む

icatch-8442052993_2978189f52_z-resized

参照可能な yum リポジトリを確認する yum コマンドとワンライナー

あるパッケージをインストールするために配布リポジトリの設定を追加することがあります。 ビジネスユー

記事を読む

icatch-sublimetext_9222613858_mini-thumbnail

Sublime Text3 のインストール直後に行った設定メモ

突発的に自宅のマシンにインストールしてあった Sublime Text2 を 3 にアップデートしま

記事を読む

icatch-2015-004-1

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

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

記事を読む

icatch-jersey_multi_pathparams

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

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

記事を読む

icatch_8626992930-resized

シェルスクリプトでcdしたいパスにスペースが入っている場合の対処法

cd したいパスにスペースが入っていると、パスの先頭からスペースまでを「移動したいパス」と解釈されて

記事を読む

icatch-8587724648_24926df337_z-resized

yum のリポジトリ ATrpms を参照できるように設定する

あるツールの動作検証をしようと調べたところ、そのツールは ATrpms リポジトリが提供しているとの

記事を読む

icatch-markdown_14bd207bd7_mini-thumbnail

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

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

記事を読む

icatch_4365495446-resized

CentOS6.5にGitをソースコードからインストールする

CentOS 6.5 の64ビット版を "Minimal" でインストールした環境で、git sta

記事を読む

icatch_8617990318-resized

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

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

記事を読む

Googleアドセンス用(PC)

Message

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


× 1 = 七

次の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 ↑