注意:ここで紹介しているコードを実際に使用する場合は、SMTPサーバー、送信者、送信先などを必ず変更してください。
ここでは、SMTP認証でユーザー名とパスワードを指定してメールを送信する方法を紹介します。
注意:SmtpClientクラスは、.NET Framework 2.0以降でしか使用できません。また、ここではSmtpClientクラスについて詳しくは説明しませんので、まずは「SmtpClientクラスを使ってメールを送信する」をご覧ください。
SmtpClientクラスでは、Credentialsプロパティを使うことにより、ユーザー名とパスワードを指定してメールを送信することができます。対応している認証方法は、AUTH LOGINだけのようです。
'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()
//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を返し、認証に失敗することがあるようです。
.NET Framework 1.1からは、MailMessageクラスのFieldsプロパティを使用することにより、System.Web.Mail.SmtpMailクラスでもSMTP認証によるメールの送信ができます。この方法は「The Code Project - SMTP Authentication using System.Web.Mail (CDOSYS)」で紹介されています。
なおSmtpMailクラスを使ってメールを送信する基本的な方法は、「SMTPでメールを送信する」をご覧ください。
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)
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を使って直接SMPTサーバーとやり取りをしてメールを送信する方法を、「Socketを使ってSMTPでメールを送信する」で紹介しています。そこでは、AUTH PLAIN、AUTH LOGIN、CRAM-MD5での認証にも対応した例を紹介しています。
(この記事は、「.NETプログラミング研究 第52号」で紹介したものを基にしています。)