2010年11月25日木曜日

[SA-4-4] メール送信(Shell Script)

サーバは管理者の傍らではなく,遠隔地に置かれることが多い事から,ディスク使用量/プロセス死活監視/ネットワーク疎通確認等で問題が起きた際に,サーバの画面上にアラートを表示するだけでは不十分である.
そこで,アラートが発生した際にそのメッセージをメールとしてサーバから管理者に送信する事で,トラブルの見落としを防ぐ事が可能となる.

※下記サンプルをCentOS上で動かすために,
1.sendmailのインストール
yum install sendmail
service sendmail start
chkconfig sendmail on
2.スクリプト中のsendmailのパスを変更
/usr/local/sendmail → /usr/sbin/sendmail
3.MAIL_TOを自分のメールアドレスに変更
4.iconvの記述を変更
iconv -f EUC-JP -t ISO-2022-JP → iconv -f UTF-8 -t ISO-2022-JP


mail_plain.bash
#!/bin/bash
# メール設定
MAIL_FROM="foo@example.com"
MAIL_TO="bar@example.com"
MAIL_SUBJECT="テストメール"
MAIL_ID="<$(date +%Y%m%d%H%M%S).$(id -ru).$$@$(hostname)>"
SENDMAIL=/usr/lib/sendmail

# 共通関数の読み込み
FILE_UTIL=util_common.bash
. "${FILE_UTIL}" 2> /dev/null \
    || . "${0%/*}/${FILE_UTIL}" 2> /dev/null
if [ $? -ne 0 ]; then
    echo "Can't load ${FILE_UTIL}!" 1>&2
    exit 1
fi

# 文字コードを英語に
unset_linguas

# 作業ディレクトリの作成
tmpdir=$(make_tmp_dir 2>/dev/null)
if [ $? -ne 0 ]; then
    echo "Can't create temporary directory!" 1>&2
    exit 2
fi

# trap の設定
SIGNALS="HUP INT QUIT PIPE TERM"
trap "{ clean_tmp_dir; exit; }" ${SIGNALS}

# サブジェクトを Base64 エンコーディング
subject=$(echo -n "${MAIL_SUBJECT}" |
             iconv -f EUC-JP -t ISO-2022-JP |
             perl -MMIME::Base64 -ne 'print encode_base64($_)')

# メールの作成
mail_data="${tmpdir}/mail_data"
cat <<EOF > "${mail_data}"
Mime-Version: 1.0
Content-Type: Text/Plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit
From: ${MAIL_FROM}
To:   ${MAIL_TO}
Subject: =?ISO-2022-JP?B?${subject}?=
Message-Id: ${MAIL_ID}
Date: $(date +"%a, %e %b %Y %H:%M:%S %z")

--------------------------------------------------------
UPTIME
--------------------------------------------------------
$(uptime)

--------------------------------------------------------
W
--------------------------------------------------------
$(w)

--------------------------------------------------------
FREE
--------------------------------------------------------
$(free)


EOF

# メールの送信
iconv -f EUC-JP -t ISO-2022-JP "${mail_data}" |
    "${SENDMAIL}" -oi "${MAIL_TO}" > /dev/null 2>&1

# 作業ディレクトリの削除と trap 解除
clean_tmp_dir
trap ${SIGNALS}

0 件のコメント: