DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

HTMLメールを送信する

注意:ここで紹介しているコードを実際に使用する場合は、必ずSMTPサーバー、送信者、宛先などの設定を適切に変更してください。

ここでは、HTMLメールを送信する方法を紹介します。

SmtpClientクラスを使用する方法

注意:SmtpClientクラスは、.NET Framework 2.0以降でしか使用できません。また、ここではSmtpClientクラスについて詳しくは説明しませんので、まずは「SmtpClientクラスを使ってメールを送信する」をご覧ください。

SmtpClientクラスでは、MailMessageクラスのIsBodyHtmlプロパティをtrueにすることにより、HTMLメールを送信することができます。

VB.NET
コードを隠すコードを選択
'MailMessageの作成
Dim msg As New System.Net.Mail.MailMessage("from@xxx.xxx", "to@xxx.xxx")
msg.Subject = "題名"
'HTMLメールとして送信する
msg.IsBodyHtml = True
msg.Body = "こんにちは。<br><a href=""https://dobon.net/"">DOBON.NET</a>"

Dim sc As New System.Net.Mail.SmtpClient()
'SMTPサーバーなどを設定する
sc.Host = "localhost"
sc.Port = 25
sc.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network
'メッセージを送信する
sc.Send(msg)

'後始末
msg.Dispose()
'後始末(.NET Framework 4.0以降)
sc.Dispose()
C#
コードを隠すコードを選択
//MailMessageの作成
System.Net.Mail.MailMessage msg = new System.Net.Mail.MailMessage(
    "from@xxx.xxx", "to@xxx.xxx");
msg.Subject = "題名";
//HTMLメールとして送信する
msg.IsBodyHtml = true;
msg.Body = "こんにちは。<br><a href=\"https://dobon.net/\">DOBON.NET</a>";

System.Net.Mail.SmtpClient sc = new System.Net.Mail.SmtpClient();
//SMTPサーバーなどを設定する
sc.Host = "localhost";
sc.Port = 25;
sc.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;
//メッセージを送信する
sc.Send(msg);

//後始末
msg.Dispose();
//後始末(.NET Framework 4.0以降)
sc.Dispose();

上のようなコードで送信されるメールのデータは、次のようになります。

"multipart/alternative"としてHTMLメールを送信する

「Content-Type: multipart/alternative」としてHTMLの他にプレーンテキストのデータも付加するには、MailMessageクラスのAlternateViewsプロパティに適当なAlternateViewオブジェクトを追加します。AlternateViewオブジェクトは、AlternateView.CreateAlternateViewFromStringメソッドで簡単に作成できます。

VB.NET
コードを隠すコードを選択
'MailMessageの作成
Dim msg As New System.Net.Mail.MailMessage("from@xxx.xxx", "to@xxx.xxx")
msg.Subject = "題名"

'プレーンテキストをBodyに追加
msg.Body = "こんにちは。" + vbCrLf + "DOBON.NET"

'HTMLを追加
'Encodingにnullを指定しているため、UTF-8/Base64でエンコードされる
Dim htmlView As System.Net.Mail.AlternateView = _
    System.Net.Mail.AlternateView.CreateAlternateViewFromString( _
        "こんにちは。<br><a href=""https://dobon.net/"">DOBON.NET</a>", _
        Nothing, System.Net.Mime.MediaTypeNames.Text.Html)
'HTMLの内容がファイルに格納されている場合は、次のようにする
'Dim htmlView As New System.Net.Mail.AlternateView( _
'    "C:\hello.html", System.Net.Mime.MediaTypeNames.Text.Html)
'Base64(デフォルト)、QuotedPrintable、SevenBit、Unknownを選択できる
htmlView.TransferEncoding = System.Net.Mime.TransferEncoding.Base64
'次のようにベースURLを指定できる
'htmlView.BaseUri = New Uri("https://dobon.net/")
msg.AlternateViews.Add(htmlView)

Dim sc As New System.Net.Mail.SmtpClient()
'SMTPサーバーなどを設定する
sc.Host = "localhost"
sc.Port = 25
sc.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network
'メッセージを送信する
sc.Send(msg)

