[C#] メール送信だっ

一昨日の続き、前回は標準出力の読み込みで終わっていた。
今回はそれにメール送信機能を搭載した。
引数でうけとったプログラムを外部プロセスをとして実行し、その標準出力の内容をメールで送信するのである。

#region Using directives

using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
using System.Threading;
using System.Net;
using System.Net.Mail;

#endregion

namespace ExecAndReadStdout
{
    class Program
    {
        static void Main(string args)
        {
            Program program = new Program();
            program.Do(args);
        }

        // 手抜き 外部ファイルから読み込むのが筋
        private const String SMTP_SERVER   = "SMTPサーバアドレス";
        private const String TO_ADDRESS    = "宛先のアドレス";
        private const String FROM_ADDRESS  = "送信元のアドレス";

        private String stdoutResult;
        private String stderrResult;

        void Do(String args)
        {
            if (args.Length < 1)
            {
                System.Console.WriteLine("ExecAndReadStdout.exe cmd options");
                return;
            }

            Process process = new Process();
            ProcessStartInfo info = process.StartInfo;

            info.FileName        = args[0];
            info.CreateNoWindow  = true;
            info.UseShellExecute = false;
            info.RedirectStandardOutput = true;
            info.RedirectStandardError  = true;
            for (int i = 1; i < args.Length; i++)
            {
                info.Arguments += args[i] + " "; // 手抜き
            }

            process.Start();
            Thread readThread = new Thread(new ParameterizedThreadStart(Read));
            readThread.Start(process);
            
            readThread.Join();
            process.WaitForExit();
            SendMail(process.ExitCode);
        }

        void SendMail(int exitCode)
        {
            MailMessage message = new MailMessage(FROM_ADDRESS, TO_ADDRESS);
            message.BodyEncoding = Encoding.GetEncoding("iso-2022-jp");

            if ("".Equals(this.stderrResult)) this.stderrResult = "エラーなし";
            message.Body = "[実行結果]=" + exitCode + "\n" + this.stdoutResult 
                         + "\n[エラーメッセージ]\n" + this.stderrResult;
            SmtpClient client = new SmtpClient(SMTP_SERVER);
            client.Credentials = CredentialCache.DefaultNetworkCredentials;
            client.Send(message);
        }

        void Read(Object obj)
        {
            Process process = obj as Process;
            this.stdoutResult = process.StandardOutput.ReadToEnd();
            this.stderrResult = process.StandardError.ReadToEnd();
        }
    }
}


例えば "hoge.exe ls -l"とやればこんなメールが来るし

[実行結果]=0
 -rwx------+   1 Administ なし        20480 Oct 26 xxxxxx xxxx.exe
[エラーメッセージ]
エラーなし


わざと構文を間違えて"hoge.exe ls ---k"とかやれば

[実行結果]=1

[エラーメッセージ]
ls: unrecognized option `---k'
Try `ls --help' for more information.

とこんなメールがとぶのである。


エラー処理とかサボりまくっているが自分的にはいろいろ使い道がありそう。