【C#入門】初めて作るコンソールアプリ!共有フォルダのファイルを添付してメール送信

C#入門
スポンサーリンク

今回の記事では、C#の初心者向けに、Visual Studioを起動してプロジェクトを作成するところから、共有フォルダ内のファイルを添付してメールを送信する一連の処理を、サンプルコードの解説も交えて紹介していきます。

尚、当記事では、C#やその他のオブジェクト指向的なプログラミング言語の経験が少ない人を対象にしており、クラスの作成や解説をしておりません。
また、メソッドの戻り値も指定しません。
エラー処理も入れていません。

これらの処理をサンプルコードに含めないことで、可能な限り最低限の知識で実際に動くC#のプログラムを作ってもらうことを優先した記事にしました。

その代わり、プロジェクトの作成方法や、デバッグのやり方や、ビルド(コンパイル)のやり方、初歩的なC#の言語仕様についても簡単に解説しております。

是非ご一読ください。
 
 

Visual Studioのインストール

もしVisualStudioが貴方の端末にインストールされていなければ「Visual Studio 2019 Community」をインストールしてください。

尚、マイクロソフト公式のインストール手順の記事はこちらです。

インストール手順の詳細については省略させていただきますが、インストールの際に、Visual Studioに含める機能(ワークロード)を選択します。

Visual Studioは多機能で、様々なアプリケーションを開発できますが、使用用途を選択して必要な機能に限定してインストールすることができます。

今回の記事では「コンソールアプリ」を作るので、その場合は「.NET デスクトップ開発」を選択してください。
尚、インストール後もワークロードは追加することが可能です。

初回起動時にはMicrosoftアカウントの認証が求められます。
Microsoftアカウントでの認証を行わなくても利用はできますが、一定期間で利用できなくなります。
そのため、もしMicrosoftアカウントをお持ちの場合はすぐにそのアカウントを使用して認証していただき、Microsoftアカウントをお持ちではない人は、これを機にアカウントを作成してください。

Visual Studio 2019 Communityは「無償版Visual Studio」として紹介されているケースも多いのですが、厳密には個人利用に限定して提供されており、法人で利用する場合は小規模な企業内での利用のみ許可されています。
ただ、実際には個人だけではなく法人でも広く使われており、厳粛なチェックなどはありません。
もし法人として程度の人数で使用する場合は、有償版のVisual Studioを利用されることをおススメします。

 
 

プロジェクトの作成手順の紹介

Visual Studioでは、プログラムを作り出す前に「プロジェクト」を作成します。

この「プロジェクト」は、開発するアプリケーションのプログラミング言語を指定したり、開発するアプリケーションの開発環境などを設定して、これから作成するアプリケーションのプログラムコードや各関連ファイルや各設定を格納する場所を確保するイメージです。

初めてVisual Studioを触る場合は、このプロジェクトの作成もわかり辛いので、画面毎に解説していきます。

Visual Studioの起動

Visual Studioを起動すると、スプラッシュスクリーン(アプリケーション起動時に表示する読み込み待ち画面)を経た後に以下の画面が表示されます。

VSの起動直後の画面

今回は新しくプロジェクトを作成するので「新しいプロジェクトの作成」を押下します。
 

プロジェクトのテンプレートの選択

インストール時に指定した「ワークロード」ごとにプロジェクトの「テンプレート」の一覧が表示されます。
「テンプレート」とは、プロジェクトを作成した際の既定値として生成される構成ファイルのファイル構成や参照設定などの既定値などを予め用意してくれる機能です。

VSのテンプレート作成画面

これから作成するアプリケーションの種類をこのテンプレートの一覧から選択します。
今回はC#の「コンソールアプリ(.NET Framework)」を選択して「次へ」を押下します。
 

プロジェクトの構成を選択

作成するプロジェクトの基本的な構成を選択します。
尚、「フレームワーク」は通常は自端末にインストールされている最新の.NET Frameworkのバージョンが既定値で選択されています。
作成するアプリケーションや開発案件によっては、古いバージョンの.NET Frameworkを使わないといけない場合もあり、そのようなケースでは過去のバージョン番号に変更します。

