メール送信用バッチファイル

3月 31st, 2009 by tsuyoshi Leave a reply »

ちょっと必要があって作ったメール送信用バッチファイル。
以下のユーティリティを取ってきてどっかのディレクトリにがさっと入れ、yyyymmddhhmm.Mail.txtとMaillist.txtを突っ込むとどかっとメールを送ってくれるという代物。
Cron的なもので自動実行させるために、Mail.txtで指定した年月日、時分でしか動いてくれない。
Pycronとかを使えばWindowsでも分単位の自動実行ができる。

■必要なもの
Smail : コマンドラインメール送信プログラム
Unix Utilities : Windowsで動くUnixのユーティリティ群
Base64エンコーダ : やすあきさん作のフリーウェア。
csconv :Unibirth Software作フリーウェア。文字コード変換ユーティリティ。あて先のニックネームをISO-2022-JPにするの使用。
Mfc42.dll : なんかのランタイムライブラリ。

これらをがさっとバッチファイルと同じディレクトリに突っ込んでおく。
Unix UtilitiesはWCとHEADしか使っていないので、これだけでも良い。

バッチ本体は以下の通り。
時分チェックとかを外しておけばローカルで簡単に実行できる。
「共有ファイルに突っ込んで使う」ために作ってあるので、あて先ファイルとかデリケートなものは実行後に削除している。

@echo off

cd C:Mailbat
::年月日時分.Mail.txtがあったときに、本文ファイルを送信して結果をレポートする。
::情報保護の観点から、送信先リストは実行の都度消去する。
::つまり、送信するときには本文ファイルと送信リストの両方を投入しておく必要がある。

::現在日時、時分をセット
SET DATESTR=%date:~0,4%%date:~5,2%%date:~8,2%
SET TIMESTR=%time:~0,2%%time:~3,2%
SET TIMESTR=%TIMESTR: =0%

::Windowsのバッチファイルでは、実行前に全ての式を評価する。
::なので、入れ子のFor文は評価しない。
::従って、後続するメール送信部分でのIf判定に以下の部分を入れてしまうと
::変数にNullが入って「構文エラー」が出ることになる。
::実行時に評価するオプションもあるようだが、うまく動かなかった。
::なので、外だしで。

::メールファイルを読んで、1行目をあて先にセット
for /f %%A in (‘head -n 1 %DATESTR%%TIMESTR%.Mail.txt’) do set SUBJECT=”%%A”

::メールファイルは3行以上無ければ、エラー
SET LINENUM=000
for /f %%A in (‘wc -l %DATESTR%%TIMESTR%.Mail.txt’) do set LINENUM=%%A
if exist %DATESTR%%TIMESTR%.Mail.txt (
if %LINENUM% LSS 3 goto NOMAILTXT
)

::対象にするファイル名を確認し、あれば実施。
::あて先リストが無ければ、警告メールを送信
::あて先リストは「お名前」の形式。
::お名前部分をISO-2022-JP変換後、BASE64して送信する。
::メールファイルは3行以上無ければ、エラー
::メールファイルの1行目を取り出して件名とし、
::残りをbody.txtへ吐き出して本文ファイルにする。
::Body.txtは処理が終わったら消去する。

if exist %DATESTR%%TIMESTR%.Mail.txt (

if not exist Maillist.txt goto NOMAILLIST

csconv MailList.txt -FWORK.Maillist2022.txt -OISO-2022-JP -Auto -ROFF

CALL :CODECONVERT

more +1 %DATESTR%%TIMESTR%.Mail.txt > body.txt

for /f “delims=” %%i in (encoded.MailList.txt) do smail.exe -i -h192.168.0.1 -f”=?ISO-2022-JP?B?GyRCJTUlcyVXJWslYSE8JWsbKEI=?= ” -s”%SUBJECT%” -Fbody.txt %%i >> log.txt

smail.exe -i -h192.168.0.1 -f”MailReport ” -sメール送信結果 -alog.txt,MailList.txt,%DATESTR%%TIMESTR%.Mail.txt hogehoge@hage.com

DEL encoded.MailList.txt
DEL MailList.txt
DEL log.txt
DEL body.txt

)

goto :EXT

:NOMAILLIST
smail.exe -i -h192.168.0.1 -f”MailReport ” -s送信先リストがありません hogehoge@hage.com

exit

:NOMAILTXT
smail.exe -i -h192.168.0.1 -f”MailReport ” -sメールファイルが3行以下です hogehoge@hage.com

exit

:EXT
exit

:CODECONVERT
for /f “tokens=1-2 delims=<>” %%A in (WORK.MailList2022.txt) do (
SET MAILTO=%%B
echo %%A > WORK.ISO-2022.txt
Base64c WORK.ISO-2022.txt WORK.ISO-2022enc.txt
for /f %%C in (WORK.ISO-2022enc.txt) do SET ENCSTR=%%C
CALL :MAILLISTWRITE
)

DEL WORK*.txt

GOTO :EOF

:MAILLISTWRITE
echo =?iso-2022-jp?B?%ENCSTR%?=^<%MAILTO%^> >> encoded.Maillist.txt

Advertisement

コメントをどうぞ