2009年07月06日

コマンドラインから添付ファイル付きのメールを送信する方法(の一例)

しばらくぶりの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が不要のようなので削除した。


posted by yudatch at 22:52| Comment(4) | TrackBack(0) | Linux | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
fromのアドレスは固定で良いと思いますが
toと件名は変えられたほうが良いかと。

また、添付ファイルは1つに限らなくても良いかと。

で、こんな風にしました。

先頭で
#!/bin/bash
if [ $# -lt 3 ] ; then
echo "Usage:: $0 to_addr subject attach_file [attache_file2 ..]" >&2
exit 1
fi
## Init section
from_addr='oredayo@oreore.com'
to_addr=$1
subject=$2
shift; shift


途中を


while [ $# -ge 1 ] ; do
## Attach file to E-Mail
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
uuencode --base64 $attach_file $filename | grep -v "begin-base64" >> .MIME_MAIL.tmp
echo "" >> .MIME_MAIL.tmp
shift
done
echo "------$boundary--" >> .MIME_MAIL.tmp

## Send E-Mail

んで、これをこんな風に呼び出すと

for id in $(seq -w 0 24) ; do
mime-mail-multi.sh anata@anataanata.com taiken$id tmp_utf8/taiken$id*.txt
sleep 10
done

tmp_utf8には、taiken000.txt から taiken0245.txt が連番で入っていて、
約10個のファイルが添付されたメールが沢山届きました。

sleepは、もっと長めにしたほうが良いかも・・・
Posted by 磯部和広 at 2010年08月25日 15:15
磯部和広さんコメントありがとうございます。

確かに添付ファイルは複数あってもいいかもしれませんね。。
当方コーディングが得意ではないので勉強になります!
Posted by yudatch at 2010年09月02日 16:17
こんにちは、automatorで実家のフォトビジョンに画像を送信するスクリプトを作っている時にメールを送る方法で悩んでいたらこちらのHPを見つけました。

そのままではうまく送信できず、一カ所修正しました。uuencodeの行で

uuencode -m $1 $filename | grep -v "^begin" | grep -v "^====" >> .MIME_MAIL.tmp

のように書き換えました。MacはLionです。
Posted by 三原 博 at 2011年11月15日 14:22
三原 博さん、コメントありがとうございます。

修正情報をご提供いただきありがとうございます。
早速、当方の環境でも修正させていただきました!

取り急ぎお礼までm(_ _)m
Posted by yudatch at 2011年11月15日 19:31
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。

この記事へのトラックバック
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。