diff --git a/src/NLog.MailKit/MailTarget.cs b/src/NLog.MailKit/MailTarget.cs index 53e283b..43eee0d 100644 --- a/src/NLog.MailKit/MailTarget.cs +++ b/src/NLog.MailKit/MailTarget.cs @@ -83,6 +83,7 @@ namespace NLog.MailKit [Target("MailKit")] public class MailTarget : TargetWithLayoutHeaderAndFooter { + private readonly Action _mailSender; private static readonly Encoding DefaultEncoding = System.Text.Encoding.UTF8; private const SecureSocketOptions DefaultSecureSocketOption = SecureSocketOptions.StartTlsWhenAvailable; @@ -95,6 +96,7 @@ public class MailTarget : TargetWithLayoutHeaderAndFooter /// The default value of the Body-Layout is: ${message}${newline} /// public MailTarget() + :this(default(Action?)) { Body = "${message}${newline}"; } @@ -111,6 +113,14 @@ public MailTarget(string name) : this() Name = name; } + /// + /// Initializes a new instance of the class. + /// + internal MailTarget(Action? mailSender) + { + _mailSender = mailSender ?? SendMailMessage; + } + /// /// Gets or sets sender's email address (e.g. joe@domain.com). /// @@ -358,7 +368,7 @@ private void ProcessSingleMailMessage(IEnumerable events) } else { - SendMailMessage(message, lastEvent); + _mailSender(message, lastEvent); } foreach (var ev in events) diff --git a/test/NLog.MailKit.Tests/IntegrationTests/MailTargetIntegrationTests.cs b/test/NLog.MailKit.Tests/IntegrationTests/MailTargetIntegrationTests.cs index 4aaa45d..360bf1a 100644 --- a/test/NLog.MailKit.Tests/IntegrationTests/MailTargetIntegrationTests.cs +++ b/test/NLog.MailKit.Tests/IntegrationTests/MailTargetIntegrationTests.cs @@ -39,56 +39,6 @@ public void SendMailWihAuthentication() }, 1); } - [Fact] - public void SendMailWithCC() - { - var transactions = SendTest(port => - { - var mailTarget = CreateNLogConfig(port); - mailTarget.Cc = "no reply "; - }, 2); - - // 2nd is cc - AssertMailBox("do_not_reply@domain.com", transactions[0].To[1]); - } - - [Fact] - public void SendMailWithPriority() - { - SendTest(port => - { - var mailTarget = CreateNLogConfig(port); - mailTarget.Priority = MimeKit.MessagePriority.Urgent.ToString(); - }, 1); - } - - [Fact] - public void SendMailWithHeader() - { - SendTest(port => - { - var mailTarget = CreateNLogConfig(port); - mailTarget.MailHeaders.Add(new Targets.MethodCallParameter("FooHeader", "")); - }, 1); - } - - [Fact] - public void SendMailWithHeaderFooter() - { - var transactions = SendTest(port => - { - var mailTarget = CreateNLogConfig(port); - mailTarget.Header = " *** Begin *** "; - mailTarget.Footer = " *** End *** "; - }, 1); - - var receivedMessage = transactions.LastOrDefault(); - Assert.NotNull(receivedMessage); - var mailBody = receivedMessage.GetBodyAsString(); - Assert.NotNull(mailBody); - Assert.Contains("*** Begin ***", mailBody); - Assert.Contains("*** End ***", mailBody); - } [Fact] public void SendMailWitPickupFolder() diff --git a/test/NLog.MailKit.Tests/UnitTests/MailTargetTests.cs b/test/NLog.MailKit.Tests/UnitTests/MailTargetTests.cs index c1c9cf5..3610f47 100644 --- a/test/NLog.MailKit.Tests/UnitTests/MailTargetTests.cs +++ b/test/NLog.MailKit.Tests/UnitTests/MailTargetTests.cs @@ -1,4 +1,5 @@ using System; +using System.Linq; using MimeKit; using Xunit; @@ -31,7 +32,6 @@ public void ParseMessagePriorityTests(string input, MessagePriority expected) Assert.Equal(expected, result); } - [Fact] public void MailTarget_WithEmptyTo_ThrowsConfigException() { @@ -209,5 +209,149 @@ public void MailTargetInitialize_WithSmtpAuthenticationModeOAuth2_ThrowsConfigEx }) ); } + + [Theory] + [InlineData("Line 1\r\nLine 2", true)] + [InlineData("Line 1\r\nLine 2", false)] + [InlineData("Line 1\nLine 2", true)] + [InlineData("Line 1\nLine 2", false)] + [InlineData("Line 1\r\nLine 2\nLine 3", true)] + [InlineData("Line 1\r\nLine 2\nLine 3", false)] + public void MailTarget_ReplaceNewlineWithBrTagInHtml_ReplacesAllNewlineFormats(string body, bool replaceNewLine) + { + // Arrange + MimeMessage sentMessage = null; + Action mailSender = (message, logEvent) => { sentMessage = message; }; + var target = new MailTarget(mailSender) + { + From = "foo@bar.com", + To = "bar@bar.com", + Subject = "Test", + SmtpServer = "does-not-matter", + Body = "${message}", + Html = true, + ReplaceNewlineWithBrTagInHtml = replaceNewLine, + }; + + // Act + using var logFactory = new LogFactory().Setup().LoadConfiguration(cfg => + { + cfg.Configuration.AddRuleForAllLevels(target); + }).LogFactory; + var logger = logFactory.GetLogger("logger1"); + logger.Info(body); + + // Assert + Assert.NotNull(sentMessage); + var textPart = Assert.IsType(sentMessage.Body); + Assert.Equal(MimeKit.Text.TextFormat.Html, textPart.Format); + if (replaceNewLine) + { + Assert.Contains("
", textPart.Text); + Assert.DoesNotContain("\n", textPart.Text); + } + else + { + Assert.DoesNotContain("
", textPart.Text); + Assert.Contains("\n", textPart.Text); + } + } + + [Fact] + public void SendMailWithCC() + { + // Arrange + MimeMessage sentMessage = null; + Action mailSender = (message, logEvent) => { sentMessage = message; }; + + var target = new MailTarget(mailSender) + { + From = "hi@unittest.com", + To = "mock@mock.com", + Cc = "no reply ", + Subject = "Test", + SmtpServer = "does-not-matter", + }; + using var logFactory = new LogFactory().Setup().LoadConfiguration(cfg => { cfg.Configuration.AddRuleForAllLevels(target); }).LogFactory; + // Act + logFactory.GetLogger("logger1").Info("hello first mail!"); + // Assert + Assert.NotNull(sentMessage); + Assert.Single(sentMessage.To); + Assert.Single(sentMessage.Cc); + Assert.Equal("mock@mock.com", sentMessage.To.Mailboxes.Single().Address); + Assert.Equal("do_not_reply@domain.com", sentMessage.Cc.Mailboxes.Single().Address); + } + + [Fact] + public void SendMailWithPriority() + { + // Arrange + MimeMessage sentMessage = null; + Action mailSender = (message, logEvent) => { sentMessage = message; }; + var target = new MailTarget(mailSender) + { + From = "hi@unittest.com", + To = "mock@mock.com", + Priority = MimeKit.MessagePriority.Urgent.ToString(), + Subject = "Test", + SmtpServer = "does-not-matter", + }; + using var logFactory = new LogFactory().Setup().LoadConfiguration(cfg => { cfg.Configuration.AddRuleForAllLevels(target); }).LogFactory; + // Act + logFactory.GetLogger("logger1").Info("hello first mail!"); + // Assert + Assert.NotNull(sentMessage); + Assert.Equal(MimeKit.MessagePriority.Urgent, sentMessage.Priority); + } + + [Fact] + public void SendMailWithHeaderFooter() + { + // Arrange + MimeMessage sentMessage = null; + Action mailSender = (message, logEvent) => { sentMessage = message; }; + var target = new MailTarget(mailSender) + { + From = "hi@unittest.com", + To = "mock@mock.com", + Subject = "Test", + Header = " *** Begin *** ", + Footer = " *** End *** ", + SmtpServer = "does-not-matter", + }; + using var logFactory = new LogFactory().Setup().LoadConfiguration(cfg => { cfg.Configuration.AddRuleForAllLevels(target); }).LogFactory; + // Act + logFactory.GetLogger("logger1").Info("hello first mail!"); + // Assert + Assert.NotNull(sentMessage); + var mailBody = sentMessage.Body.ToString(); + Assert.NotNull(mailBody); + Assert.Contains("*** Begin ***", mailBody); + Assert.Contains("hello first mail!", mailBody); + Assert.Contains("*** End ***", mailBody); + } + + [Fact] + public void SendMailWithHeaders() + { + // Arrange + MimeMessage sentMessage = null; + Action mailSender = (message, logEvent) => { sentMessage = message; }; + var target = new MailTarget(mailSender) + { + From = "hi@unittest.com", + To = "mock@mock.com", + Subject = "Test", + SmtpServer = "does-not-matter", + }; + target.MailHeaders.Add(new Targets.MethodCallParameter("FooHeader", "FooValue")); + using var logFactory = new LogFactory().Setup().LoadConfiguration(cfg => { cfg.Configuration.AddRuleForAllLevels(target); }).LogFactory; + // Act + logFactory.GetLogger("logger1").Info("hello first mail!"); + // Assert + Assert.NotNull(sentMessage); + Assert.Equal("FooValue", sentMessage.Headers["FooHeader"]); + } } }