【VB.NET】System.Net.Mail の SmtpClient は使うな! MailKit を使え!

ひさしぶりにメール送信を行うツールを作ろうと思ったんデス。

過去に作ったメール送信のプログラムをほじくり返してコードを流用しようかな~とも思ったけれど・・・ほら、プログラミングの世界は変化が激しいからね! より良い方法が次々に現れてやり方が変わったりする可能性があるから。念のためメール送信の方法についてネット検索してみたわけです。以前と違う新しい方法が出てきたりしてないでしょうね~と・・・。

そしたらその予感が的中。株やっても宝くじ買っても、みごとにハズレまくりな自分なのに、変なところで的中運を使っちゃうんだよなー。

無駄話はこのへんにして本題へ!

.NET 4.5 以降なら System.Net.Mail.SmtpClient は使うな! MailKit を使え!

現在、Microsoft の System.Net.Mail.SmtpClient の記事を開くと、次のようにハッキリと書かれています。

Warning
This API is now obsolete.

警告
これは古い(廃止予定の)API です。

 

we strongly recommend you use https://github.com/jstedfast/MailKit and https://github.com/jstedfast/MimeKit instead

かわりに MailKit と MimeKit の使用を強くお勧めします

 

Important
We don’t recommend that you use the SmtpClient class for new development. For more information, see SmtpClient shouldn’t be used on GitHub.

重要
新しい開発で SmtpClient の使用はおすすめしません。詳細については GitHub の「SmtpClient を使用すべきではない」をご覧ください。

 

メールを送信するために .NET Framework 2.0(2005/11~)から長い間使われてきた System.Net.Mail.SmtpClient ですが、2017 年の 4 月頃には SmtpClient クラスのドキュメントに obsolete(古い、廃止予定)と書かれていたようです(原文)。設計が貧弱で問題があるんだとか。

MailKit が .NET Framework 4.5 から対応しているらしいので、.NET Framework 4.5 以上を使用するアプリならば、MailKit を使うようにしましょう。

MailKit のインストール

NuGet からインストールできます。NuGet から MailKit をインストールすると MimeKit もくっついてくるようです。

Visual Studio の[ツール]>[NuGet パッケージ マネージャー]>[ソリューションの NuGet パッケージの管理]を選択します。

左上の[参照]をクリックして、検索ボックスに「MailKit」と入力。右側でインストール対象のプロジェクトにチェックを入れて、右下の[インストール]をクリック。

下記のような確認ダイアログが表示されるので、[OK]をクリックするとインストールが開始します。

インストール状態を示す出力ウィンドウはこんな感じ。

MEMO

MailKit をインストールすると、通常は MimeKit も一緒にインストールされるはずです。

 

しかし場合によっては一緒にインストールされないことがあるので、そのときは前述の手順で個別にインストールする必要があります。

たとえば、私が MailKit をインストールしたプロジェクトファイル一式を別のコンピュータにコピーしたとき、MailKit の再インストールが必要になったのですが、再インストールしても MimeKit が一緒にインストールされなかったので(コードに発生したエラーで気付いた)、別途インストールしなければいけませんでした。

MailKit によるメール送信のコード

下記のような感じです。難しくないですね。関数の頭に Async を忘れないように。

Async Sub SendMail

  'メールタイトル
  Dim Subject As String = "テストメール"
  'メール本文
  Dim BodyText As String = "こんにちは。(*^▽^*)" & vbCrLf & vbCrLf & "お元気ですか?"
  '送信者の名前
  Dim From_Name As String = "From Ellen East"
  '送信者のメールアドレス
  Dim From_Address As String = "FromMailAddress.com"
  '宛先の名前
  Dim To_Name As String = "To Ellen East"
  '宛先のメールアドレス
  Dim To_Address As String = "ToMailAddress.com"
  'SMTP サーバー
  Dim SmtpServer As String = "SmtpServer.jp"
  'ポート
  Dim Port As UInteger = 25
  'サーバー認証ユーザー名
  Dim Auth_Username As String = "Username"
  'サーバー認証パスワード
  Dim Auth_Password As String = "Password"

  Dim oMsg = New MimeKit.MimeMessage
  '送信者
  oMsg.From.Add(New MimeKit.MailboxAddress(From_Name, From_Address))
  '宛先  必要に応じて message.Cc.Add、message.Bcc.Add
  oMsg.To.Add(New MimeKit.MailboxAddress(To_Name, To_Address))
  'タイトル
  oMsg.Subject = Subject
  '本文
  Dim oTextPart = New MimeKit.TextPart(MimeKit.Text.TextFormat.Text)
  oTextPart.Text = BodyText
  oMsg.Body = oTextPart

  Using oClient = New MailKit.Net.Smtp.SmtpClient()
      Try
          Await oClient.ConnectAsync(SmtpServer, Port) '接続
          Await oClient.AuthenticateAsync(Auth_Username, Auth_Password) '認証
          Await oClient.SendAsync(oMsg) '送信
          Await oClient.DisconnectAsync(True) '切断
      Catch ex As Exception
          Throw New Exception(ex.Message & vbCrLf & vbCrLf & "メールの送信が失敗しました。")
      End Try
  End Using

End Sub

Yahoo と XSERVER の SMTP サーバーに送信して動作確認しましたが、問題なく動作しました。

 

参考にした記事:電子メールを送信するには?(MailKit編)[.NET 4.5、C#/VB]

 

購読する
通知を受け取る対象
guest
0 Comments
Newest
Oldest
Inline Feedbacks
View all comments