しばらくぶりのLinuxねた。
Linuxのコンソールからsendmailコマンドやmailコマンドを利用して
メールを送信できることは周知の事実だが、添付ファイルをつけて送信・・・となると
以下のような理由で一気に難易度があがることになる。
・sendmail/mailコマンドが添付ファイルに対応していない(と思う)
・uuencodeで送りつけてもいいが、受信できるメーラーが制限される。
→ # uuencode [attach_file] | mail -s 'Subject' [to@mail.address]
・MIMEを理解しないといけない。
Perlとかプログラムを組めばいけそうだが、そんなスキルはないので、
提供されているプログラムだけを利用してシェルスクリプトを書いてみた。
Redhat Enterprise Linux v5で動作確認したが、一応普通に動作するようで、
メールはちゃんと添付ファイルの状態で送られてきた。
スクリプトを掲載するので、自由に改変/使用していただいてOKです。
スクリプトの簡単な使い方は以下の通りです。
1.スクリプト内の以下の変数を変更する。
→ from_addr/to_addr/subject
2.各コマンドの存在を確認する。
→ date/file/cut/sed/uuencode/sendmail
3.実行してみる。
→ MIME_MAIL.sh [path_to_attach_file]
なお、以下の点にだけご注意ください。
・何があっても責任は取れません。\_( ゚ロ゚)ハイ!ここ重要。
・エラー対策は一切してません。
・RFC(MIME)に完全に準拠できていないと思います。
・問題点、よりスマートなコードなどありましたらコッソリ教えてください。
・英文法に対するツッコミはなしの方向で。
では。
# vi MIME_MAIL.sh
#!/bin/bash
## Init section
from_addr='from@address'
to_addr='to@address'
subject='Subject'
boundary=`date +%Y%m%d%H%M%N`
content_type=`file --mime $1 | cut -d' ' -f2`
filename=`echo $1 | sed -e "s/.*\/\(.*$\)/\1/"`
## generate MIME encoded mail
echo "From: $from_addr" > .MIME_MAIL.tmp
echo "To: $to_addr" >> .MIME_MAIL.tmp
echo "Subject: $subject" >> .MIME_MAIL.tmp
echo "MIME-Version: 1.0" >> .MIME_MAIL.tmp
echo "Content-type: multipart/mixed; boundary=\"----$boundary\"" >> .MIME_MAIL.tmp
echo "Content-Transfer-Encoding: 7bit" >> .MIME_MAIL.tmp
echo "" >> .MIME_MAIL.tmp
echo "This is a multi-part message in MIME format." >> .MIME_MAIL.tmp
echo "" >> .MIME_MAIL.tmp
## Insert MAIL_BODY (if you need)
echo "------$boundary" >> .MIME_MAIL.tmp
#echo "Content-type: text/plain; charset=iso-2022-jp" >> .MIME_MAIL.tmp
echo "Content-type: text/plain; charset=us-ascii" >> .MIME_MAIL.tmp
echo "Content-Transfer-Encoding: 7bit" >> .MIME_MAIL.tmp
echo "" >> .MIME_MAIL.tmp
echo "Generated by MIME_MAIL.sh" >> .MIME_MAIL.tmp
echo "" >> .MIME_MAIL.tmp
## Attach file to E-Mail
echo "------$boundary" >> .MIME_MAIL.tmp
echo "Content-type: $content_type" >> .MIME_MAIL.tmp
echo " name=$filename" >> .MIME_MAIL.tmp
echo "Content-Transfer-Encoding: base64" >> .MIME_MAIL.tmp
echo "Content-Disposition : attachment;" >> .MIME_MAIL.tmp
echo " filename=$filename" >> .MIME_MAIL.tmp
echo "" >> .MIME_MAIL.tmp
uuencode --base64 $1 $filename | grep -v "begin-base64" >> .MIME_MAIL.tmp
echo "" >> .MIME_MAIL.tmp
echo "------$boundary--" >> .MIME_MAIL.tmp
## Send E-Mail
/usr/sbin/sendmail -i $to_addr < .MIME_MAIL.tmp
## Delete TEMP file
rm -f .MIME_MAIL.tmp
exit 0
[2008.7.8追記]
以下の修正行った。
・添付ファイルの前(filename=$filename直後)に空白行が必要なようなので追加した。
・uuencodeの出力にあるbegin-base64が不要のようなので削除した。