2017年9月13日水曜日

Gitでバージョン管理、始めました

◆ Visual Studio 2017ではGitバージョン管理システムが簡単に利用できる。せっかくなので本ブログでもGitを導入しよう。そしてGitHubにアカウントを作り、自作プロジェクトを世界に公開しちゃったりするのだ。

Gitの導入にあたって、Qiitaの先人の知恵がおおいに参考になった。具体的にはこの辺り→ https://qiita.com/search?q=Visual+Studio+GitHub

◆ GitとGitHubについて簡単なまとめ。
  • Git(ギット)は無料のバージョン管理ソフトである。
  • Gitのプロジェクト管理データを「リボジトリ」と呼ぶ。
  • 個人プロジェクトの場合はローカルPCにリポジトリを置いてもよい。
  • チーム開発なら公開サーバにリポジトリを置いて共有するとよい。
  • 公開サーバの代表格がGitHub(ギットハブ)である。
  • Visual Studioには簡単にGitHubに接続する拡張機能もある。
ちょっと触った感想では、Visual Studio単体より、GitHubのWebサイトのほうが管理画面が見やすい。個人でも積極的にGitHubを使うほうがよさそうだ。

◆ まずはGitHubでユーザー登録する。
登録画面は英語だが「Username」や「Mail Address」が読めれば問題ない。月に数ドルの有料コースもあるが、最初は無料アカウントでよいと思う。

◆ 次にGitHub拡張機能をVisual Studioにインストールする。
GitHub拡張はMicrosoftとGitHubのコラボで開発されたもので、これを使うと簡単にVisual StudioからGitHubに接続できる。

◆ 拡張機能をインストールしたら、さっそくGitHubに接続してみよう。
  1. Visual Studioのメニューで[表示]→[チームエクスプローラー]を開く
  2. 左上のプルダウンメニューで[プロジェクト]→[接続の管理]
  3. さらに[接続の管理]をクリック→[Conect to GitHub]
  4. ログイン窓が開くので、GitHubにログインする
ログインに成功すると、チームエクスプローラーの接続画面に[GitHub]の選択肢が追加される。

◆ 以上でGitHub利用の基本設定が完了した。いったんここで記事を切る。次回はローカルPCで作ったプロジェクトをGitHubに公開する方法を書く予定。

2017年9月10日日曜日

C# TIPS: IDE0018はout変数のインライン化の勧め

今日のTIPSは、メッセージIDE0018の意味と回避法について。

■ Visual Studio 2017から採用されたC#7では、次のようにout変数をインライン宣言できるようになった。

  string str = "文字列";
  if (!int.TryParse(str, out int num)) {
    // intへの変換失敗処理
  }
  Console.WriteLine("num={0}", num);


同じ処理をC#6では次のように別行で変数宣言する必要があった。

  string str = "文字列";
  int num;
  if (!int.TryParse(str, out num)) {
    // intへの変換失敗処理
  }
  Console.WriteLine("num={0}", num);


もちろんC#7でも後者の書き方は有効だが、こう書くとIDE0018のメッセージが出てうるさい。



わかったよもー。インライン化すればいいんでしょ。まあ便利なことには間違いないので、これからout変数はインライン宣言するようにしたい。

■ その他いろいろC#7には新機能が盛り込まれているようだ。次のMSDN記事にまとめられているので、あとで読んでおこう。

.NET Framework - C# 7.0 の新機能
https://msdn.microsoft.com/ja-jp/magazine/mt790184.aspx

2017年9月8日金曜日

C#のSmtpClientでメール送信(2)

【前記事】の続きとして、ここではSMTPサーバー設定の実例を紹介する。

◆ その前にSMTPについて簡単にお勉強を。

一般にメールを送るとき、宛先のコンピュータに直接データを届ける必要はない。あなたは適当なメールサーバーにメール送信を依頼するだけでよい。それが世界中のサーバーと連携し、うまいことメールをリレー転送してくれる。

このときデータのやりとりは、すべてSMTPプロトコル(RFC5321)に従って行われる。C#のSmtpClientクラスも、やはりSMTPプロトコルでメールを送信する。

◆ 本来、SMTPにはユーザー認証の機能がなく、誰でも匿名でメールを送信できた。そのため以前はスパムメールの発信基地としてSMTPサーバーが悪用されることも多々あった。

そこで最近のSMTPサーバーは、ユーザー認証しないと使えないようになっている。認証方法は主に次の2種類である。

* POP before SMTP
メールの受信(POP)にユーザー認証が必須なことを利用し、いったんメールを受信させてみて、成功したユーザーだけSMTPの送信を許可する。なおC#にはメール受信用の便利なクラスがないので、今回この方式はパス。

* SMTP Auth
SMTP自体にユーザー認証を組み込んだ方式。わりと新しいが最近のSTMPサーバーならたいてい利用できる。SmtpClientクラスもこれに対応している。

◆ さてユーザー認証にはパスワードの入力が付き物だ。しかしパスワードを平文で送信すると、途中で誰かに読まれる可能性が高い。そこで最近のSMTPサーバーは、暗号化通信も利用できるようになっている。暗号化には2つの方式があるらしい。

* STARTTLS
587番ポートを使う方式。詳細はよくわからないが、今回確認したSMTPサーバーはすべて587番ポートでメール送信できたので結果オーライとする。

