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

ポート番号を指定してSMTPでメールを送信する

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

ここでは、ポート番号を指定してSMTPでメールを送信する方法を紹介します。

SmtpClientクラスを使う方法

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

SmtpClientクラスでは、Portプロパティを設定するだけですので、説明の必要もないでしょう。

なおPortプロパティのデフォルト値は25ですが、アプリケーション構成ファイルによってデフォルト値が変更されている可能性もあります。詳しくは、こちらをご覧ください。

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

Dim sc As New System.Net.Mail.SmtpClient()
'SMTPサーバーを指定する
sc.Host = "localhost"
'ポート番号を指定する(既定値は25)
sc.Port = 25
'SMTPサーバーに送信する設定にする(既定はNetwork)
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", "題名", "本文");

System.Net.Mail.SmtpClient sc = new System.Net.Mail.SmtpClient();
//SMTPサーバーを指定する
sc.Host = "localhost";
//ポート番号を指定する(既定値は25)
sc.Port = 25;
//SMTPサーバーに送信する設定にする(既定はNetwork)
sc.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;
//メッセージを送信する
sc.Send(msg);

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

MailMessage.Fieldsプロパティを使う方法

System.Web.Mail.SmtpMailクラスでメールを送信する場合、通常はポート番号として25が使用されます。SmtpMailクラスでポート番号を変更するのは、少し厄介です。

.NET Framework 1.1からは、MailMessageクラスにFieldsプロパティが加わり、これを使うことにより、CDOのフィールドにアクセスできるようになりました。これを使ってCDOのsmtpserverportフィールドを変更すれば、System.Web.Mail.SmtpMailクラスでもポート番号を指定してメールを送信することができます。

VB.NET
コードを隠すコードを選択
Dim mail As New System.Web.Mail.MailMessage
'From
mail.From = "xxx@xxx.xxx"
'To
mail.To = "xxx@xxx.xxx"
'Subject
mail.Subject = "テスト"
'本文
mail.Body = "これはテストです。"

'ポート番号を指定する
mail.Fields.Item( _
    "http://schemas.microsoft.com/cdo/configuration/smtpserverport") _
    = 25

'SMTPサーバーを指定
System.Web.Mail.SmtpMail.SmtpServer = "xxx.xxx.xxx"
'メールを送信
System.Web.Mail.SmtpMail.Send(mail)
C#
コードを隠すコードを選択
System.Web.Mail.MailMessage mail = new System.Web.Mail.MailMessage();
//From
mail.From = "xxx@xxx.xxx";
//To
mail.To = "xxx@xxx.xxx";
//Subject
mail.Subject = "テスト";
//本文
mail.Body = "これはテストです。";

//ポート番号を指定する
mail.Fields[
    "http://schemas.microsoft.com/cdo/configuration/smtpserverport"]
    = 25;

System.Web.Mail.SmtpMail.SmtpServer = "xxx.xxx.xxx";

//メールを送信
System.Web.Mail.SmtpMail.Send(mail);

CDOを使う方法

.NET Framework 1.0を使用している場合は、残念ながらこのようにMailMessageクラスのFieldsプロパティを使うことが出来ません。しかし、.NET Framework 1.0でもCDOを使用することは可能です。次にCDOを使ってメールを送信するサンプルを紹介しましょう。遅延バインディングを行っているため、ちょっと複雑になっています。

VB.NET
コードを隠すコードを選択
Dim t As Type = Type.GetTypeFromProgID("CDO.Message")
Dim cdo As Object = Activator.CreateInstance(t)

t.InvokeMember("From", _
    System.Reflection.BindingFlags.SetProperty, _
    Nothing, cdo, New Object() {"xxx@xxx.xxx"})
t.InvokeMember("To", _
    System.Reflection.BindingFlags.SetProperty, _
    Nothing, cdo, New Object() {"xxx@xxx.xxx"})
t.InvokeMember("Subject", _
    System.Reflection.BindingFlags.SetProperty, _
    Nothing, cdo, New Object() {"テスト"})
t.InvokeMember("Textbody", _
    System.Reflection.BindingFlags.SetProperty, _
    Nothing, cdo, New Object() {"これはテストです!!"})