VSのプロジェクトの構成画面

今回は「プロジェクト名」だけを変更し、それ以外は既定値のまま「作成」ボタンを押下します。

尚、今回のサンプルプログラムでは、プロジェクト名を「MailSendTest」としているので、同じく「MailSendTest」で作ってみてください。
 

新しいプロジェクトの作成完了

新しいプロジェクトの作成が完了し、プログラムの作成画面が開きました。

VSの新しいプロジェクト作成完了後の画面

この画面に対してプログラムを書いていきます。
これからが本番です。
 
 

初めてのC#コンソールアプリケーション作成

当項では、初めてC#でコンソールアプリケーションを作成する際の知っておきたい知識と、実際のサンプルコードも併せて紹介していきます。
当項の手順通りに進めれば、アプリケーションは作れます。
 

「App.config」の解説と編集

まず最初に「App.config」を編集します。

画面右側の「ソリューションエクスプローラー」と書かれている枠のなかには、当プロジェクトを構成するファイルや設定などが並んでいます。
これら全体のことを「ソリューション」と呼びます。
このソリューションのなかの構成物の一つとして「App.config」が居ます。

VSのソリューション内のApp.config

このApp.configを編集するのですが、その前に、そもそもApp.configとは何かについても簡単に紹介しておきます。
 

App.configとは

昔のアプリケーションでは、プログラム本体のexeファイルがインストールされた同じフォルダ内に、拡張子「.ini」のファイルが配置されており、そのiniファイルをメモ帳などのテキストエディタで開いて、そのアプリケーションの設定を変えたりしていましたが、

因みに拡張子「ini」は「init = 初期化」の意味合いです。

C#やVB.NETなどのWindowsアプリケーションを開発する場合のiniファイルの役割が「App.config」です。

App.configはそのアプリケーションの設定ファイルとして、起動時の最初に読み込まれます。

アプリケーションを実行するにあたって、そのアプリケーションが接続するデータベースの接続先情報やアクセスするサーバー情報などをプログラム内のコードで埋め込んでしまうと、後から変更になる度に内部のプログラムを書き変える必要があり、運用が大変です。

その為、必要によって設定を変える可能性のある情報をApp.config内に外出しして、運用し易くするための仕組みです。
尚、App.configはXMLで記述されたテキストファイルなので、メモ帳などのテキストエディタでも開くことができます。
 

App.configを編集

今回のプログラムでは、メールを送信するので、メール送信に使用するメールサーバーの情報などは、後から自由に変更できるように、App.config内に記述します。
また、社内の共有フォルダにアクセスする想定なので、そのために必要な情報もApp.config内に記述します。

まずは、画面右上のソリューションエクスプローラー内の「App.config」をダブルクリックで開きます。

そうすると、以下のコードが表示されます。
 

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
    </startup>
</configuration>

この</startup></configuration>の間に<appSettings>というタグを入れて、アプリケーションの外部ファイル設定項目を追加します。

今回は以下のように書き変えてください。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
    </startup>
  <appSettings>
    <add key="smtp_server" value="smtpメールサーバーホスト名" />
    <add key="port_no" value="587※環境によって変更してください" />
    <add key="smtp_user" value="smtpユーザー名" />
    <add key="smtp_password" value="smtpパスワード" />
    <add key="source_mailaddress" value="送信元メールアドレス" />
    <add key="destination_mailaddress" value="送信先メールアドレス" />
    <add key="Attachment_filepath" value="\\192.168.1.1\Share\フォルダ名\ファイル名.pdf※添付ファイル用ファイルの置き場所" />
    <add key="share_name" value="\\192.168.1.1\Share※NET USEする際の共有名" />
    <add key="net_user" value="xxxxxxx※NET USEする際のユーザー名" />
    <add key="net_password" value="xxxxxxx※NET USEする際のパスワード" />
  </appSettings>
</configuration>

尚、当然ですが、これらのkeyごとの設定値は、実際に使用するメールサーバーやファイルサーバーの環境に合わせて書き変えて使用してください。
 

「参照設定」の追加

