diff --git a/src/Serilog.Sinks.Email/Sinks/Email/EmailSinkOptions.cs b/src/Serilog.Sinks.Email/Sinks/Email/EmailSinkOptions.cs index ecef8a3..c91bc85 100644 --- a/src/Serilog.Sinks.Email/Sinks/Email/EmailSinkOptions.cs +++ b/src/Serilog.Sinks.Email/Sinks/Email/EmailSinkOptions.cs @@ -11,9 +11,6 @@ // See the License for the specific language governing permissions and // limitations under the License. -using System; -using System.Collections.Generic; -using System.ComponentModel; using System.Net; using MailKit.Security; using Serilog.Formatting; @@ -63,7 +60,7 @@ public EmailSinkOptions() public int Port { get; set; } = DefaultPort; /// - /// Gets or sets the credentials used for authentication. + /// Gets or sets the credentials used for authentication. See also for OAuth2 credentials. /// public ICredentialsByHost? Credentials { get; set; } @@ -97,4 +94,11 @@ public EmailSinkOptions() /// Provides a method that validates server certificates. /// public System.Net.Security.RemoteCertificateValidationCallback? ServerCertificateValidationCallback { get; set; } + + /// + /// A for performing OAuth2 authentication against services such as + /// Microsoft 365. See these instructions + /// for how to create this object. + /// + public SaslMechanism? SaslMechanism { get; set; } } diff --git a/src/Serilog.Sinks.Email/Sinks/Email/MailKitEmailTransport.cs b/src/Serilog.Sinks.Email/Sinks/Email/MailKitEmailTransport.cs index b625fce..4094b9f 100644 --- a/src/Serilog.Sinks.Email/Sinks/Email/MailKitEmailTransport.cs +++ b/src/Serilog.Sinks.Email/Sinks/Email/MailKitEmailTransport.cs @@ -32,12 +32,12 @@ public async Task SendMailAsync(EmailMessage emailMessage) ? new BodyBuilder { HtmlBody = emailMessage.Body }.ToMessageBody() : new BodyBuilder { TextBody = emailMessage.Body }.ToMessageBody(); - using var smtpClient = OpenConnectedSmtpClient(); + using var smtpClient = await OpenConnectedSmtpClientAsync(); await smtpClient.SendAsync(mimeMessage); await smtpClient.DisconnectAsync(quit: true); } - SmtpClient OpenConnectedSmtpClient() + async Task OpenConnectedSmtpClientAsync() { var smtpClient = new SmtpClient(); @@ -48,15 +48,20 @@ SmtpClient OpenConnectedSmtpClient() smtpClient.ServerCertificateValidationCallback += options.ServerCertificateValidationCallback; } - smtpClient.Connect(options.Host, options.Port, options.ConnectionSecurity); + await smtpClient.ConnectAsync(options.Host, options.Port, options.ConnectionSecurity); - if (options.Credentials != null) + if (options.SaslMechanism != null) { - smtpClient.Authenticate( + await smtpClient.AuthenticateAsync(options.SaslMechanism); + } + else if (options.Credentials != null) + { + await smtpClient.AuthenticateAsync( Encoding.UTF8, options.Credentials.GetCredential( options.Host, options.Port, "smtp")); } + return smtpClient; }