protected virtual void SendEmail()

in src/log4net/Appender/SmtpAppender.cs [444:585]


		protected virtual void SendEmail(string messageBody)
		{
#if NET_2_0 || MONO_2_0 || NETSTANDARD2_0
			// .NET 2.0 has a new API for SMTP email System.Net.Mail
			// This API supports credentials and multiple hosts correctly.
			// The old API is deprecated.

			// Create and configure the smtp client
#if NET_4_0 || MONO_4_0 || NETSTANDARD2_0
			using SmtpClient smtpClient = new SmtpClient();
#else
			SmtpClient smtpClient = new SmtpClient();
#endif
			if (!String.IsNullOrEmpty(m_smtpHost))
			{
				smtpClient.Host = m_smtpHost;
			}
			smtpClient.Port = m_port;
			smtpClient.DeliveryMethod = SmtpDeliveryMethod.Network;
			smtpClient.EnableSsl = m_enableSsl;

			if (m_authentication == SmtpAuthentication.Basic)
			{
				// Perform basic authentication
				smtpClient.Credentials = new System.Net.NetworkCredential(m_username, m_password);
			}
			else if (m_authentication == SmtpAuthentication.Ntlm)
			{
				// Perform integrated authentication (NTLM)
				smtpClient.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials;
			}

			using (MailMessage mailMessage = new MailMessage())
			{
				mailMessage.Body = messageBody;
				mailMessage.BodyEncoding = m_bodyEncoding;
				mailMessage.From = new MailAddress(m_from);
				mailMessage.To.Add(m_to);
				if (!String.IsNullOrEmpty(m_cc))
				{
					mailMessage.CC.Add(m_cc);
				}
				if (!String.IsNullOrEmpty(m_bcc))
				{
					mailMessage.Bcc.Add(m_bcc);
				}
				if (!String.IsNullOrEmpty(m_replyTo))
				{
					// .NET 4.0 warning CS0618: 'System.Net.Mail.MailMessage.ReplyTo' is obsolete:
					// 'ReplyTo is obsoleted for this type.  Please use ReplyToList instead which can accept multiple addresses. http://go.microsoft.com/fwlink/?linkid=14202'
#if !NET_4_0 && !MONO_4_0 && !NETSTANDARD2_0
					mailMessage.ReplyTo = new MailAddress(m_replyTo);
#else
					mailMessage.ReplyToList.Add(new MailAddress(m_replyTo));
#endif
				}
				mailMessage.Subject = m_subject;
				mailMessage.SubjectEncoding = m_subjectEncoding;
				mailMessage.Priority = m_mailPriority;

				// TODO: Consider using SendAsync to send the message without blocking. This would be a change in
				// behaviour compared to .NET 1.x. We would need a SendCompletedCallback to log errors.
				smtpClient.Send(mailMessage);
			}
#else
				// .NET 1.x uses the System.Web.Mail API for sending Mail

				MailMessage mailMessage = new MailMessage();
				mailMessage.Body = messageBody;
				mailMessage.BodyEncoding = m_bodyEncoding;
				mailMessage.From = m_from;
				mailMessage.To = m_to;
				if (m_cc != null && m_cc.Length > 0)
				{
					mailMessage.Cc = m_cc;
				}
				if (m_bcc != null && m_bcc.Length > 0)
				{
					mailMessage.Bcc = m_bcc;
				}
				mailMessage.Subject = m_subject;
#if !MONO && !NET_1_0 && !NET_1_1 && !CLI_1_0
				mailMessage.SubjectEncoding = m_subjectEncoding;
#endif
				mailMessage.Priority = m_mailPriority;

#if NET_1_1
				// The Fields property on the MailMessage allows the CDO properties to be set directly.
				// This property is only available on .NET Framework 1.1 and the implementation must understand
				// the CDO properties. For details of the fields available in CDO see:
				//
				// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cdosys/html/_cdosys_configuration_coclass.asp
				// 

				try
				{
					if (m_authentication == SmtpAuthentication.Basic)
					{
						// Perform basic authentication
						mailMessage.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate", 1);
						mailMessage.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendusername", m_username);
						mailMessage.Fields.Add("http://schemas.microsoft.com/cdo/configuration/sendpassword", m_password);
					}
					else if (m_authentication == SmtpAuthentication.Ntlm)
					{
						// Perform integrated authentication (NTLM)
						mailMessage.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate", 2);
					}

					// Set the port if not the default value
					if (m_port != 25) 
					{
						mailMessage.Fields.Add("http://schemas.microsoft.com/cdo/configuration/smtpserverport", m_port);
					}
				}
				catch(MissingMethodException missingMethodException)
				{
					// If we were compiled against .NET 1.1 but are running against .NET 1.0 then
					// we will get a MissingMethodException when accessing the MailMessage.Fields property.

					ErrorHandler.Error("SmtpAppender: Authentication and server Port are only supported when running on the MS .NET 1.1 framework", missingMethodException);
				}
#else
				if (m_authentication != SmtpAuthentication.None)
				{
					ErrorHandler.Error("SmtpAppender: Authentication is only supported on the MS .NET 1.1 or MS .NET 2.0 builds of log4net");
				}

				if (m_port != 25)
				{
					ErrorHandler.Error("SmtpAppender: Server Port is only supported on the MS .NET 1.1 or MS .NET 2.0 builds of log4net");
				}
#endif // if NET_1_1

				if (m_smtpHost != null && m_smtpHost.Length > 0)
				{
					SmtpMail.SmtpServer = m_smtpHost;
				}

				SmtpMail.Send(mailMessage);
#endif // if NET_2_0
		}