当項では、前述したApp.configの設定項目をプログラムから読み出しできるように「参照設定」を追加します。
 

「参照設定の追加」とは

C#などの一般的なプログラミング言語では、その言語標準のベースとなる基本機能に併せて、それ以外にも様々な機能が用意されています。

プログラミング言語の多くの機能は「アセンブリ」と呼ばれる無数のプログラムファイル群で提供されており、C#で新しくプロジェクトを作成しても、既定の状態ではほとんどが無効化されています。

アセンブリは膨大にあり、それらを初めからすべて有効な状態にしてしまうと、処理も重くなり、大半が呼ばれない機能になってしまい、大変無駄です。

そのため、プロジェクト作成直後は、最低限の基本的な機能だけが有効化されており、必要によって使用する機能を手動で有効化します。

有効化することで、プログラム内でその機能を呼ぶことができるようになり、また、プログラムを書く際に、Visual Studioで入力候補のコードリストを表示してくれるといった入力補完機能(インテリセンス)も使えるようになります。

この「機能を有効化」する設定のことを「参照設定に追加」と呼びます。
 

「参照設定」の追加内容

画面右側のソリューションエクスプローラーの「参照設定」を右クリックして、表示された項目から「参照の追加」を選択します。

VSの参照設定を右クリック

「参照マネージャー」が起動します。
この画面に表示されているのが参照の追加が可能なアセンブリ群です。

VSの参照マネージャー表示

App.configの読み込み機能を持っているのは「System.Configuration」という名前のアセンブリなので、その行を探して左側にチェックを付けて画面下部の「OK」を押下します。
 

「Program.cs」を開きサンプルコードを貼り付け

Visual Studioの画面内のタブの「Program.cs」をクリックするか、画面右側のソリューションエクスプローラー内の「Program.cs」をダブルクリックします。

そうすると、プロジェクト作成直後に開いていたタブに戻ります。

この「Program.cs」がC#の既定で作成されるメインプログラムのファイルです。

今回は、このProgram.csに元々記述されているコードの全てを以下のサンプルコードで上書きして保存してください。

using System;
using System.Diagnostics;
using System.Configuration;
using System.IO;
using System.Net.Mail;

namespace MailSendTest
{
    class Program
    {
        static void Main(string[] args)
        {
            string share_name = ConfigurationManager.AppSettings["share_name"];
            string net_user = ConfigurationManager.AppSettings["net_user"];
            string net_password = ConfigurationManager.AppSettings["net_password"];
            string Attachment_filepath = ConfigurationManager.AppSettings["Attachment_filepath"];

            //NET USEを実行します。
            string command1 = "/C  NET USE " + share_name + " /DELETE & NET USE " + share_name + " " + net_password + " /user:" + net_user;
            Process.Start("cmd.exe", command1);

            //ファイルの存在チェックをします。
            if (!File.Exists(Attachment_filepath))
            {
                Console.WriteLine("添付対象のファイルが存在しません。");
                //処理を終了します。
                return;
            }

            //メールを送信します。
            SendMail();

            //NET USEを切断します。
            string command2 = "/C NET USE " + share_name + " /DELETE";
            Process.Start("cmd.exe", command2);

            return;
        }

