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

SMTP認証でメールを送信する

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

ここでは、SMTP認証でユーザー名とパスワードを指定してメールを送信する方法を紹介します。

SmtpClientクラスを使用する方法

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

SmtpClientクラスでは、Credentialsプロパティを使うことにより、ユーザー名とパスワードを指定してメールを送信することができます。対応している認証方法は、AUTH LOGINだけのようです。

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"
sc.Port = 25
sc.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network
'ユーザー名とパスワードを設定する
sc.Credentials = New System.Net.NetworkCredential("user", "pass")
'メッセージを送信する
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";
sc.Port = 25;
sc.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network;
//ユーザー名とパスワードを設定する
sc.Credentials = new System.Net.NetworkCredential("user", "pass");
//メッセージを送信する
sc.Send(msg);

//後始末
msg.Dispose();
//後始末(.NET Framework 4.0以降)
sc.Dispose();
注意:上記のようにユーザー名とパスワードを自分で設定するのであれば、SmtpClient.UseDefaultCredentialsプロパティに値を設定すべきではありません。UseDefaultCredentialsプロパティをTrueにすると、CredentialsプロパティにCredentialCache.DefaultNetworkCredentialsが設定されます。UseDefaultCredentialsプロパティをFalseにすると、Credentialsプロパティがnullになります。このように、UseDefaultCredentialsプロパティに値を設定すると、Credentialsプロパティの設定が変わってしまいます。ユーザー名とパスワードを自分で設定し、さらに、どうしてもUseDefaultCredentialsプロパティをFalseにしたい(全く無意味ですが)のであれば、UseDefaultCredentialsプロパティをFalseにした後でCredentialsプロパティを設定しなければなりません。
補足:古いバージョンの.NET Frameworkでは、Credentialsプロパティを設定してEnableSslプロパティをtrueにすると失敗するという報告や、Timeoutプロパティを設定しないと失敗するという報告もありましたが、事実かは未確認です。
補足:ユーザー名とパスワードのデフォルト値をアプリケーション構成ファイルに記述しておくこともできます。詳しくは、こちらをご覧ください。
補足:この方法では認証を行なう時、「AUTH login (ユーザー名)」というデータを送信するようなので、SMTPサーバーによっては504を返し、認証に失敗することがあるようです。

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

.NET Framework 1.1からは、MailMessageクラスのFieldsプロパティを使用することにより、System.Web.Mail.SmtpMailクラスでもSMTP認証によるメールの送信ができます。この方法は「The Code Project - SMTP Authentication using System.Web.Mail (CDOSYS)」で紹介されています。

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

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 = "これはテストです。"

'smtpauthenticateを使う時は必ず2にする
mail.Fields.Item( _
    "http://schemas.microsoft.com/cdo/configuration/sendusing") _
    = 2
'sendusingを2にした時は、必ずサーバーとポートを指定する
'SMTPサーバーを指定
mail.Fields.Item( _
    "http://schemas.microsoft.com/cdo/configuration/smtpserver") _
    = "xxx.xxx.xxx"
'ポート番号を指定する
mail.Fields.Item( _
    "http://schemas.microsoft.com/cdo/configuration/smtpserverport") _
    = 25

'認証を使う
'1はbasic認証、2はNTLM認証
mail.Fields.Item( _
    "http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
'ユーザー名
mail.Fields.Item( _
    "http://schemas.microsoft.com/cdo/configuration/sendusername") _
    = "xxx"
'パスワード
mail.Fields.Item( _
    "http://schemas.microsoft.com/cdo/configuration/sendpassword") _
    = "xxx"

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 = "これはテストです。";

//smtpauthenticateを使う時は必ず2にする
mail.Fields[
    "http://schemas.microsoft.com/cdo/configuration/sendusing"]
    = 2;
//sendusingを2にした時は、必ずサーバーとポートを指定する
//SMTPサーバーを指定
mail.Fields[
    "http://schemas.microsoft.com/cdo/configuration/smtpserver"]
    = "xxx.xxx.xxx";
//ポート番号を指定する
mail.Fields[
    "http://schemas.microsoft.com/cdo/configuration/smtpserverport"]
    = 25;

//認証を使う
//1はbasic認証、2はNTLM認証
mail.Fields[
    "http://schemas.microsoft.com/cdo/configuration/smtpauthenticate"]
    = 1;
//ユーザー名
mail.Fields[
    "http://schemas.microsoft.com/cdo/configuration/sendusername"]
    = "xxx";
//パスワード
mail.Fields[
    "http://schemas.microsoft.com/cdo/configuration/sendpassword"]
    = "xxx";

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

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

CDOを使えない環境では、この方法は無理です。その場合は、自分でコードを書くか、誰かが作ったコンポーネントやクラスを使わせてもらうかということになるでしょう。

Socketを使ってSMTPでメールを送る方法

Socketを使って直接SMPTサーバーとやり取りをしてメールを送信する方法を、「Socketを使ってSMTPでメールを送信する」で紹介しています。そこでは、AUTH PLAIN、AUTH LOGIN、CRAM-MD5での認証にも対応した例を紹介しています。

  • 履歴:
  • 2007/1/22 「.NET Framework 2.0以降で、SmtpClientクラスを使用する方法」を追加。
  • 2007/3/12 「MailMessage.Fieldsプロパティを使う方法」でSMTPサーバーを指定するFields.Item名が間違えていたのを修正。(arieさんからご指摘をいただきました。)
  • 2011/3/1 NetworkStream.Closeを呼び出すように修正。
  • 2013/6/27 SmtpClientクラスの説明を最新のバージョンに合わせて変更、補足。「Socketを使ってSMTPでメールを送る方法」を別のページに移動。

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

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