Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 11 additions & 1 deletion src/NLog.MailKit/MailTarget.cs
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ namespace NLog.MailKit
[Target("MailKit")]
public class MailTarget : TargetWithLayoutHeaderAndFooter
{
private readonly Action<MimeMessage, LogEventInfo> _mailSender;
private static readonly Encoding DefaultEncoding = System.Text.Encoding.UTF8;
private const SecureSocketOptions DefaultSecureSocketOption = SecureSocketOptions.StartTlsWhenAvailable;

Expand All @@ -95,6 +96,7 @@ public class MailTarget : TargetWithLayoutHeaderAndFooter
/// The default value of the Body-Layout is: <code>${message}${newline}</code>
/// </remarks>
public MailTarget()
:this(default(Action<MimeMessage, LogEventInfo>?))
{
Body = "${message}${newline}";
}
Expand All @@ -111,6 +113,14 @@ public MailTarget(string name) : this()
Name = name;
}

/// <summary>
/// Initializes a new instance of the <see cref="MailTarget" /> class.
/// </summary>
internal MailTarget(Action<MimeMessage, LogEventInfo>? mailSender)
{
_mailSender = mailSender ?? SendMailMessage;
}

/// <summary>
/// Gets or sets sender's email address (e.g. joe@domain.com).
/// </summary>
Expand Down Expand Up @@ -358,7 +368,7 @@ private void ProcessSingleMailMessage(IEnumerable<AsyncLogEventInfo> events)
}
else
{
SendMailMessage(message, lastEvent);
_mailSender(message, lastEvent);
}

foreach (var ev in events)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,56 +39,6 @@ public void SendMailWihAuthentication()
}, 1);
}

[Fact]
public void SendMailWithCC()
{
var transactions = SendTest(port =>
{
var mailTarget = CreateNLogConfig(port);
mailTarget.Cc = "no reply <do_not_reply@domain.com>";
}, 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()
Expand Down
146 changes: 145 additions & 1 deletion test/NLog.MailKit.Tests/UnitTests/MailTargetTests.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using System;
using System.Linq;
using MimeKit;
using Xunit;

Expand Down Expand Up @@ -31,7 +32,6 @@ public void ParseMessagePriorityTests(string input, MessagePriority expected)
Assert.Equal(expected, result);
}


[Fact]
public void MailTarget_WithEmptyTo_ThrowsConfigException()
{
Expand Down Expand Up @@ -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<MimeMessage, LogEventInfo> 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<TextPart>(sentMessage.Body);
Assert.Equal(MimeKit.Text.TextFormat.Html, textPart.Format);
if (replaceNewLine)
{
Assert.Contains("<br/>", textPart.Text);
Assert.DoesNotContain("\n", textPart.Text);
}
else
{
Assert.DoesNotContain("<br/>", textPart.Text);
Assert.Contains("\n", textPart.Text);
}
}

[Fact]
public void SendMailWithCC()
{
// Arrange
MimeMessage sentMessage = null;
Action<MimeMessage, LogEventInfo> mailSender = (message, logEvent) => { sentMessage = message; };

var target = new MailTarget(mailSender)
{
From = "hi@unittest.com",
To = "mock@mock.com",
Cc = "no reply <do_not_reply@domain.com>",
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<MimeMessage, LogEventInfo> 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<MimeMessage, LogEventInfo> 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<MimeMessage, LogEventInfo> 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"]);
}
}
}
Loading