DOBON.NET

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();

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

mime-version: 1.0
from: from@xxx.xxx
to: to@xxx.xxx
date: 22 Jan 2007 18:33:17 +0900
subject: =?utf-8?B?6aGM5ZCN?=
content-type: text/html; charset=utf-8
content-transfer-encoding: base64

44GT44KT44Gr44Gh44Gv44CCPGJyPjxhIGhyZWY9Imh0dHA6Ly9kb2Jvbi5uZXQvIj5ET0JP
Ti5ORVQ8L2E+

.

"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();

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

mime-version: 1.0
from: from@xxx.xxx
to: to@xxx.xxx
date: 22 Jan 2007 22:16:41 +0900
subject: =?utf-8?B?6aGM5ZCN?=
content-type: multipart/mixed; boundary=--boundary_0_74eda213-ff7e-42b5-959b-15286c9c9ecf


----boundary_0_74eda213-ff7e-42b5-959b-15286c9c9ecf
content-type: multipart/alternative; boundary=--boundary_1_cd8bf7e0-3448-4b2c-89d3-98bee56196d3


----boundary_1_cd8bf7e0-3448-4b2c-89d3-98bee56196d3
content-type: text/plain; charset=utf-8
content-transfer-encoding: base64

44GT44KT44Gr44Gh44Gv44CCDQpET0JPTi5ORVQ=
----boundary_1_cd8bf7e0-3448-4b2c-89d3-98bee56196d3
content-type: text/html; charset=utf-8
content-transfer-encoding: base64

44GT44KT44Gr44Gh44Gv44CCPGJyPjxhIGhyZWY9Imh0dHA6Ly9kb2Jvbi5uZXQvIj5ET0JP
Ti5ORVQ8L2E+
----boundary_1_cd8bf7e0-3448-4b2c-89d3-98bee56196d3--

----boundary_0_74eda213-ff7e-42b5-959b-15286c9c9ecf--


.

上記の例では、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();

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

mime-version: 1.0
from: from@xxx.xxx
to: to@xxx.xxx
date: 23 Jan 2007 00:56:38 +0900
content-type: multipart/mixed; boundary=--boundary_0_e459de52-94de-46a6-9371-322bdb9b4ff9


----boundary_0_e459de52-94de-46a6-9371-322bdb9b4ff9
content-type: multipart/alternative; boundary=--boundary_1_de9c08ea-2f13-4246-bea0-3366b26cad44


----boundary_1_de9c08ea-2f13-4246-bea0-3366b26cad44
content-type: text/plain; charset=utf-8
content-transfer-encoding: base64

44GT44KT44Gr44Gh44Gv44CCDQpET0JPTi5ORVQ=
----boundary_1_de9c08ea-2f13-4246-bea0-3366b26cad44
content-type: multipart/related;
 boundary=--boundary_2_7536a6da-9eb0-4ada-8068-90e194048aa9; type="text/html"
content-location: https://dobon.net/


----boundary_2_7536a6da-9eb0-4ada-8068-90e194048aa9
content-type: text/html; charset=us-ascii
content-transfer-encoding: quoted-printable
content-location: https://dobon.net/

<br><a href=3D"index.html"><img src=3D"cid:dbs1"></a>
----boundary_2_7536a6da-9eb0-4ada-8068-90e194048aa9
content-type: image/gif
content-transfer-encoding: base64
content-id: <dbs1>
content-location: https://dobon.net/banner/dbs1.gif

(省略)
----boundary_2_7536a6da-9eb0-4ada-8068-90e194048aa9--

----boundary_1_de9c08ea-2f13-4246-bea0-3366b26cad44--

----boundary_0_e459de52-94de-46a6-9371-322bdb9b4ff9--


.

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);

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

thread-index: Acc+BYZUvklIO1tyTzWLvZGZHmqamg==
Thread-Topic: =?iso-2022-jp?B?GyRCJUYlOSVIGyhC?=
From: <sender@xxx.xxx>
To: <recipient1@xxx.xxx>
Subject: =?iso-2022-jp?B?GyRCJUYlOSVIGyhC?=
Date: Mon, 22 Jan 2007 22:13:05 +0900
Message-ID: <000001c73e05$868dff80$0300a8c0@mainpc>
MIME-Version: 1.0
Content-Type: multipart/alternative;
    boundary="----=_NextPart_000_0001_01C73E50.F677F170"
X-Mailer: Microsoft CDO for Windows 2000
Content-Class: urn:content-classes:message
Importance: normal
Priority: normal
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.3028

This is a multi-part message in MIME format.

------=_NextPart_000_0001_01C73E50.F677F170
Content-Type: text/plain;
    charset="iso-2022-jp"
Content-Transfer-Encoding: 7bit

こんにちは。
DOBON.NET <https://dobon.net/> 

------=_NextPart_000_0001_01C73E50.F677F170
Content-Type: text/html;
    charset="iso-2022-jp"
Content-Transfer-Encoding: 7bit

こんにちは。<br><a href="https://dobon.net/">DOBON.NET</a>
------=_NextPart_000_0001_01C73E50.F677F170--

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

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

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

この記事への評価

この記事へのコメント

この記事に関するコメントを投稿するには、下のボタンをクリックしてください。投稿フォームへ移動します。通常のご質問、ご意見等は掲示板へご投稿ください。