'後始末
msg.Dispose()
'後始末(.NET Framework 4.0以降)
sc.Dispose()
C#
コードを隠すコードを選択
//MailMessageの作成
System.Net.Mail.MailMessage msg = new System.Net.Mail.MailMessage(
    "from@xxx.xxx", "to@xxx.xxx");
msg.Subject = "題名";

////プレーンテキストをBodyに追加
msg.Body = "こんにちは。\r\nDOBON.NET";

//HTMLを追加
//Encodingにnullを指定しているため、UTF-8/Base64でエンコードされる
System.Net.Mail.AlternateView htmlView =
    System.Net.Mail.AlternateView.CreateAlternateViewFromString(
        "こんにちは。<br><a href=\"https://dobon.net/\">DOBON.NET</a>",
        null, System.Net.Mime.MediaTypeNames.Text.Html);
//HTMLの内容がファイルに格納されている場合は、次のようにする
//System.Net.Mail.AlternateView htmlView = new System.Net.Mail.AlternateView(
//    "C:\\hello.html", System.Net.Mime.MediaTypeNames.Text.Html);
//Base64(デフォルト)、QuotedPrintable、SevenBit、Unknownを選択できる
htmlView.TransferEncoding = System.Net.Mime.TransferEncoding.Base64;
//次のようにベースURLを指定できる
//htmlView.BaseUri = new Uri("https://dobon.net/");
msg.AlternateViews.Add(htmlView);

System.Net.Mail.SmtpClient sc = new System.Net.Mail.SmtpClient();
//SMTPサーバーなどを設定する
sc.Host = "localhost";
sc.Port = 25;
sc.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;
//メッセージを送信する
sc.Send(msg);

//後始末
msg.Dispose();
//後始末(.NET Framework 4.0以降)
sc.Dispose();

このコードを実行させると、次のようなメールのデータが送信されます。

上記の例では、MailMessage.Bodyにプレーンテキストを指定していますが、Bodyに何も指定せずに、HTMLと同じようにAlternateViewでプレーンテキストを追加しても同じ結果となります。

HTMLに画像を埋め込む

さらに、HTMLに画像を入れてみます。AlternateView.LinkedResourcesプロパティに画像のLinkedResourceを追加します。HTMLの画像へのリンクには、LinkedResource.ContentIdで指定しているIDを使用します。

VB.NET
コードを隠すコードを選択
'MailMessageの作成
Dim msg As New System.Net.Mail.MailMessage("from@xxx.xxx", "to@xxx.xxx")
msg.Subject = "題名"

'//プレーンテキストをBodyに追加
msg.Body = "こんにちは。" + vbCrLf + "DOBON.NET"

'HTMLを追加
'Encodingにnullを指定しているため、UTF-8でエンコードされる
'ContentIdを"dbs1"とする
Dim htmlView As System.Net.Mail.AlternateView = _
    System.Net.Mail.AlternateView.CreateAlternateViewFromString( _
        "<br><a href=""index.html""><img src=""cid:dbs1""></a>", _
        Nothing, System.Net.Mime.MediaTypeNames.Text.Html)
htmlView.BaseUri = New Uri("https://dobon.net/")
'HTML内の画像のLinkedResourceを作成
Dim res As New System.Net.Mail.LinkedResource("C:\dbs1.gif", "image/gif")
res.ContentId = "dbs1"
'Content-Locationを指定
res.ContentLink = New Uri("https://dobon.net/banner/dbs1.gif")
'LinkedResourceを追加
htmlView.LinkedResources.Add(res)
'AlternateViewを追加
msg.AlternateViews.Add(htmlView)

Dim sc As New System.Net.Mail.SmtpClient()
'SMTPサーバーなどを設定する
sc.Host = "localhost"
sc.Port = 25
sc.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network
'メッセージを送信する
sc.Send(msg)

'後始末
msg.Dispose()
'後始末(.NET Framework 4.0以降)
sc.Dispose()
C#
コードを隠すコードを選択
//MailMessageの作成
System.Net.Mail.MailMessage msg = new System.Net.Mail.MailMessage(
    "from@xxx.xxx", "to@xxx.xxx");