Dim conf As Object = t.InvokeMember("Configuration", _
    System.Reflection.BindingFlags.GetProperty, _
    Nothing, cdo, Nothing)
Dim fields As Object = t.InvokeMember("Fields", _
    System.Reflection.BindingFlags.GetProperty, _
    Nothing, conf, Nothing)
t.InvokeMember("Item", _
    System.Reflection.BindingFlags.SetProperty, _
    Nothing, fields, New Object() { _
    "http://schemas.microsoft.com/cdo/configuration/sendusing", _
    2})
'SMTPサーバーを指定する
t.InvokeMember("Item", _
    System.Reflection.BindingFlags.SetProperty, _
    Nothing, fields, New Object() { _
    "http://schemas.microsoft.com/cdo/configuration/smtpserver", _
    "xxx.xxx.xxx"})
'ポート番号を指定する
t.InvokeMember("Item", _
    System.Reflection.BindingFlags.SetProperty, _
    Nothing, fields, New Object() { _
    "http://schemas.microsoft.com/cdo/configuration/smtpserverport", _
    25})

t.InvokeMember("Update", _
    System.Reflection.BindingFlags.InvokeMethod, _
    Nothing, fields, New Object() {})

'送信する
t.InvokeMember("Send", _
    System.Reflection.BindingFlags.InvokeMethod, _
    Nothing, cdo, New Object() {})
C#
コードを隠すコードを選択
Type t = Type.GetTypeFromProgID("CDO.Message");
object cdo = Activator.CreateInstance(t);
t.InvokeMember("From",
    System.Reflection.BindingFlags.SetProperty,
    null, cdo, new object[] {"xxx@xxx.xxx"});
t.InvokeMember("To",
    System.Reflection.BindingFlags.SetProperty,
    null, cdo, new object[] {"xxx@xxx.xxx"});
t.InvokeMember("Subject",
    System.Reflection.BindingFlags.SetProperty,
    null, cdo, new object[] {"テスト"});
t.InvokeMember("Textbody",
    System.Reflection.BindingFlags.SetProperty,
    null, cdo, new object[] {"これはテストです!!"});

object conf = t.InvokeMember("Configuration",
    System.Reflection.BindingFlags.GetProperty,
    null, cdo, null);
object fields = t.InvokeMember("Fields",
    System.Reflection.BindingFlags.GetProperty,
    null, conf, null);
t.InvokeMember("Item",
    System.Reflection.BindingFlags.SetProperty,
    null, fields,
    new object[] {
        "http://schemas.microsoft.com/cdo/configuration/sendusing",
        2});
//SMTPサーバーを指定する
t.InvokeMember("Item",
    System.Reflection.BindingFlags.SetProperty,
    null, fields,
    new object[] {
        "http://schemas.microsoft.com/cdo/configuration/smtpserver",
        "xxx.xxx.xxx"});
//ポート番号を指定する
t.InvokeMember("Item",
    System.Reflection.BindingFlags.SetProperty,
    null, fields,
    new object[] {
        "http://schemas.microsoft.com/cdo/configuration/smtpserverport",
         25});

t.InvokeMember("Update",
    System.Reflection.BindingFlags.InvokeMethod,
    null, fields,
    new object[] {});

//送信する
t.InvokeMember("Send",
    System.Reflection.BindingFlags.InvokeMethod,
    null, cdo,
    new object[] {});

それ以外の方法

CDOを使えない、あるいは使いたくないという場合は、自分でコードを書くか、誰かが作ったコンポーネントやクラスを使わせてもらうかということになるでしょう。例えば、Tatsuo Babaさんの「BASP21 DLL」を使わせていただくのも有効な方法の一つです。

自分でコードを書くということになると、ソケットを使用することになります。ソケットを使ってSMTPでメールを送信するサンプルは、「SMTP認証でメールを送信する」で示しますので、そちらをご覧ください。

  • 履歴:
  • 2007/1/22 「.NET Framework 2.0以降で、SmtpClientクラスを使う方法」を追加。
  • 2013/6/24 SmtpClient.Disposeを呼び出すようにしたなど。

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

  • このサイトで紹介されているコードの多くは、例外処理が省略されています。例外処理については、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。