        public static void SendMail()
        {
            string smtp_server = ConfigurationManager.AppSettings["smtp_server"];
            int port_no = int.Parse(ConfigurationManager.AppSettings["port_no"]);
            string smtp_user = ConfigurationManager.AppSettings["smtp_user"];
            string smtp_password = ConfigurationManager.AppSettings["smtp_password"];
            string source_mailaddress = ConfigurationManager.AppSettings["source_mailaddress"];
            string destination_mailaddress = ConfigurationManager.AppSettings["destination_mailaddress"];
            string Attachment_filepath = ConfigurationManager.AppSettings["Attachment_filepath"];


            //MailMessageのインスタンスを生成します。
            MailMessage message = new MailMessage();
            //送信者(差出人)
            message.From = new MailAddress(source_mailaddress);
            //宛先
            message.To.Add(new MailAddress(destination_mailaddress));
            //宛先に追加する場合は以下
            //message.To.Add(new System.Net.Mail.MailAddress("xxxxx@example.com"));
            //CCを追加する場合は以下
            //message.CC.Add(new System.Net.Mail.MailAddress("xxxxx@example.com"));
            //BCCを追加する場合は以下
            //message.Bcc.Add(new System.Net.Mail.MailAddress("xxxxx@example.com"));
            //送信者(メールヘッダーのsender)
            //message.Sender = new MailAddress(source_mailaddress);
            //件名
            message.Subject = "メールの件名です";
            //本文
            message.Body = "メールの本文をこちらに入れます。";

            //添付ファイル
            Attachment data = new Attachment(Attachment_filepath);
            message.Attachments.Add(data);
            //添付ファイルを追加する場合は以下
            //Attachment data1 = new Attachment("ファイルPath");
            //message.Attachments.Add(data1);

            SmtpClient client = new SmtpClient();
            //SMTPサーバーのホスト名
            client.Host = smtp_server;
            //SMTPサーバーのポート番号
            client.Port = port_no;
            //認証に使用する資格情報
            client.Credentials = new System.Net.NetworkCredential(smtp_user, smtp_password);
            //送信メッセージの処理方法※通常はNetwork
            client.DeliveryMethod = SmtpDeliveryMethod.Network;
            //メールを送信します。
            client.Send(message);

            //インスタンスを解放します。
            message.Dispose();
            //インスタンスを解放します。
            client.Dispose();

        }

    }
}

これでプログラムはほぼ完成です。

プログラムの処理内容はコードのコメントで記載していますが、一部の処理を補足しておきます。

19行目から20行目

Windowsのコマンドプロンプト(cmd.exe)を呼び出して、NET USEコマンドを実行しています。
尚、NET USEはもし既にセッションが残っていた場合に備えて、先にDELETEしてから接続します。
コマンドプロンプトのコマンドは & で繋げることで複数のコマンドを1行で実行できるため、そのように実装しています。
実行する環境によってはNET USEを使わなくても共有フォルダへ接続できる可能性もあるので、その場合は19行目と20行目、後は34行目と35行目も//でコメントアウトしてください。

43行目

前後の変数のデータ型はstring(文字列)ですが、この行は変数はint(数値)型で生成しており、App.configで取得してきた値をParseでintに変換しています。
これは、ConfigurationManagerでApp.configから取得してきた値がstringで取れており、81行目でポート番号をプロパティに指定する際にはint型の変数じゃないとエラーになるという理由からこのような実装がされています。

52行目以降

メールを送るうえで最低限必要と思われるプロパティ以外はコメント化してあります。
メールのCCを追加したい場合や添付ファイルを複数設定したい場合などはコメントアウトした//を外して有効化して使用してください。

 

プログラムの実行

作成したプログラムを実行してみます。

作成したプログラムを実行するには、画面上部の「開始」をクリックします。

尚、「開始」の左側の「Debug」と「Release」も理解しておいたほうがよいポイントなので、後からこちらも解説します。
まずは、既定値の「Debug」のままにしておいてください。

VSのプログラム実行

今回のアプリケーションはコンソールアプリなので、コマンドプロンプトの様な真っ黒のウィンドウが一瞬だけ表示されます。

処理内容はNET USEで共有フォルダへの認証を行った後にメールを送信するだけの処理なので、一瞬で完了します。

尚、プログラムに問題があれば、プログラムの該当行でエラーになり処理が止まります。
エラーにならず処理が完了すれば正常終了です。

後はApp.configで指定した送信先のメールアドレスにメールが届いていれば成功です。
 
 

C#のプログラムを書くうえでの基礎知識

当項では、今回動かしたサンプルコードの理解を助けるうえで必要になる、C#の基本的な知識を紹介します。
尚、本来の基礎知識はこの記事で書ききれるほど単純な内容では無いため、この記事のサンプルコードで使っている処理や記述を抜粋して簡単に紹介する程度に留めます。
 

プログラムの冒頭に書かれている「using」とは

冒頭に書かれている「using」について簡単に説明します。

