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("");