* SMTPS (over SSL)
465番ポートを使う方式。詳細は未調査。今回465番ポートは全滅だったので、いまいち使い方がわからない。

◆ これらの認証方式や暗号化方式を、C#のコードから直接指定する方法はないと思う。ただし、プログラマがSmtpClientにヒントを与えることはできる。それが次の2つのプロパティだ。
  • Credentialsプロパティ→ 認証させたいとき設定する
  • EnabeleSslプロパティ→ 暗号化通信してほしいときtrueにする

今回のプログラムでは、認証は必ず「あり」、暗号化の「あり/なし」はユーザーが指定可能とした。

◆ というわけで、ここからは実際にメール送信に成功したSMTP設定例を示す。まずXREAレンタルサーバーの場合。



ここでわざとパスワードを間違えてみるとメール送信に失敗するので、ユーザー認証が働いていることがわかる。

また前述のように587番ポートのSMTPは暗号化通信を行う。その証拠に、送信されたメールのヘッダを見ると次のように書かれていた。

by s269.xrea.com with AES256-GCM-SHA384 encrypted SMTP;

これはTLSv1.2形式の強度256bitの暗号を意味している。

◆ お次はGoogleが提供する無料メール、Gmailを利用する設定。



サーバー名は「smtp.gmail.com」で、あとはXREAのレンタルサーバーと同様だ。これで「ユーザー認証あり」+「暗号化あり」形式で、SMTPサーバーが利用できる。

ただしGmailのSMTPサーバーは非常に疑い深く、一般人の自作プログラムなどといった怪しげなソフトの接続はデフォルトで拒否する。これを避けるには、最初に1回だけ次の手順を取る必要がある。
  1. Gmailにログインする
  2. 「アカウントへのアクセスとセキュリティ設定の管理」を開く
    ここ→ https://myaccount.google.com/security
  3. ページの下部にある「安全性の低いアプリの許可」を有効にする
この設定を行うと、あなたのアカウントでユーザー認証したときに限り、自作プログラムからGmailのSMTPサーバーが使えるようになる。

なお、GmailのSMTPサーバーを利用する場合、1日に送信できるメールは2千通までに制限される。大規模な業務用にはちょっときついかもね。

◆ 最後にYahooメールのSMTPサーバー設定。問題はここで発生した。



サーバー名は「smtp.mail.yahoo.co.jp」、587番ポートを使うのは他のSMTPサーバーと同様。だがこのSMTPサーバーでは暗号化通信ができない。暗号化を要求するとSMTPサーバーに拒否されてしまう。暗号化なしなら普通にメール送信できる。うーむ、これってどうよ。

そこでYahooメールの公式マニュアルを見ると、SMTPサーバーには456番ポートで接続するように指定されていた。それか!

要するにYahooメールのSMTPサーバーを使う場合は「SMTPS (over SSL)」方式が必要なわけだ。困ったなそれまだプログラム作れてないんだ。まあ、もう少し勉強してから再挑戦だな。ここは撤収!

それにしても、なんでこれ587番ポートは開いてるんだろう?いまどき暗号化なしでパスワード入力なんて、こわくて使えないぞよ?

2017年9月7日木曜日

C#のSmtpClientでメール送信(1)

メール送信用のSmtpClientクラスが便利そうなので使ってみるテスト。

■ 今回作るのは短文をちょこっとメールというか、具体的にはPCから自分のモバイル端末にURLを送るだけの単純なプログラムである。次のような用途を想定している。
  1. PCのWebブラウザでネットを見ていたら興味深いサイトを発見。
  2. → サイトのURLをスマホに送りたい。
  3. → WebブラウザからこのアプリにURLをドラッグ&ドロップ。
  4. → スマホのメールにURLが送信される。

■ とりあえずC#プロジェクトを新規作成し、フォームにコントールを配置する。




■ 次のイベントハンドラを追加する。
  • フォームのLoadイベント
  • フォームのFormClosedイベント
  • フォームのDragEnterイベント
  • フォームのDragDropイベント
  • 送信ボタンのClickイベント

■ [プロジェクトのプロパティ]→[設定]で、11個の変数を登録する。


■ Form1.csにコードを書く。


■ デバッグ実行してみる。
  1. [デバッグ]→[デバッグの開始]
  2. [サーバー設定]タブで、SMTPサーバーが設定できる。

    設定は記録されるので次からは入力不要。
  3. Webブラウザから適当なURLをマウスでドラッグ&ドロップ。
  4. 上のようにメールの件名と本文が作られるので、差出人と宛先を入力して送信する。差出人と宛先は記録されるので次からは入力不要。
  5. スマホにメールが届くことを確認する。

■ 実際のSMTPサーバーの設定例などは【次回記事】にて。予定としては、
  • 自サーバー(XREAのレンタルサーバー)のSMTPを使う例
  • GmailのSMTPを利用する例
  • YahooメールのSMTPを利用する例
を書くつもりである。

■ プロジェクト一式のZIP圧縮ファイルを下記ページに置きました。

https://pilikala.net/yuima/e/006.html

ソースコードのみでEXEファイルなどのバイナリは入ってません。Visual Studio 2017 Community(無料版)で動作確認しました。