
DOS, コマンドプロンプト, バッチファイルからメールを送りたいあなたへ
このブログへのGoogleから結構な数の人が「メール dos」とか「バッチ メール」とか「コマンドプロンプト smtp」とかのキーワードで以下のページにアクセスしています。
「コマンドプロンプト smtp」の人はまだしも、その他のキーワードの人は上記のページを見てもがっかりして帰るだけだろうと思うので、今回は「コマンドプロンプト、バッチからメールを送る方法」を紹介しようと思います。telnetで…というのはちょっと目的と違うと思うので。
外部プログラムを使う方法
方法はいくつかありますが、まずは外部プログラムを使う方法があります。が、私はほぼ使ったことがないので検索して見つかったものの紹介に留めておきます。プログラムなわけですからどうにでもなるわけですし、コマンドプロンプトやバッチからメールを送信したいということはおそらく自動化したいのだと思いますので、引数に宛先や本文を渡せるよなものが良さそうに思います。本文は外部のテキストファイルなどでも良いですけどね。
- ダウンロード・SMAIL
- メール送信コマンド (WinMailCmd)の詳細情報 : Vector ソフトを探す!
- メール送信プログラムの詳細情報 : Vector ソフトを探す!
- コマンドメーラー(CmdMail)の詳細情報 : Vector ソフトを探す!
- SMAILの詳細情報 : Vector ソフトを探す!
探せばほかにも沢山あると思いますが、SMAILというソフトが各種認証、暗号化、添付ファイル等に対応している上に、キャラクタセット、トランスファーエンコーディング指定も可能なようなのでよさそうな気がします。
これらを使えば問題解決!なのですが、一度インストールするなり、exeファイルを配置しておくなりの対応が必要なのでそういったことができない環境では厳しいですね。
CDO.Messageを使う方法
というわけで、何も入れなくてもWindowsの標準機能で簡単にメールを送信したい!という場合には私はいつもCDO.Messageを使っています。DOS, コマンドプロンプト、バッチファイル…と書いておきながらすいません。VBScript, JScriptを使うことになります。でもまぁ、「cscript xxxx.vbs」なんて感じで記述するだけですので問題ありません。Windows 2000以降なら動くはずなので、現存するたいていの環境でまず間違いなく動くと思います。
手元にVBScript版とJScript版のサンプルもあったので貼り付けておきます。
VBScript版
Dim oMsg Set oMsg = CreateObject("CDO.Message") oMsg.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2 oMsg.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "mail.hoge.jp" oMsg.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25 oMsg.Configuration.Fields.Update oMsg.From = "from@hoge.jp" oMsg.To = "to@huga.jp" oMsg.Subject = "タイトル" oMsg.TextBody = "メールの本文" oMsg.Send
JScript版
var oMsg = WScript.CreateObject("CDO.Message"); oMsg.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2; oMsg.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "mail.hoge.jp"; oMsg.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25; oMsg.Configuration.Fields.Update(); oMsg.From = "from@hoge.jp"; oMsg.To = "to@huga.jp"; oMsg.Subject = "タイトル"; oMsg.TextBody = "メールの本文"; oMsg.Send();
サンプルコードでは認証に対応していないので今時のメールサーバでは弾かれるのではないでしょうか?
コメントありがとうございます。
2つの観点がありまして・・・。
【1. 自分の属しているネットワークから外に出ていく時】
単純なTCP25番での外部への通信はブロックされていることが多いです。スパムメールを投げて悪さする人あるいはそのための踏み台にされる人が多いのでその対策です。
この場合ブロックされるのはメールサーバーによってではなく、インターネットに出ていく前のFireWallによってブロックされることになります。
【2. インターネットのどこかから送られてくるメールを受け取る時】
ここは、認証が無いのがまだ普通ですので認証に対応していないから弾かれるということはありません。(そのように構成はできるけど、その場合メールを受け取れない可能性が非常に高くなる)
このあたり本に書いたような気もします。
すいません。コメント頂いた記事を勘違いしてました。
http://ebi.dyndns.biz/windowsadmin/2009/03/26/%e3%82%b3%e3%83%9e%e3%83%b3%e3%83%89%e3%83%97%e3%83%ad%e3%83%b3%e3%83%97%e3%83%88%e3%81%a0%e3%81%91%e3%81%a7%e3%83%a1%e3%83%bc%e3%83%ab%e3%82%92%e9%80%81%e4%bf%a1%e3%81%99%e3%82%8b/
こちらのつもりで返信を書いてしまいました。
本質的にはどちらも同じ話にはなるのですが、
おっしゃる通り、ここで書いている方法だと「認証に対応していないので弾かれる」という結果になることが非常に多いだろうと思います。
記事のUpdateが必要ですね…。
コメント