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
2 changes: 1 addition & 1 deletion Src/MailMergeLib.Tests/Message_Html.cs
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,7 @@ public void HtmlMailMergeWithMoreEqualInlineAtt()

Assert.Multiple(() =>
{
Assert.That(new HtmlParser().ParseDocument((string) msg.HtmlBody).All.Count(m => m is IHtmlImageElement), Is.EqualTo(3));
Assert.That(new HtmlParser().ParseDocument(msg.HtmlBody!).All.Count(m => m is IHtmlImageElement), Is.EqualTo(3));
Assert.That(msg.BodyParts.Count(bp => bp.ContentDisposition?.Disposition == ContentDisposition.Inline && bp.ContentType.IsMimeType("image", "jpeg")), Is.EqualTo(1));
});

Expand Down
24 changes: 12 additions & 12 deletions Src/MailMergeLib.Tests/Message_Templates.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,25 +22,25 @@ public void Template()
Assert.That(msg.Subject, Is.EqualTo(mmm.Subject.Replace("{FirstName}", variables["FirstName"])));

// DefaultKey is "Formal"
Assert.That(msg.HtmlBody.Contains(mmm.Templates["Salutation"]["Formal"]
Assert.That(msg.HtmlBody!.Contains(mmm.Templates["Salutation"]["Formal"]
.First(t => t.Type == PartType.Html)
.Value.Replace("{FirstName}", variables["FirstName"])), Is.True);
Assert.That(msg.TextBody.Contains(mmm.Templates["Salutation"]["Formal"]
.Value!.Replace("{FirstName}", variables["FirstName"])), Is.True);
Assert.That(msg.TextBody!.Contains(mmm.Templates["Salutation"]["Formal"]
.First(t => t.Type == PartType.Plain)
.Value.Replace("{FirstName}", variables["FirstName"])), Is.True);
.Value!.Replace("{FirstName}", variables["FirstName"])), Is.True);
});

// Programmacically set the part to use
mmm.Templates[0].Key = "Dear";
msg = mmm.GetMimeMessage(variables);
Assert.Multiple(() =>
{
Assert.That(msg.HtmlBody.Contains(mmm.Templates["Salutation"]["Dear"]
Assert.That(msg.HtmlBody!.Contains(mmm.Templates["Salutation"]["Dear"]
.First(t => t.Type == PartType.Html)
.Value.Replace("{FirstName}", variables["FirstName"])), Is.True);
Assert.That(msg.TextBody.Contains(mmm.Templates["Salutation"]["Dear"]
.Value!.Replace("{FirstName}", variables["FirstName"])), Is.True);
Assert.That(msg.TextBody!.Contains(mmm.Templates["Salutation"]["Dear"]
.First(t => t.Type == PartType.Plain)
.Value.Replace("{FirstName}", variables["FirstName"])), Is.True);
.Value!.Replace("{FirstName}", variables["FirstName"])), Is.True);
});

// Neither DefaultKey nor Key of the template are set: gets the first part
Expand All @@ -55,12 +55,12 @@ public void Template()
msg = mmm.GetMimeMessage(variables);
Assert.Multiple(() =>
{
Assert.That(msg.HtmlBody.Contains(mmm.Templates["Salutation"]["Hi"]
Assert.That(msg.HtmlBody!.Contains(mmm.Templates["Salutation"]["Hi"]
.First(t => t.Type == PartType.Html)
.Value.Replace("{FirstName}", variables["FirstName"])), Is.True);
Assert.That(msg.TextBody.Contains(mmm.Templates["Salutation"]["Hi"]
.Value!.Replace("{FirstName}", variables["FirstName"])), Is.True);
Assert.That(msg.TextBody!.Contains(mmm.Templates["Salutation"]["Hi"]
.First(t => t.Type == PartType.Plain)
.Value.Replace("{FirstName}", variables["FirstName"])), Is.True);
.Value!.Replace("{FirstName}", variables["FirstName"])), Is.True);
});
}

Expand Down
26 changes: 13 additions & 13 deletions Src/MailMergeLib.Tests/Message_VariableExceptions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -114,25 +114,25 @@ public void Template()
Assert.That(msg.Subject, Is.EqualTo(mmm.Subject.Replace("{FirstName}", variables["FirstName"])));

