diff --git a/Directory.Version.props b/Directory.Version.props index 03e01be..2d2c7c1 100644 --- a/Directory.Version.props +++ b/Directory.Version.props @@ -1,5 +1,5 @@ - 4.1.0 + 4.1.1 diff --git a/artifacts/Serilog.Sinks.Email.4.1.1-dev-local.snupkg b/artifacts/Serilog.Sinks.Email.4.1.1-dev-local.snupkg new file mode 100644 index 0000000..ffb1ed5 Binary files /dev/null and b/artifacts/Serilog.Sinks.Email.4.1.1-dev-local.snupkg differ diff --git a/src/Serilog.Sinks.Email/LoggerConfigurationEmailExtensions.cs b/src/Serilog.Sinks.Email/LoggerConfigurationEmailExtensions.cs index a2ec0ef..bd28bc7 100644 --- a/src/Serilog.Sinks.Email/LoggerConfigurationEmailExtensions.cs +++ b/src/Serilog.Sinks.Email/LoggerConfigurationEmailExtensions.cs @@ -54,6 +54,7 @@ public static class LoggerConfigurationEmailExtensions /// events passed through the sink. Ignored when is specified. /// A switch allowing the pass-through minimum level /// to be changed at runtime. + /// A string specifying the LocalDomain value for MailKit to use, if provided /// /// Logger configuration, allowing configuration to continue. /// @@ -70,7 +71,8 @@ public static LoggerConfiguration Email( string? body = null, IFormatProvider? formatProvider = null, LogEventLevel restrictedToMinimumLevel = LevelAlias.Minimum, - LoggingLevelSwitch? levelSwitch = null) + LoggingLevelSwitch? levelSwitch = null, + string? localDomain = null) { if (loggerConfiguration == null) throw new ArgumentNullException(nameof(loggerConfiguration)); if (from == null) throw new ArgumentNullException(nameof(from)); @@ -86,6 +88,7 @@ public static LoggerConfiguration Email( ConnectionSecurity = connectionSecurity, Credentials = credentials, IsBodyHtml = false, // `MessageTemplateTextFormatter` cannot emit valid HTML; the `EmailSinkOptions` overload must be used for this. + LocalDomain = localDomain, }; if (subject != null) diff --git a/src/Serilog.Sinks.Email/Sinks/Email/EmailSinkOptions.cs b/src/Serilog.Sinks.Email/Sinks/Email/EmailSinkOptions.cs index ecef8a3..a4f24e7 100644 --- a/src/Serilog.Sinks.Email/Sinks/Email/EmailSinkOptions.cs +++ b/src/Serilog.Sinks.Email/Sinks/Email/EmailSinkOptions.cs @@ -97,4 +97,10 @@ public EmailSinkOptions() /// Provides a method that validates server certificates. /// public System.Net.Security.RemoteCertificateValidationCallback? ServerCertificateValidationCallback { get; set; } + + /// + /// Provides a LocalDomain setting for MailKit in case a custom HELO needs to be used + /// + /// + public string? LocalDomain {get; set;} = null; } diff --git a/src/Serilog.Sinks.Email/Sinks/Email/MailKitEmailTransport.cs b/src/Serilog.Sinks.Email/Sinks/Email/MailKitEmailTransport.cs index b625fce..ee2bdbc 100644 --- a/src/Serilog.Sinks.Email/Sinks/Email/MailKitEmailTransport.cs +++ b/src/Serilog.Sinks.Email/Sinks/Email/MailKitEmailTransport.cs @@ -48,6 +48,11 @@ SmtpClient OpenConnectedSmtpClient() smtpClient.ServerCertificateValidationCallback += options.ServerCertificateValidationCallback; } + if (!string.IsNullOrWhiteSpace(options.LocalDomain)) + { + smtpClient.LocalDomain = options.LocalDomain; + } + smtpClient.Connect(options.Host, options.Port, options.ConnectionSecurity); if (options.Credentials != null) diff --git a/test/Serilog.Sinks.Email.Tests/EmailSinkTests.cs b/test/Serilog.Sinks.Email.Tests/EmailSinkTests.cs index 184ce0d..94f894f 100644 --- a/test/Serilog.Sinks.Email.Tests/EmailSinkTests.cs +++ b/test/Serilog.Sinks.Email.Tests/EmailSinkTests.cs @@ -152,9 +152,11 @@ public void WorksWithIBatchTextFormatter() var sink = new EmailSink(emailConnectionInfo, emailTransport); using (var emailLogger = new LoggerConfiguration() - .WriteTo.Sink(sink, new BatchingOptions()) + .WriteTo.Sink(sink, new BatchingOptions() { EagerlyEmitFirstEvent = false }) .CreateLogger()) { + // The EagerlyEmitFirstEvent may occur fast enough that we get multiple sends (linux, especially), + // set it false emailLogger.Information("Information"); emailLogger.Warning("Warning"); emailLogger.Error("");