C#では、多くの機能が「クラス」として用意されています。
このクラスは「名前空間」と呼ばれる階層分けされた領域に格納されており、そのクラスをプログラムで呼び出す場合は、プログラム内に以下のように記述します。

名前空間名.クラス名

ただ、この場合は記述が長くなってしまいコードが見辛いため、プログラム内で使用するクラスの名前空間を省略できる仕組みが「usingディレクティブ」です。
 

メソッド名の前の「void」とは

今回のサンプルコードでは、大きく二つの処理に分かれています。
11行目から始まる「Main」処理と40行目から始まる「SendMail」処理です。

これらの処理の塊を「メソッド」と呼びます。

このメソッドの先頭ではそのメソッドの名前や種類などを宣言するのですが、「void」と書かれています。
これは、”戻り値の無いメソッド”という意味合いです。

世の中で使える人も多いVBAで言えば、Subプロシージャと同じです。

voidを指定したメソッドは別のプログラムから呼ばれるだけであり、その処理結果などを呼び出し元に返すことはできません。

プログラミング初心者の人や、C#の経験が無い人は、まずはvoidでメソッドを作れれば十分です。
 

C#の変数の宣言方法

変数の宣言のやり方も簡単に紹介しておきます。
例えば、VBAで変数を宣言する場合は、以下の構文になります。

Dim 変数名 as データ型

C#の場合は以下です。

データ型 変数

更に大抵は宣言と同時に値の代入もします。
 

その他の文法上の特徴

C#では、行の最後に「;」を付けます。
この「;」が付いているところまでがプログラムの一行です。

また、メソッドの範囲やIF文の処理範囲を { } で囲みます。

この辺りの文法はすぐに慣れます。
 

プログラムのデバッグのやり方

作成したプログラムを実際に動かしてみて、意図したとおりに動くか確認することを「デバッグ」と呼びます。
当項ではC#で「デバッグ」するやり方を紹介します。
 

「ステップイン」について

「ステップイン」とは、プログラムの動作を確認する目的でプログラムを1行ごとに実行していくデバッグ用の機能です。

画面上部のメニュー内の「デバッグ」をクリックすると、デバッグに関する項目が開きます。
この項目のなかの「ステップイン」をクリックするとステップインでプログラムが実行されます。
尚、ショートカットキーは「F11」なので、F11を直接押下してもデバッグ実行が開始されます。

VSのステップインデバッグの画像

ステップインでプログラムを実行した場合は、プログラムの先頭行で処理が中断した状態になり、F11キーを押す度に1行ずつ実行されていきます。
 

「ブレークポイント」について

「ブレークポイント」とは、実行中のプログラムを特定の行で中断(一時停止)させることのできるデバッグ用の機能です。
中断させたのち、前述したステップインで1行ずつ実行しながら動作を確認していきます。

一般的にステップインでデバッグをする際には、プログラムの先頭から一行ごとに確認をしていくことは殆どなく、プログラムの特定の行で処理を一時的に止めて、そこからステップインでデバッグしていくことが大半です。
よって、ステップインで確認したいプログラムの位置まで処理を進める目的で使用されます。

ブレークポイントは、画面左側の縦のラインをクリックすることで設置できます。

VSのブレークポイントの置き方画像

ブレークポイントは一か所だけではなく、複数同時に設置することも可能です。

尚、設置したブレークポイントを撤去する場合は、ブレークポイントの赤丸を再度クリックすると外れます。
 

「ビルド」時のDebugとReleaseの違い

画面上部では、既定だと「Debug」が選択された箇所があります。
ここを開くと、「Debug」と「Release」を選択できます。

当項ではこの「Debug」と「Release」についても簡単に解説しておきます。

この項目は、プログラムを実行したり、ビルド(実行ファイルの作成)をする際のモードを切り替えます。
一般的には、プログラムの開発中は「Debug」を選択し、プログラムを本番環境で動かす前のテストや、その本番環境へリリースする予定の実行ファイルを作成する際には「Release」を選択します。

この二つのモードは以下の特徴があります。

