メール送信のbashスクリプト

メール送信用のbashスクリプト。(sendmailを使用します)
MIMEをechoで生成する地味な仕様。
例では、とりあえずプロセスの状態をメール本文にしている。

#!/bin/bash -h

#===========================================================================
# mail_script
#			Author:kannyo
#===========================================================================

# --------------------------------------------------------------------------
# format
# --------------------------------------------------------------------------

# 作業ディレクトリ
mail_dir=/home/***/mail

target_date=`date +%Y%m%d`
target_month=`date -d "$target_date" +%Y-%m`
test_maildir=$mail_dir/$target_month
if [ ! -d $test_maildir ]
then
	mkdir $test_maildir
fi

# chenge mode
chmod 775 $test_maildir

# 本文に使うファイル名
PS_FILE=$test_maildir/ps_$target_date.txt
# メール本文の一時ファイル
tmp=$test_maildir/MAIL_$target_date.tmp

# --------------------------------------------------------------------------
# mail format
# --------------------------------------------------------------------------

# 送信先アドレス
address="hoge@***.jp"
ccaddress="hogecc@***.jp"

# 送信元アドレスを指定する場合
#fromaddress="***@***.jp"

# 件名
subject="mail_test_$target_date"
subject=`echo $subject | nkf -j`

# --------------------------------------------------------------------------
# main routine
# --------------------------------------------------------------------------

# 記録用の時間を保存
savetime=`date +%Y/%m/%d_%H:%M:%S`

# プロセスの状態を変数に保存

psbody=`ps -aux | sed -e "s/$/\r\n/g"`

# ファイルにも残してから読み取る場合は下記の様に

# ps -aux > $PS_FILE
# psbody=`cat $PS_FILE | sed 's/$/\r\n/g'`

# ライン用
line="--------------------------------------------------------------------"

# --------------------------------------------------------------------------
# mail body
# --------------------------------------------------------------------------

# メール本文は、MIMEタイプにそってechoを使って追記していく。
# 	用途に応じて文字コードを変更したり内容を書き換える。
# 	また、本文中にif文などを用いて、エラーがあった時にメール内容を
# 	変更する等の対処もできる。

# --------------------------------------------------------------------------
# ここから

# ヘッダ部分
echo 'Subject: '$subject > $tmp
echo 'To: '$address >> $tmp
echo 'Cc: '$ccaddress >> $tmp
#echo 'From: '$fromaddress >> $tmp
echo 'Mime-Version: 1.0' >> $tmp
echo 'Content-Type: text/plain; charset=iso-2022-jp' >> $tmp
echo 'Content-Transfer-Encoding: 7bit' >> $tmp
echo '' >> $tmp

# 本文
echo '==TEST_MAIL==' >> $tmp
echo 'TODAY_TIME : '`echo $savetime | nkf -s` >> $tmp
echo '' >> $tmp
echo $line >> $tmp
echo '' >> $tmp
echo -e "$psbody" >> $tmp
echo '' >> $tmp
echo $line >> $tmp
echo '' >> $tmp

# ここまで
# --------------------------------------------------------------------------

# メール送信
# 	sendmailに先程のメール本文の一時ファイルを送る
/usr/sbin/sendmail -t < $tmp

# メール本文の一時ファイルを削除
rm -f $tmp

ファイルを添付する場合は、下記の様な感じ。
下記の場合は、プロセスの状態をテキストにしてから、
ZIPで圧縮して添付している。

#!/bin/bash -h

#===========================================================================
# mail_script(Attached file ver.)
#			Author:kannyo
#===========================================================================

# --------------------------------------------------------------------------
# format
# --------------------------------------------------------------------------

# 作業ディレクトリ
mail_dir=/home/***/mail

target_date=`date +%Y%m%d`
target_month=`date -d "$target_date" +%Y-%m`
test_maildir=$mail_dir/$target_month
if [ ! -d $test_maildir ]
then
	mkdir $test_maildir