msg.Subject = "題名";

//プレーンテキストをBodyに追加
msg.Body = "こんにちは。\r\nDOBON.NET";

//HTMLを追加
//Encodingにnullを指定しているため、UTF-8でエンコードされる
//ContentIdを"dbs1"とする
System.Net.Mail.AlternateView htmlView =
    System.Net.Mail.AlternateView.CreateAlternateViewFromString(
        "<br><a href=\"index.html\"><img src=\"cid:dbs1\"></a>",
        null, System.Net.Mime.MediaTypeNames.Text.Html);
htmlView.BaseUri = new Uri("https://dobon.net/");
//HTML内の画像のLinkedResourceを作成
System.Net.Mail.LinkedResource res =
    new System.Net.Mail.LinkedResource("C:\\dbs1.gif", "image/gif");
res.ContentId = "dbs1";
//Content-Locationを指定
res.ContentLink = new Uri("https://dobon.net/banner/dbs1.gif");
//LinkedResourceを追加
htmlView.LinkedResources.Add(res);
//AlternateViewを追加
msg.AlternateViews.Add(htmlView);

System.Net.Mail.SmtpClient sc = new System.Net.Mail.SmtpClient();
//SMTPサーバーなどを設定する
sc.Host = "localhost";
sc.Port = 25;
sc.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;
//メッセージを送信する
sc.Send(msg);

//後始末
msg.Dispose();
//後始末(.NET Framework 4.0以降)
sc.Dispose();

送信されるデータは、次のようになります。

SmtpMailクラスを使用する方法

SmtpMailクラスの場合は、MailMessage.BodyFormatプロパティをMailFormat.Htmlとすることにより、HTMLメールを送ることができます。このように送信されたメールは、「Content-Type: multipart/alternative」となり、HTMLとプレーンテキストのデータが送信されます。プレーンテキストのデータは、自動的に作成され、付加されます。

なおSmtpMailクラスを使ってメールを送信する基本的な方法は、「SMTPでメールを送信する」をご覧ください。

VB.NET
コードを隠すコードを選択
Dim mm As New System.Web.Mail.MailMessage()
'本文の文字コードを指定する(ここではJIS)
mm.BodyEncoding = System.Text.Encoding.GetEncoding(50220)
'送信者
mm.From = "sender@xxx.xxx"
'あて先
mm.To = "recipient1@xxx.xxx"
'件名
mm.Subject = "テスト"
'本文
'HTMLメールとする
mm.BodyFormat = System.Web.Mail.MailFormat.Html
mm.Body = "こんにちは。<br><a href=""https://dobon.net/"">DOBON.NET</a>"

'SMTPサーバーを指定する
System.Web.Mail.SmtpMail.SmtpServer = "localhost"
'送信する
System.Web.Mail.SmtpMail.Send(mm)
C#
コードを隠すコードを選択
System.Web.Mail.MailMessage mm = new System.Web.Mail.MailMessage();
//本文の文字コードを指定する(ここではJIS)
mm.BodyEncoding = System.Text.Encoding.GetEncoding(50220);
//送信者
mm.From = "sender@xxx.xxx";
//あて先
mm.To = "recipient1@xxx.xxx";
//件名
mm.Subject = "テスト";
//本文
//HTMLメールとする
mm.BodyFormat = System.Web.Mail.MailFormat.Html;
mm.Body = "こんにちは。<br><a href=\"https://dobon.net/\">DOBON.NET</a>";

//SMTPサーバーを指定する
System.Web.Mail.SmtpMail.SmtpServer = "localhost";
//送信する
System.Web.Mail.SmtpMail.Send(mm);

上記のコードで送信されるメールのデータは、次のようになります。

  • 履歴:
  • 2013/6/24 SmtpClient.Disposeを呼び出すようにしたなど。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • このサイトで紹介されているコードの多くは、例外処理が省略されています。例外処理については、こちらをご覧ください。
  • Windows Vista以降でUACが有効になっていると、ファイルへの書き込みに失敗する可能性があります。詳しくは、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。