// DefaultKey is "Formal"
Assert.That(msg.HtmlBody.Contains(mmm.Templates["Salutation"]["Formal"]
Assert.That(msg.HtmlBody!.Contains(mmm.Templates["Salutation"]["Formal"]
.First(t => t.Type == PartType.Html)
.Value.Replace("{FirstName}", variables["FirstName"])), Is.True);
Assert.That(msg.TextBody.Contains(mmm.Templates["Salutation"]["Formal"]
.Value!.Replace("{FirstName}", variables["FirstName"])), Is.True);
Assert.That(msg.TextBody!.Contains(mmm.Templates["Salutation"]["Formal"]
.First(t => t.Type == PartType.Plain)
.Value.Replace("{FirstName}", variables["FirstName"])), Is.True);
.Value!.Replace("{FirstName}", variables["FirstName"])), Is.True);
});

// Programmacically set the part to use
mmm.Templates[0].Key = "Dear";
msg = mmm.GetMimeMessage(variables);
Assert.Multiple(() =>
{
Assert.That(msg.HtmlBody.Contains(mmm.Templates["Salutation"]["Dear"]
Assert.That(msg.HtmlBody!.Contains(mmm.Templates["Salutation"]["Dear"]
.First(t => t.Type == PartType.Html)
.Value.Replace("{FirstName}", variables["FirstName"])), Is.True);
Assert.That(msg.TextBody.Contains(mmm.Templates["Salutation"]["Dear"]
.Value!.Replace("{FirstName}", variables["FirstName"])), Is.True);
Assert.That(msg.TextBody!.Contains(mmm.Templates["Salutation"]["Dear"]
.First(t => t.Type == PartType.Plain)
.Value.Replace("{FirstName}", variables["FirstName"])), Is.True);
.Value!.Replace("{FirstName}", variables["FirstName"])), Is.True);
});

// Neither DefaultKey nore Key of the template are set: gets the first part
Expand All @@ -147,12 +147,12 @@ public void Template()
msg = mmm.GetMimeMessage(variables);
Assert.Multiple(() =>
{
Assert.That(msg.HtmlBody.Contains(mmm.Templates["Salutation"]["Hi"]
Assert.That(msg.HtmlBody!.Contains(mmm.Templates["Salutation"]["Hi"]
.First(t => t.Type == PartType.Html)
.Value.Replace("{FirstName}", variables["FirstName"])), Is.True);
Assert.That(msg.TextBody.Contains(mmm.Templates["Salutation"]["Hi"]
.Value!.Replace("{FirstName}", variables["FirstName"])), Is.True);
Assert.That(msg.TextBody!.Contains(mmm.Templates["Salutation"]["Hi"]
.First(t => t.Type == PartType.Plain)
.Value.Replace("{FirstName}", variables["FirstName"])), Is.True);
.Value!.Replace("{FirstName}", variables["FirstName"])), Is.True);
});
}
}
}
14 changes: 7 additions & 7 deletions Src/MailMergeLib.Tests/Message_Variables.cs
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,7 @@ public void MessagesFromDataRows()
Assert.Multiple(() =>
{
Assert.That(mimeMessage.To.ToString().Contains(row["Email"].ToString()!), Is.True);
Assert.That(mimeMessage.TextBody.Contains(text
Assert.That(mimeMessage.TextBody!.Contains(text
.Replace("{Email}", row["Email"].ToString())
.Replace("{Continent}", row["Continent"].ToString())), Is.True);
});
Expand Down Expand Up @@ -166,7 +166,7 @@ public void MessagesFromListOfValueTuples()
Assert.Multiple(() =>
{
Assert.That(mimeMessage.To.ToString().Contains(((Dictionary<string, string>) emailPart)["Email"]), Is.True);
Assert.That(mimeMessage.TextBody.Contains(text.Replace("{Email}", emailPart["Email"]).Replace("{Continent}", continentPart["Continent"])), Is.True);
Assert.That(mimeMessage.TextBody!.Contains(text.Replace("{Email}", emailPart["Email"]).Replace("{Continent}", continentPart["Continent"])), Is.True);
});
MailMergeMessage.DisposeFileStreams(mimeMessage);
i++;
Expand All @@ -190,7 +190,7 @@ public void SingleMessageFromValueTuple()
Assert.Multiple(() =>
{
Assert.That(mimeMessage.To.ToString().Contains(anonymous.Email), Is.True);
Assert.That(mimeMessage.TextBody.Contains(text.Replace("{Email}", anonymous.Email).Replace("{Continent}", continentPart["Continent"])), Is.True);
Assert.That(mimeMessage.TextBody!.Contains(text.Replace("{Email}", anonymous.Email).Replace("{Continent}", continentPart["Continent"])), Is.True);
});
MailMergeMessage.DisposeFileStreams(mimeMessage);
}
Expand Down Expand Up @@ -225,7 +225,7 @@ public void MessagesFromList()
Assert.That(mimeMessage.TextBody ==
string.Format(
$"This is the plain text part for {recipients[cnt].Name} ({recipients[cnt].Email})"), Is.True);
Assert.That(mimeMessage.HtmlBody.Contains(string.Format(
Assert.That(mimeMessage.HtmlBody!.Contains(string.Format(
$"This is the plain text part for {recipients[cnt].Name} ({recipients[cnt].Email})")), Is.True);
Assert.That(mimeMessage.To.ToString().Contains(recipients[cnt].Name) &&
mimeMessage.To.ToString().Contains(recipients[cnt].Email), Is.True);
Expand Down Expand Up @@ -268,7 +268,7 @@ public void MessagesFromJsonArray()
Assert.Multiple(() =>
{
Assert.That(mimeMessage.TextBody == string.Format($"This is the plain text part for {recipients[cnt]["Name"]} ({recipients[cnt]["Email"]})"), Is.True);
Assert.That(mimeMessage.HtmlBody.Contains(string.Format($"This is the plain text part for {recipients[cnt]["Name"]} ({recipients[cnt]["Email"]})")), Is.True);
Assert.That(mimeMessage.HtmlBody!.Contains(string.Format($"This is the plain text part for {recipients[cnt]["Name"]} ({recipients[cnt]["Email"]})")), Is.True);
Assert.That(mimeMessage.To.ToString().Contains(recipients[cnt]["Name"]!.ToString()) && mimeMessage.To.ToString().Contains(recipients[cnt]["Email"]!.ToString()), Is.True);
});
MailMergeMessage.DisposeFileStreams(mimeMessage);
Expand All @@ -295,9 +295,9 @@ public void Disabled_Formatter_Should_Maintain_Variable_Placeholders()

Assert.Multiple(() =>
{
Assert.That(mimeMessage.Subject.Contains("Subject for {Continent}"), Is.True);
Assert.That(mimeMessage.Subject!.Contains("Subject for {Continent}"), Is.True);
Assert.That(mimeMessage.To.ToString().Contains("{Name}"), Is.True);
Assert.That(mimeMessage.TextBody.Contains(text), Is.True);
Assert.That(mimeMessage.TextBody!.Contains(text), Is.True);
});
MailMergeMessage.DisposeFileStreams(mimeMessage);
}
Expand Down
6 changes: 3 additions & 3 deletions Src/MailMergeLib/MailMergeAddress.cs
Original file line number Diff line number Diff line change
Expand Up @@ -123,8 +123,8 @@ internal string? DisplayNameCharacterEncodingName
}

return displayName != null
? new MailboxAddress(DisplayNameCharacterEncoding, displayName, address)
: new MailboxAddress(DisplayNameCharacterEncoding, address, address);
? new MailboxAddress(DisplayNameCharacterEncoding ?? Encoding.UTF8, displayName, address)
: new MailboxAddress(DisplayNameCharacterEncoding ?? Encoding.UTF8, address, address);
}

#region *** Equality ***
Expand Down Expand Up @@ -167,4 +167,4 @@ public override int GetHashCode()
}

#endregion
}
}
17 changes: 11 additions & 6 deletions Src/MailMergeLib/MailMergeMessage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -809,7 +809,7 @@ private void AddAddressesToMailMessage(MimeMessage mimeMessage, object? dataItem
if (Config.StandardFromAddress != null)
{
Config.StandardFromAddress.Address = SearchAndReplaceVars(Config.StandardFromAddress.Address, dataItem);
Config.StandardFromAddress.Name = SearchAndReplaceVars(Config.StandardFromAddress.Name, dataItem);
Config.StandardFromAddress.Name = SearchAndReplaceVars(Config.StandardFromAddress.Name ?? string.Empty, dataItem);
mimeMessage.From.Add(Config.StandardFromAddress);
}

Expand All @@ -832,6 +832,9 @@ private void AddAddressesToMailMessage(MimeMessage mimeMessage, object? dataItem
if (Config.IgnoreIllegalRecipientAddresses && mailboxAddr == null)
continue;

if (mailboxAddr == null)
continue;

switch (mmAddr.AddrType)
{
case MailAddressType.To:
Expand All @@ -848,11 +851,13 @@ private void AddAddressesToMailMessage(MimeMessage mimeMessage, object? dataItem
break;
case MailAddressType.ConfirmReadingTo:
mimeMessage.Headers.RemoveAll(HeaderId.DispositionNotificationTo);
mimeMessage.Headers.Add(HeaderId.DispositionNotificationTo, mailboxAddr?.Address);
if (mailboxAddr.Address != null)
mimeMessage.Headers.Add(HeaderId.DispositionNotificationTo, mailboxAddr.Address);
break;
case MailAddressType.ReturnReceiptTo:
mimeMessage.Headers.RemoveAll(HeaderId.ReturnReceiptTo);
mimeMessage.Headers.Add(HeaderId.ReturnReceiptTo, mailboxAddr?.Address);
if (mailboxAddr.Address != null)
mimeMessage.Headers.Add(HeaderId.ReturnReceiptTo, mailboxAddr.Address);
break;
case MailAddressType.Sender:
mimeMessage.Sender = mailboxAddr;
Expand All @@ -878,12 +883,12 @@ private void AddAttributesToMailMessage(MimeMessage mimeMessage, object? dataIte

if (!string.IsNullOrEmpty(Config.Xmailer))
{
mimeMessage.Headers.Replace(HeaderId.XMailer, Config.CharacterEncoding, Config.Xmailer);
mimeMessage.Headers.Replace(HeaderId.XMailer, Config.CharacterEncoding, Config.Xmailer!);
}

if (!string.IsNullOrEmpty(Config.Organization))
{
mimeMessage.Headers.Replace(HeaderId.Organization, Config.CharacterEncoding, Config.Organization);
mimeMessage.Headers.Replace(HeaderId.Organization, Config.CharacterEncoding, Config.Organization!);
}

// collect any headers already present, e.g. headers for mailbox addresses like return-receipt
Expand Down Expand Up @@ -1001,7 +1006,7 @@ public override int GetHashCode() {
}

/// <summary>
/// Compares the MailMergeMessage with an other instance of MailMergeMessage for equality.
/// Compares the MailMergeMessage with another instance of MailMergeMessage for equality.
/// </summary>
/// <param name="mmm"></param>
/// <returns>Returns true, if both instances are equal, else false.</returns>
Expand Down
2 changes: 1 addition & 1 deletion Src/MailMergeLib/MailMergeSender.cs
Original file line number Diff line number Diff line change
Expand Up @@ -362,7 +362,7 @@ internal async Task SendMimeMessageAsync(SmtpClient smtpClient, MimeMessage mime
foreach (var mimeEntity in mimeMsg.Attachments)
{
var att = mimeEntity as MimePart;
att?.Content.Stream.Dispose();
att?.Content?.Stream?.Dispose();
}

if (sendException != null)
Expand Down
2 changes: 1 addition & 1 deletion Src/MailMergeLib/MessageConfig.cs
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ public string FileBaseDirectory
private string? StandardFromAddressText
{
get => StandardFromAddress?.ToString();
set => StandardFromAddress = !string.IsNullOrEmpty(value) ? MailboxAddress.Parse(ParserOptions.Default, value) : null;
set => StandardFromAddress = !string.IsNullOrEmpty(value) ? MailboxAddress.Parse(ParserOptions.Default, value!) : null;
}
#pragma warning restore IDE0051

Expand Down
2 changes: 1 addition & 1 deletion Src/MailMergeLib/Tools.cs
Original file line number Diff line number Diff line change
Expand Up @@ -240,7 +240,7 @@ public static string WrapLine(string input, int length)
public static void ParseMailAddress(string inputAddr, out string displayName, out string address)
{
var mbAddr = MailboxAddress.Parse(ParserOptions.Default, inputAddr);
displayName = mbAddr.Name;
displayName = mbAddr.Name ?? string.Empty;
address = mbAddr.Address;
}

Expand Down