fi

# chenge mode
chmod 775 $test_maildir

# 添付ファイル名
FILENAME=test_$target_date.zip
# 添付ファイルのフルパス
MAIL_FILE=$test_maildir/$FILENAME
# 添付元のファイル名
PS_FILE=$test_maildir/ps_$target_date.txt
# メール本文の一時ファイル
tmp=$test_maildir/MAIL_MULTI_$target_date.tmp

# --------------------------------------------------------------------------
# mail format
# --------------------------------------------------------------------------

# 送信先アドレス
address="hoge@***.jp"
# 件名
subject="mail_multi_test_$target_date"
subject=`echo $subject | nkf -j`

# --------------------------------------------------------------------------
# main routine
# --------------------------------------------------------------------------

# 記録用の時間を保存
savetime=`date +%Y/%m/%d_%H:%M:%S`

# 添付ファイルの元としてプロセスの状態をファイルに保存
ps -aux > $PS_FILE

# プロセスを保存したファイルをzipファイルに圧縮
zip -j "$PS_FILE".tmp $PS_FILE
# パスワードを設定したい場合は下記の様に記述
# PASSの部分がパスワードになる。
#zip -j -P PASS -e "$PS_FILE".tmp $PS_FILE

# MIMEメール用にbase64形式でエンコーディング
#	そのままだと不要なヘッダ部分が先頭に一行あるので、
#	標準出力からsedに渡して最初の一行を削る。
uuencode -m "$PS_FILE".tmp /dev/stdout | sed -e '1d' > $MAIL_FILE
rm -f "$PS_FILE".tmp

# バウンダリー文字(区切り文字)用のユニーク文字列の作成
bound=SAMPLE${RANDOM}

# --------------------------------------------------------------------------
# mail body
# --------------------------------------------------------------------------

# メール本文は、MIMEタイプにそってechoを使って追記していく。
# 	用途に応じて文字コードを変更したり、添付ファイルが複数あるなら
# 	バウンダリー文字で区切って、添付部分を繰り返すなどの応用ができる。
# 	また、本文中にif文などを用いて、エラーがあった時にメール内容を
# 	変更する等の対処もできる。

# --------------------------------------------------------------------------
# ここから

# ヘッダ部分
echo 'Subject: '$subject > $tmp
echo 'To: '$address >> $tmp
echo 'Mime-Version: 1.0' >> $tmp
echo 'Content-Type: Multipart/Mixed; boundary='$bound >> $tmp
echo 'Content-Transfer-Encoding: 7bit' >> $tmp
echo '' >> $tmp

# バウンダリー文字(区切り文字)で区切る
echo '--'$bound >> $tmp

# 本文ヘッダ
echo 'Content-Type: text/plain; charset=iso-2022-jp' >> $tmp
echo 'Content-Transfer-Encoding: 7bit' >> $tmp
echo '' >> $tmp
# 本文
echo '==TEST_MAIL==' >> $tmp
echo 'TODAY_TIME : '`echo $savetime | nkf -s` >> $tmp
echo '' >> $tmp

# バウンダリー文字(区切り文字)で区切る
echo '--'$bound >> $tmp

# ファイルを添付する為のヘッダ
echo 'Content-Type: application/zip; name='$FILENAME >> $tmp
echo 'Content-Transfer-Encoding: base64' >> $tmp
echo 'Content-Disposition: attachment; filename='$FILENAME >> $tmp
echo '' >> $tmp
# ファイルを添付
cat $MAIL_FILE >> $tmp
echo '' >> $tmp

# バウンダリー文字(区切り文字)で区切る
echo '--'$bound >> $tmp

# ここまで
# --------------------------------------------------------------------------

# メール送信
# 	sendmailに先程のメール本文の一時ファイルを送る
/usr/sbin/sendmail -t < $tmp

# メール本文の一時ファイルを削除
rm -f $tmp