2015/01/18
余計なもの省けと言われたので省く。
2013/02/02
K.T君がきっと見るだろうと思うのでちょっとメモ書きを残す。
後輩「WindowsからLinuxにOSを変更するんですけど、ちょっと問題がありまして。
先輩「ん?
後輩「もとのWindowsではVBで作ったメール送信プログラムが動いていて、これはINIファイルに書いた複数のメアドにメールを送信します。
先輩「文面は定型?
後輩「とりあえずは。で、これと同じことをLinuxでもできないですかね?
先輩「思い付くのが二つあるのでそれぞれ説明するよ。
ここでは、EXEからキックされるVBプログラム(メール送信プログラム)に相当するものをシェルスクリプト alert.sh とします。
送信専用アカウント yuki を準備して、alert.sh から yuki にメールを送り、 yuki の ~/.forward に定義したメールアドレスに転送します。 構成はこんな感じになります。
後輩「yukiって?
先輩「sanaでもいいのよ?
後輩「身元バレの危険あり。yukiでいいです。
先輩「alert.shが呼び出されると、mailコマンドが実行されてアカウント yuki に件名「hoge」のメールが送信されるよ。
後輩「-r オプションでメールのFromを指定ですね。送信者が yuki@hogehoge.ne.jp と言うことになるんですね。
先輩「MTAの提供するmailコマンドによって異なるから自分のシステムではどうなのか調べてね。
cat << EOF | nkf -j | mail -s "hoge" yuki -r "yuki@hogehoge.ne.jp" これはてすとめーるです EOF
後輩「タイムスタンプが文面に要るの!
先輩「はいどうぞ。
cat << EOF | nkf -j | mail -s "hoge" yuki -r "yuki@hogehoge.ne.jp" `date` これはてすとめーるです EOF
後輩「ところで、nkfってなんですか?
先輩「漢字コード変換フィルタ。別に nkf でなくてもいい。昔からある有名どころだから使っただけで。
後輩「何の為に使ってるんです?
先輩「メール本文の文字コードをJISに変換している。メールで特に文字コードを指定しなかった場合、日本語のメールはISO-2022-JP(JIS)なので。
後輩「UTF-8のメールも出せるんでしょうか?
先輩「MTAが提供するmailコマンドの機能による。UTF-8を使っているとメールヘッダに記すことが出来なければ文字化けメールになるだろうね。
先輩「次に、アカウント yuki に~/.forward ファイルをつくる。1行1メールアドレスで送りたいメールアドレスを書けばいいよ。
後輩「なるほど。~/.forward に必要なアドレスを書き連ねればいいのか。
$ whoami yuki $ cat ~/.forward addr1 addr2 addr3 $
先輩「注意点としては~/.forwardには yuki 自身のアドレスを書かないこと。例えば yuki を追加しないこと。
後輩「それはどうしてですか?
先輩「yukiに対してメールが送信され、受信した yuki はまた ~/.forward に従ってyukiへメールを送信する。そして受信した yuki はまた…
後輩「あー、無限ループしちゃいますもんね。
後輩「わざわざ.forward使うためだけにアカウントを作って転送をさせなくてもmailコマンドから直接出来ないんですか?
後輩「単純なのであれば、mailコマンドを送信先ごとに書き連ねたシェルスクリプトでを実行すればいい。
先輩「宛先少ないならこれで。
cat << EOF | nkf -j | mail -s "hoge" addr1 addr2 addr3 -r "yuki@hogehoge.ne.jp" `date` これはてすとめーるです EOF
後輩「確かに宛先増えてきたらきつい感じですね。
先輩「MTAの提供するmailコマンドによっては、宛先リストをファイルで指定可能なものがあるかもしれない。たとえばこんな風に。
cat << EOF | nkf -j | mail -s "hoge" -F addrlist -r "yuki@hogehoge.ne.jp" `date` これはてすとめーるです EOF
addr1 addr2 addr3
後輩「addrlistファイルを管理すればよいだけになりますね。
先輩「そういう指定オプションがあるならね。無いなら次のようにmailコマンドのコマンドラインを書き連ねることになるかな。
先輩「コピー&ペースト大好きな後輩向け。
cat << EOF | nkf -j | mail -s "hoge" addr1 -r "yuki@hogehoge.ne.jp" `date` これはてすとめーるです EOF cat << EOF | nkf -j | mail -s "hoge" addr2 -r "yuki@hogehoge.ne.jp" `date` これはてすとめーるです EOF cat << EOF | nkf -j | mail -s "hoge" addr3 -r "yuki@hogehoge.ne.jp" `date` これはてすとめーるです EOF
後輩「力技っぽい感じですね。
先輩「さすがにこれはダサい。次のように関数mailcmdを定義して引数にメールアドレスを与えてやると関数内の$1が与えたメールアドレスに置換えされる。
mailcmd() { cat << EOF | nkf -j | mail -s "hoge" $1 -r "yuki@hogehoge.ne.jp" `date` これはてすとめーるです EOF } mailcmd addr1 mailcmd addr2 mailcmd addr3
後輩「これはだいぶすっきりしてますね。それにalert.shだけで完結するこっちの方が楽な気がするなぁ。転送用アカウント作るより楽じゃないでしょうか。
先輩「このシェルスクリプトが複数配置されたらさ、メールアドレスのメンテ大変よ? .forwardで1箇所に集約される転送用アカウントを使う方法が楽。
後輩「その時々で考えろって事ですね。