.." />

道具としてのコンピュータ

2014年1月14日
送信先ごとに少しずつカスタマイズしたメールを配信するプログラム


sndmail

冬休みの課題として、日々のルーチンワークの時間を短縮するプログラムを書いてみました。

■作成の背景

一度にたくさんの方にメールを送りたいとき、たとえば飲み会のお誘いのメールでは、
「各位」とするより「○○さんへ」ときちんと相手の名前を差し込みたいし、
最近お会いした方なら、「先日はありがとうございました」などの一言を添えたいものです。
仕事柄そのようなメールを送ることが多く、これまではスプレッドシートの技を駆使して
書いていたのですが、そろそろ件数的に限界が近く…。
そんなニーズに対応するスクリプトを書こうと思い至った次第です。
(悪い用途には使わないでね!)

■ディレクトリ・プログラム・データの構造
まずシステム全体の構造を説明します。

[xxx@xxxxx ~]$ tree  SNDMAIL/
SNDMAIL/
|- <prj>
|   |- LIST
|   |- TEMPLATE
|   |- edit
|   |   |- mail.1.txt
|   |   |- mail.2.txt
|   |   |- mqq mail.3.txt
|   |
|   |- org
|       |- mail.1.txt
|       |- mail.2.txt
|       |- mail.3.txt
|
|- MKMAIL.sh
|- SNDMAIL.sh

<prj>はプロジェクトの略。
配信メールの種類ごとにディレクトリを作成し、そこにテンプレートデータと
配信先+差し込みたい内容が書かれているリストのデータを配置します。

■インプット
今回はprj名を<MENDAN>としました。
LISTのデータ構造はこんな感じです。

[xxx@xxxx SNDMAIL]$ cat MENDAN/LIST
山田 yamada@foobar.com 株式会社ヤマダ 山田 10:00
高橋 takaha@foobar.com タカ株式会社   高橋 11:00
佐藤 satooo@foobar.com サトウ株式会社 佐藤 12:00

名前/送信先メールアドレス/以下は順不同でテンプレートにはめ込みたい内容となっています。
頭の2フィールドはメールのヘッダー用情報で、
3フィールド目以降は本文に関係する情報という位置づけです。

TEMPLATEはこんな感じです。

[xxx@xxxx SNDMAIL]$ cat MENDAN/TEMPLATE
%1
%2様

お世話になります。定例の面談を実施いたします。
つきましては下記概要をご確認の上、参加ください。

日時:XXXX年X月X日
時間:%3
場所:弊社第3会議室

以上

%1,%2,%3に、LISTの3フィールド目以降のデータが入ります。
定例の面談、しかも会社対会社…よくわからない設定なのですが見逃してください。

■プログラムが行う処理とその使い方

まず、MKMAIL.shというシェルを使ってメールを送る相手ごとに
メールヘッダー+本文のテキストデータを作成します。

MKMAIL.sh

#!/bin/bash -xv
# MKMAIL.sh
# メール送信用のファイルを作る
# 事前準備:プロジェクト名フォルダ(prj)を作成し
#      LISTとTEMPLATEを配置する
#
# 2014.1.XX Keiko Kano

exec 2> log

#変数の定義
tmp=/tmp/$$
homed=/home/xxxx/SNDMAIL
prjd=$homed/$1
["${1+set}"]  : || echo "引数を入力してください"

#メールの共通設定
#送信元メールアドレス
from="from@foobar.com" #送信元メールアドレスを入力する
#メール件名
subject="面談の件" #件名を入力する
#リストファイル名
list="LIST" #リストファイルの名称を入力する
#テンプレートファイル名
template="TEMPLATE" #リストファイルの名称を入力する

#ファイルの配置先ディレクトリを作成する
mkdir $prjd/org
mkdir $prjd/edit

# テンプレートにリストの内容をはめる
n=0
cat $prjd/$list |
while read line ;
 do
   n=$(( $n + 1 )) ;
    #ヘッダーを作る(From/To/Subject)
    echo "From:"$from       > $tmp-from
    echo "Subject:"$subject > $tmp-subject
    echo $line              > $tmp-data
     awk '{print "To:"$2}' $tmp-data    > $tmp-to
     cat $tmp-from $tmp-to $tmp-subject > $tmp-header

   #本文を作る
    self 3/NF $tmp-data                 > $tmp-honbun
    mojihame $prjd/$template $tmp-honbun > $tmp-contents
     cat $tmp-header $tmp-contents      > $prjd/org/mail.$n.txt

   #オリジナルのデータをコピーして編集用データを作成する
   cp $prjd/org/mail.* $prjd/edit/

 done

#終了処理
rm $tmp-*
exit 0

<prj>ディレクトリ配下に<org>と<edit>というディレクトリができます。
こちらは同じ内容のメールの本文ファイルが入ります。
<edit>のディレクトリ内の本文ファイルをvim等でカスタマイズしましょう。
<org>は<edit>のディレクトリ内で加工したファイルの内容を
元に戻したいとき用のオリジナルデータです。

カスタマイズが終了したら、SNDMAIL.shというシェルスクリプトで、
<edit>内のデータをメール送信します。

SNDMAIL.sh

#!/bin/bash -xv
# SNDMAIL.sh <prj>
#  MKMAIL.sh で作成したメール本文を一括送信する
#
#  2014.1.XX Keiko Kano

exec 2> log
echo $$

#変数の定義
tmp=/tmp/$$
homed=/home/xxxx/SNDMAIL
prjd=$homed/$1
[ "${1+set}" ] && : || echo "引数を入力してください"

#メールの共通設定
#送信元メールアドレス
from="from@foobar.com"

# 編集した本文データにヘッダー情報を付加する
n=0
 for n in $(ls $prjd/edit/*);do
  : > $tmp-honbun
  awk 'NR<4{print $0}' $n                        > $tmp-honbun
  echo "Content-Type:text/plain;charset=UTF-8;" >> $tmp-honbun
  awk 'NR>3{print $0}' $n                       >> $tmp-honbun

  #メール送信
  cat $tmp-honbun |
  /usr/sbin/sendmail -t -f $from

done

#終了処理
rm $tmp-*
exit 0

■アウトプット
リストの宛先に以下のようなメールを送ることができます。

from:from@foobar.com
サトウ株式会社
佐藤様

お世話になります。
定例の面談を実施いたします。
つきましては下記概要をご確認の上、参加ください。

日時:XXXX年X月X日
時間:12:00
場所:弊社第3会議室

以上

もしも佐藤さんだけ、第2会議室に集合してもらいたいような場合は、
<edit>ディレクトリの中の佐藤さん宛のメール本文を修正すればいいです。

■課題
1.プログラムを実行するサーバ以外のメールアドレスを配信元のメールアドレスとして指定すると、
受信側のメーラーによっては「このメッセージは次のアドレスから送信されたものではない可能性があります」という
フィッシング詐欺警告が出てしまうのでした。どなたかいい対策がありましたら教えていただけるとありがたいです…。
2.メール不達をレポートにして、配信元メールアドレスに送るというところまでいったら最高なので、気が向いたら改良したいです。
3.HTMLのガワがついたら、ターミナルを触れない人でも使えてよい感じになると思います。
(誰か興味がある方、いたら手伝って…!)

■参考サイト
sendmailコマンド一発でメールを送信するシェルスクリプト
http://hack.aipo.com/archives/308/

エラーメール取得の研究
http://www.perl-labo.org/sendmail/errmail/

変数が設定されていなかったり空だった場合にエラーにする
http://qiita.com/mattintosh4/items/fb38d76654d54fd60eda

とても参考になりました。ありがとうございます。

■書いてみての感想
・/usr/sbin/sendmailの使い方を少し学ぶことができました。
(メール関係はあまり触ったことがないので。
 以前mailコマンドで実装してはまったことがありましたが、
 それが解決できたのがうれしい。
 それにしてもメール関係は、奥が深いですね…。)

■所感
・ときどき自分用のツールを作るためにプログラムを書くのですが、
 頭の体操になって楽しいのでおすすめです。

・誰でも自由にプログラムを書くことができる土台(学習の機会やツールの面で)が
 より普及するといいのになぁ、と常々感じています。

・ちょっとしたツールで仕事は思い切り効率化できるので、
 簡単なプログラムを書いて単純作業はとことん効率化しましょう♪

Related Posts