ページ

2013年4月25日木曜日

Linuxでmailに添付ファイルを付ける【uuencodeを利用しない】

Linuxでシェルを作っていると、メールを送信すること
またメールに、添付ファイルを付けたくなった
既存のコマンドだけで可能な限り対応できないかと模索し
シェルを作成。
よく目にするのは、uuencodeコマンドを利用する方法だが
今回は動作環境の事情もあり、該当のコマンドを利用しない方帆を記載

sendmailコマンドを利用し対応、少し汎用性は付けたが
ほぼ基礎のみ比較的簡単に添付ファイルが送付可能
複数のファイルには非対応のため注意が必要

原理は、mailはテキストを特定の書式で送るのが原理のため
書式を手動で作成すれば良い

メールの仕様書を読めばより理解が深まるだろう

環境
環境情報 構築日 ソフトウェア 必要込コマンド
CentOS 5.6 2013/04/25 なし sendmail


#!/bin/bash

############################
## メール添付ファイルスクリプト
## コマンドラインから添付付きメールを送信するスクリプトです.
## ※日本語部分対応のため、完全ではございません.
##
## mail.sh {fromアドレス} {toアドレス} {タイトル} {本文} {添付ファイル名}
##
############################

## 初期化
from_address=$1
to_address=$2
subject=$3
mail=$4
TMP_FILE='mail.tmp'
boundary=`date +%Y%m%d%H%M%N`
content_type=`file --mime $1 | cut -d' ' -f2`
filename=`echo $5 | sed -e "s/.*\/\(.*$\)/\1/"`

## メール情報付与
echo "From: $from_address" > $TMP_FILE
echo "To: $to_address" >> $TMP_FILE
echo "Subject: $subject" >> $TMP_FILE
echo "MIME-Version: 1.0" >> $TMP_FILE
echo "Content-type: multipart/mixed; boundary=\"----$boundary\"" >> $TMP_FILE
echo "Content-Transfer-Encoding: 7bit" >> $TMP_FILE
echo "" >> $TMP_FILE
echo "This is a multi-part message in MIME format." >> $TMP_FILE
echo "" >> $TMP_FILE

## 本文
echo "------$boundary" >> $TMP_FILE
echo "Content-type: text/plain; charset=iso-2022-jp" >> $TMP_FILE
echo "Content-Transfer-Encoding: 7bit" >> $TMP_FILE
echo "" >> $TMP_FILE
echo "$main" >> $TMP_FILE
echo "" >> $TMP_FILE

## ファイル情報(base64で送信)
echo "------$boundary" >> $TMP_FILE
echo "Content-type: $content_type" >> $TMP_FILE
echo " name=$filename" >> $TMP_FILE
echo "Content-Transfer-Encoding: base64" >> $TMP_FILE
echo "Content-Disposition : attachment;" >> $TMP_FILE
echo " filename=$filename" >> $TMP_FILE
echo "" >> $TMP_FILE
cat $5 | base64 >> $TMP_FILE
echo "" >> $TMP_FILE
echo "------$boundary--" >> $TMP_FILE

## メールを送信
sendmail -i $to_address < $TMP_FILE

## 一時ファイルを削除
rm -f $TMP_FILE

exit 0

多少便利ぐらいで使う用途が限定されるが 意外と便利である 検証中に尽き動作保証できないが雰囲気が理解いただけるかと思います。