// メール送信スクリプト(ファイル添付可能)

[[Linux]]


* メール送信スクリプト [#zf5255c2]
趣味でメール送信スクリプトを作成しました。正しくはwebに載っていた情報をもとに改変しただけです。

添付ファイルがあってもなくても動作するようにしました。

今回は
- [[ネットワーキングすきま情報>http://last-resort.seesaa.net/article/122985537.html]]
- [[戯言と技術>http://joke-tech.blogspot.jp/2013/04/linux-sendmail-mail-centos-5.html]]

のページを参考にさせて頂きました。


** 動機 [#a79e4341]
「同じ内容のメールを複数の人に(複数の)ファイルを添付して一斉にメールを送る機会があるかもしれない」と考えて、スクリプトを作成(既存のスクリプトを改変)しました。

実際には、今の所そのような機会はありません。


** 使用方法 [#we74bc6a]
send_mail.sh {toアドレス} {タイトル} {本文ファイル} [{添付ファイル名}...]
- {本文ファイル}:メール本文を記載したファイル名を指定
- {添付ファイル名}はなくても複数あってもよい


** 本文中の宛名を変える場合(差し込み印刷のような使い方) [#o3022da8]
今回はスクリプトを作成していませんが、宛名のファイル(E-メールアドレス、氏名などを記載したもの)と本文のテンプレートファイルを用意しておき、perlやRubyなどでテンプレートファイルを変更してsend_mail.shを使用すれば目的の事ができると思います。


** 備考 [#je6f9f4c]
添付ファイルを送信する方法を調べた結果、以下の事が分かりました。
- 添付ファイルのサイズよりもメール送信時に表示されるファイルサイズが大きい理由
-- Base64でバイナリーファイルをテキストファイルに変換しているためサイズが増加する。
-- [[wikipedia>http://ja.wikipedia.org/wiki/Base64]]参照
- (少なくとも)Sylpheedで添付ファイルをいくら探しても見つからなかった理由
-- Base64でテキストファイルに変換された上でメール本文に組み込まれている。
-- これはメッセージのソースを調べると確認できる。


* スクリプト本体 [#v779457d]
 send_mail.sh

 #!/bin/bash
 
 ############################
 ## メール添付ファイルスクリプト
 ## コマンドラインから添付付きメールを送信するスクリプトです。
 ##
 ## send_mail.sh {toアドレス} {タイトル} {本文ファイル} [{添付ファイル名}...]
 ##
 ############################
 
 ## Init section
 from_addr='(送信者のメールアドレス)'
 to_addr=$1
 subject=`echo $2 | nkf -w -Lu`
 mail=`cat $3 | nkf -w -Lu`
 shift; shift; shift
 boundary=`date +%Y%m%d%H%M%N`
 
 ## 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=utf-8" >> .MIME_MAIL.tmp
 echo "Content-Transfer-Encoding: 7bit" >> .MIME_MAIL.tmp
 echo "" >> .MIME_MAIL.tmp
 echo "$mail" >> .MIME_MAIL.tmp
 echo "" >> .MIME_MAIL.tmp
 
 ## Attach file to E-Mail
 while [ $# -ge 1 ] ; do
   attach_file=$1
   filename=`echo $attach_file | sed -e "s/.*\/\(.*$\)/\1/"`
   content_type=`file --mime $attach_file | cut -d' ' -f2`
   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
   cat $filename | base64 >> .MIME_MAIL.tmp
   echo "" >> .MIME_MAIL.tmp
   shift
 done
 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


トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS