diff --git a/src/Senders/FluentEmail.MailKit/MailKitSender.cs b/src/Senders/FluentEmail.MailKit/MailKitSender.cs index 8a5d1413..f1ab2a2e 100644 --- a/src/Senders/FluentEmail.MailKit/MailKitSender.cs +++ b/src/Senders/FluentEmail.MailKit/MailKitSender.cs @@ -181,11 +181,13 @@ private async Task SaveToPickupDirectory(MimeMessage message, string pickupDirec } /// - /// Create a MimMessage so MailKit can send it + /// Create a MimeMessage so MailKit can send it. + /// Virtual so subclasses can preprocess the message before sending + /// (e.g. DKIM-sign it) — see https://github.com/lukencode/FluentEmail/issues/388 /// /// The mail message. /// Email data. - private MimeMessage CreateMailMessage(IFluentEmail email) + protected virtual MimeMessage CreateMailMessage(IFluentEmail email) { var data = email.Data; diff --git a/test/FluentEmail.Core.Tests/MailKitSmtpSenderTests.cs b/test/FluentEmail.Core.Tests/MailKitSmtpSenderTests.cs index 7b80921b..2b8f066e 100644 --- a/test/FluentEmail.Core.Tests/MailKitSmtpSenderTests.cs +++ b/test/FluentEmail.Core.Tests/MailKitSmtpSenderTests.cs @@ -1,7 +1,10 @@ using System.IO; +using System.Linq; using System.Threading.Tasks; using FluentEmail.Core; +using FluentEmail.Core.Interfaces; using FluentEmail.MailKitSmtp; +using MimeKit; using NUnit.Framework; using Attachment = FluentEmail.Core.Models.Attachment; @@ -119,5 +122,50 @@ public void CanSendHtmlAndPlaintextTogether() Assert.IsTrue(response.Successful); } + + [Test] + public void CanPreprocessMessageByOverridingCreateMailMessage() + { + var sender = new PreprocessingMailKitSender(new SmtpClientOptions + { + Server = "localhost", + Port = 25, + UseSsl = false, + RequiresAuthentication = false, + UsePickupDirectory = true, + MailPickupDirectory = tempDirectory + }); + Email.DefaultSender = sender; + + var email = Email + .From(fromEmail) + .To(toEmail) + .Subject(subject) + .Body(body); + + var response = email.Send(); + + Assert.IsTrue(response.Successful); + var eml = Directory.EnumerateFiles(tempDirectory, "*.eml").First(); + var content = File.ReadAllText(eml); + Assert.IsTrue(content.Contains("X-Preprocessed: yes"), + "Override of CreateMailMessage should be able to modify the message before sending."); + } + + /// + /// Simulates e.g. DKIM-signing: preprocess the MimeMessage after creation. + /// Possible since CreateMailMessage is protected virtual (issue #388). + /// + private class PreprocessingMailKitSender : MailKitSender + { + public PreprocessingMailKitSender(SmtpClientOptions options) : base(options) { } + + protected override MimeMessage CreateMailMessage(IFluentEmail email) + { + var message = base.CreateMailMessage(email); + message.Headers.Add("X-Preprocessed", "yes"); + return message; + } + } } }