C#

System.Net.Mail.SmtpClient.EnableSsl

EnableSslをtrueにするとメールヘッダがエラーになりSMTPサーバと通信するところまで行かない。おかしいなと思い、あれこれ試してみたところ、どうやら順番がまずかったようだ。

    using (System.Net.Mail.MailMessage MailMessage = new System.Net.Mail.MailMessage())
    {
	    MailMessage.From = new System.Net.Mail.MailAddress("sender-mail-address");
	    MailMessage.To.Add("receiver-mail-address");
	    MailMessage.Subject = "TEST MAIL";
	    MailMessage.Body = "This is a test mail.";

	    System.Net.Mail.SmtpClient SmtpClient = new System.Net.Mail.SmtpClient();
	    SmtpClient.Host = "smtp-server";
	    SmtpClient.Port = 587;
	    SmtpClient.Credentials = new System.Net.NetworkCredential("user-name", "password");
	    SmtpClient.EnableSsl = true;
	    SmtpClient.Send(MailMessage); // <--- Error
    }

CredentialsはEnableSslのあとにしないとだめらしい。

    using (System.Net.Mail.MailMessage MailMessage = new System.Net.Mail.MailMessage())
    {
	    MailMessage.From = new System.Net.Mail.MailAddress("sender-mail-address");
	    MailMessage.To.Add("receiver-mail-address");
	    MailMessage.Subject = "TEST MAIL";
	    MailMessage.Body = "This is a test mail.";

	    System.Net.Mail.SmtpClient SmtpClient = new System.Net.Mail.SmtpClient();
	    SmtpClient.Host = "smtp-server";
	    SmtpClient.Port = 587;
	    SmtpClient.EnableSsl = true;
	    SmtpClient.Credentials = new System.Net.NetworkCredential("user-name", "password");
	    SmtpClient.Send(MailMessage); // <-- OK
    }

SMTPサーバの設定がWeb.configに保存してあるなら、奇妙なコードを書くこともできる。

    using (System.Net.Mail.MailMessage MailMessage = new System.Net.Mail.MailMessage())
    {
	    MailMessage.To.Add("receiver-mail-address");
	    MailMessage.Subject = "TEST MAIL";
	    MailMessage.Body = "This is a test mail.";

	    System.Net.Mail.SmtpClient SmtpClient = new System.Net.Mail.SmtpClient();
	    SmtpClient.EnableSsl = true;
	    SmtpClient.Credentials = SmtpClient.Credentials; // <--- ???
	    SmtpClient.Send(MailMessage); // <-- OK
    }

残念なことにWeb.configのSMTPサーバの設定にはEnableSslを保存できない。できるようにしてくれると嬉しいのだけど。

※2016/03/05現在、このエラーが発生しなくなったことを確認しました。「SmtpClient.EnableSsl = true;」のあとに、「SmtpClient.Credentials = SmtpClient.Credentials;」のような奇妙なコードを書く必要はなくなっています。

(2016/03/05 更新)