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