注意:ここで紹介しているコードを実際に使用する場合は、必ずSMTPサーバー、送信者、宛先などの設定を適切に変更してください。
ここでは、HTMLメールを送信する方法を紹介します。
注意:SmtpClientクラスは、.NET Framework 2.0以降でしか使用できません。また、ここではSmtpClientクラスについて詳しくは説明しませんので、まずは「SmtpClientクラスを使ってメールを送信する」をご覧ください。
SmtpClientクラスでは、MailMessageクラスのIsBodyHtmlプロパティをtrueにすることにより、HTMLメールを送信することができます。
'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()
//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+ .
「Content-Type: multipart/alternative」としてHTMLの他にプレーンテキストのデータも付加するには、MailMessageクラスのAlternateViewsプロパティに適当なAlternateViewオブジェクトを追加します。AlternateViewオブジェクトは、AlternateView.CreateAlternateViewFromStringメソッドで簡単に作成できます。
'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()
//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に画像を入れてみます。AlternateView.LinkedResourcesプロパティに画像のLinkedResourceを追加します。HTMLの画像へのリンクには、LinkedResource.ContentIdで指定しているIDを使用します。
'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()
//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クラスの場合は、MailMessage.BodyFormatプロパティをMailFormat.Htmlとすることにより、HTMLメールを送ることができます。このように送信されたメールは、「Content-Type: multipart/alternative」となり、HTMLとプレーンテキストのデータが送信されます。プレーンテキストのデータは、自動的に作成され、付加されます。
なおSmtpMailクラスを使ってメールを送信する基本的な方法は、「SMTPでメールを送信する」をご覧ください。
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)
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-- .