Debugモード

  • 処理の最適化はされず書かれたプログラムの通りに実行される。
  • デバッグ時に必要なメモリー内の情報も内部的に取得する。
  • 最適化されていないため処理が遅い。
  • ビルドした実行ファイルはbinフォルダ配下の「Debug」フォルダに作成される。
Releaseモード

  • 処理の最適化が適用され、無駄な処理を省かれたり非効率な処理の改変や処理順の変更などの修正がされる。
  • プログラムの実行に不要なメモリー内の情報は取得されない。
  • 最適化されており処理が速い。
  • ビルドした実行ファイルはbinフォルダ配下の「Release」フォルダに作成される。

例えば、Releaseモードでブレイクポイントを置いてステップインでデバッグ作業をする場合、プログラムの記述内容によっては一行ごとの処理の確認ができなかったり、変数の値が取れなかったりします。
また、Releaseモードでは、書いたプログラム通りに実行されるとは限らないため、厳密にはDebugモードだけではなく、Releaseモードでの動作テストも実施する必要があります。

このように、「Debug」と「Release」はC#でアプリケーションを開発する場合に、必ず知っておくべき仕組みであり、これらの特性を適切に理解して使い分けることが必要です。
 
 

実行ファイルの作成方法

コンソールアプリを作成する場合、Visual Studioが無い環境でも作成したプログラムが動かせるように、最終的に「EXEファイル」を作成することになります。

EXEファイルを作成する場合は、Visual Studioの画面上部のメニュー内の「ビルド」を開き、「ソリューションのビルド」又は「ソリューションのリビルド」を選択します。

VSのビルド説明画像

作成したプログラムに問題が無ければ、画面下部に出力先のパスが表示されて所定のパスにEXEファイルが作成されます。

尚、今回のサンプルコードをビルドすると、出力先には以下のファイルが生成されます。

VSのビルド時に生成されたファイル

「MailSendTest.exe」はプログラムファイル本体です。
「MailSendTest.exe.config」は、当サンプルプログラム作成時に編集したApp.configです。
「MailSendTest.pdb」はデバッグで必要になるファイルであり、EXEファイルを実行させる場合には必要ありません。

よって、当実行ファイルを使用する場合は、実行するサーバーなどの任意のフォルダに「MailSendTest.exe」と「MailSendTest.exe.config」だけを配置しておく感じになります。
今回のサンプルコードで生成されるファイルは僅かですが、ソリューション内に様々なファイルを作成してビルドすると、「MailSendTest.pdb」のように、EXEの実行とは関係のないファイルも多く生成されます。

作成したEXEファイルを実行環境に配置する際には、必ず不要なファイルを除き、EXEの実行に必要なファイルだけを配置するようにしてください。
不要なファイルまで配置してしまうと、僅かとは言え不必要にデータ領域を消費してしまいますし、実行ファイルの管理上も手間が増えて作業ミスなどを生むもとになります。

必要なファイルだけを実行環境に配置することを必ず心掛けてください。
 
 

最後に

今回は、初めてC#をさわるプログラミング初心者向けに、Visual Studioでプロジェクトの作成方法や、サンプルコードの紹介、デバッグの仕方やコンパイル(ビルド)の仕方、C#のコーディングにおけるちょっとした知識を掻い摘んで紹介させていただきました。

C#は数あるプログラミング言語のなかでも比較的難易度の高い言語です。

それは「オブジェクト指向」と呼ばれる洗練されたプログラミング設計で実装することを前提に作られている言語といった理由と、非常に多機能で使いこなすには多くの勉強が必要という部分が大きいのですが、オブジェクト指向に拘らず、Visual Studioの最低限の機能でプログラミングをするうえではそれほど難しくはありません。

また、今回作成した「コンソールアプリ」のように、専用画面の無いアプリケーションであれば、フォームの制御などを実装する必要もなくなり、手軽に作れます。

世の中にはC#で作られているシステムやアプリケーションも非常に多く、習得しておいて損のない、まだまだ将来性のあるプログラミング言語だと言えます。
是非これを機にC#を使用したプログラミングにチャレンジしてみてください。

今回も読んでいただきましてありがとうございました。
それでは皆さまごきげんよう!

タイトルとURLをコピーしました