public void FileBaseDirectory_must_be_full_path_when_processing_the_message(string path, bool shouldThrow) { var mmm = new MailMergeMessage("subject", "plain text", "<html><body></body></html>"); mmm.MailMergeAddresses.Add(new MailMergeAddress(MailAddressType.To, "*****@*****.**")); mmm.MailMergeAddresses.Add(new MailMergeAddress(MailAddressType.From, "*****@*****.**")); mmm.Config.FileBaseDirectory = path; if (shouldThrow) { try { mmm.GetMimeMessage(null); } catch (Exception e) { Assert.IsTrue(e is MailMergeMessage.MailMergeMessageException); Assert.IsTrue(e.InnerException != null); } } else { Assert.DoesNotThrow(() => mmm.GetMimeMessage(null)); } }
public void AddLinkedResourceManually() { const string myContentId = "my.content.id"; var filesAbsPath = Path.Combine(Helper.GetCodeBaseDirectory(), _pathRelativeToCodebase); var dataItem = new { Name = "John", MailboxAddr = "*****@*****.**", Success = true, Date = DateTime.Now, SenderAddr = "*****@*****.**" }; var mmm = new MailMergeMessage { HtmlText = $"<html><body><img src=\"cid:{myContentId}\" width=\"100\"><br/>only an image</body></html>", PlainText = "only an image", Subject = "Message subject", Config = { FileBaseDirectory = filesAbsPath } }; mmm.MailMergeAddresses.Add(new MailMergeAddress(MailAddressType.From, "{SenderAddr}")); mmm.MailMergeAddresses.Add(new MailMergeAddress(MailAddressType.To, "\"{Name}\" <{MailboxAddr}>", mmm.Config.CharacterEncoding)); mmm.AddExternalInlineAttachment(new FileAttachment(Path.Combine(filesAbsPath, "success.jpg"), myContentId)); var msg = mmm.GetMimeMessage(dataItem); Assert.IsTrue(msg.BodyParts.Any(bp => bp.ContentDisposition?.Disposition == ContentDisposition.Inline && bp.ContentType.IsMimeType("image", "jpeg") && bp.ContentId == myContentId)); }
public void MissingVariableAndAttachmentsExceptions() { // build message with a total of 8 placeholders which will be missing var mmm = new MailMergeMessage("Missing in subject {subject}", "Missing in plain text {plain}", "<html><head></head><body>{html}</body></html>"); mmm.MailMergeAddresses.Add(new MailMergeAddress(MailAddressType.From, "{from.address}")); mmm.MailMergeAddresses.Add(new MailMergeAddress(MailAddressType.To, "{to.address}")); mmm.AddExternalInlineAttachment(new FileAttachment("{inlineAtt.filename}.jpg", string.Empty)); mmm.FileAttachments.Add(new FileAttachment("{fileAtt.filename}.xml", "{fileAtt.displayname}")); try { var mimeMessage = mmm.GetMimeMessage(default(object)); Assert.Fail("Expected exceptions not thrown."); } catch (MailMergeMessage.MailMergeMessageException exceptions) { Console.WriteLine($"Aggregate {nameof(MailMergeMessage.MailMergeMessageException)} thrown. Passed."); Console.WriteLine(); /* Expected exceptions: * 1) 8 missing variables for {placeholders} * 2) No recipients * 3) No FROM address * 4) Missing file attachment {fileAtt.filename}.xml * 5) Missing inline attachment {inlineAtt.filename}.jpg */ Assert.That(exceptions.InnerExceptions.Count == 5); foreach (var ex in exceptions.InnerExceptions.Where(ex => !(ex is MailMergeMessage.AttachmentException))) { if (ex is MailMergeMessage.VariableException) { Assert.AreEqual(8, (ex as MailMergeMessage.VariableException).MissingVariable.Count); Console.WriteLine($"{nameof(MailMergeMessage.VariableException)} thrown successfully:"); Console.WriteLine("Missing variables: " + string.Join(", ", (ex as MailMergeMessage.VariableException).MissingVariable)); } if (ex is MailMergeMessage.AddressException) { Console.WriteLine($"{nameof(MailMergeMessage.AddressException)} thrown successfully:"); Console.WriteLine((ex as MailMergeMessage.AddressException).Message); Assert.That((ex as MailMergeMessage.AddressException).Message == "No recipients." || (ex as MailMergeMessage.AddressException).Message == "No from address."); } } // one exception for a missing file attachment, one for a missing inline attachment var attExceptions = exceptions.InnerExceptions.Where(ex => ex is MailMergeMessage.AttachmentException).ToList(); Assert.AreEqual(2, attExceptions.Count); foreach (var ex in attExceptions) { Console.WriteLine($"{nameof(MailMergeMessage.AttachmentException)} thrown successfully:"); Console.WriteLine("Missing files: " + string.Join(", ", (ex as MailMergeMessage.AttachmentException).BadAttachment)); Assert.AreEqual(1, (ex as MailMergeMessage.AttachmentException).BadAttachment.Count); } } }
private MimeMessage GetMimeMessage() { var mmm = new MailMergeMessage("subject", "plain text"); mmm.MailMergeAddresses.Add(new MailMergeAddress(MailAddressType.To, "*****@*****.**")); mmm.MailMergeAddresses.Add(new MailMergeAddress(MailAddressType.From, "*****@*****.**")); return(mmm.GetMimeMessage()); }
public void MimeMessageSize() { using (var mmm = new MailMergeMessage("subject", "plain text", "<html><head></head><body>some body</body></html>")) { mmm.MailMergeAddresses.Add(new MailMergeAddress(MailAddressType.To, "*****@*****.**")); mmm.MailMergeAddresses.Add(new MailMergeAddress(MailAddressType.From, "*****@*****.**")); var mimeMessage = mmm.GetMimeMessage(null); var size = MailMergeLib.Tools.CalcMessageSize(mimeMessage); Assert.IsTrue(size > 0); } Assert.IsTrue(MailMergeLib.Tools.CalcMessageSize(null) == 0); }
public void EmptyContent() { using var mmm = new MailMergeMessage(); mmm.MailMergeAddresses.Add(new MailMergeAddress(MailAddressType.To, "*****@*****.**")); mmm.MailMergeAddresses.Add(new MailMergeAddress(MailAddressType.From, "*****@*****.**")); try { mmm.GetMimeMessage(null); } catch (Exception e) { Assert.IsTrue(e is MailMergeMessage.MailMergeMessageException); Assert.IsTrue(e.InnerException is MailMergeMessage.EmtpyContentException); } }
public void IgnoreImgSrcWithEmbeddedBase64Image() { const string embeddedImage = "data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs="; var mmm = new MailMergeMessage { // img is 1x1px black HtmlText = $"<html><body><img src=\"{embeddedImage}\" width=\"30\" height=\"30\"></body></html>" }; mmm.MailMergeAddresses.Add(new MailMergeAddress(MailAddressType.From, "*****@*****.**")); mmm.MailMergeAddresses.Add(new MailMergeAddress(MailAddressType.To, "*****@*****.**")); var msg = mmm.GetMimeMessage(); Assert.IsTrue(msg.ToString().Contains(embeddedImage)); }
public void IgnoreImgSrcWithUriTypeHttp() { const string httpImage = "http://example.com/sample.png"; var mmm = new MailMergeMessage { // img is 1x1px black HtmlText = $"<html><base href=\"file:///\" /><body><img src=\"{httpImage}\"></body></html>" }; mmm.MailMergeAddresses.Add(new MailMergeAddress(MailAddressType.From, "*****@*****.**")); mmm.MailMergeAddresses.Add(new MailMergeAddress(MailAddressType.To, "*****@*****.**")); var msg = mmm.GetMimeMessage(); Assert.IsTrue(msg.ToString().Contains(httpImage)); }
public void HtmlMailMergeWithInlineAndAtt() { var filesAbsPath = Path.Combine(Helper.GetCodeBaseDirectory(), _pathRelativeToCodebase); var dataItem = new { Name = "John", MailboxAddr = "*****@*****.**", Success = true, Date = DateTime.Now, SenderAddr = "*****@*****.**" }; var mmm = new MailMergeMessage { HtmlText = File.ReadAllText(Path.Combine(filesAbsPath, _htmlTextFile)), // contains image (<img src="..." />) which must be "inline-attached" PlainText = File.ReadAllText(Path.Combine(filesAbsPath, _plainTextFile)), Subject = _subject, Config = { FileBaseDirectory = filesAbsPath, Organization = "MailMergeLib Inc.", CharacterEncoding = Encoding.UTF8, Priority = MessagePriority.Urgent } }; mmm.MailMergeAddresses.Add(new MailMergeAddress(MailAddressType.From, "{SenderAddr}")); mmm.MailMergeAddresses.Add(new MailMergeAddress(MailAddressType.To, "\"{Name}\" <{MailboxAddr}>", mmm.Config.CharacterEncoding)); mmm.FileAttachments.Add(new FileAttachment(Path.Combine(filesAbsPath, _logFileName), "Log file from {Date:yyyy-MM-dd}.log")); var msg = mmm.GetMimeMessage(dataItem); var msgFilename = Path.Combine(Path.GetTempPath(), "test-msg.eml"); msg.WriteTo(msgFilename); Console.WriteLine($"Test mime message saved as {msgFilename}"); Assert.IsTrue(((MailboxAddress)msg.From.First()).Address == dataItem.SenderAddr); Assert.IsTrue(((MailboxAddress)msg.To.First()).Address == dataItem.MailboxAddr); Assert.IsTrue(((MailboxAddress)msg.To.First()).Name == dataItem.Name); Assert.IsTrue(msg.Headers[HeaderId.Organization] == mmm.Config.Organization); Assert.IsTrue(msg.Priority == mmm.Config.Priority); Assert.IsTrue(msg.Attachments.FirstOrDefault(a => ((MimePart)a).FileName == "Log file from {Date:yyyy-MM-dd}.log".Replace("{Date:yyyy-MM-dd}", dataItem.Date.ToString("yyyy-MM-dd"))) != null); Assert.IsTrue(msg.Subject == _subject.Replace("{Date:yyyy-MM-dd}", dataItem.Date.ToString("yyyy-MM-dd"))); Assert.IsTrue(msg.HtmlBody.Contains(dataItem.Success ? "succeeded" : "failed")); Assert.IsTrue(msg.TextBody.Contains(dataItem.Success ? "succeeded" : "failed")); Assert.IsTrue(msg.BodyParts.Any(bp => bp.ContentDisposition?.Disposition == ContentDisposition.Inline && bp.ContentType.IsMimeType("image", "jpeg"))); }
public void SingleMessageFromSmartObjects() { var anonymous = new { Email = "*****@*****.**" }; var text = "Lorem ipsum dolor. Email={Email}, Continent={Continent}."; var so = new SmartObjects(new object[] { anonymous, new Dictionary <string, string> { { "Continent", "Europe" } } }); var mmm = new MailMergeMessage("Subject for {Continent}", text); mmm.MailMergeAddresses.Add(new MailMergeAddress(MailAddressType.From, "*****@*****.**")); mmm.MailMergeAddresses.Add(new MailMergeAddress(MailAddressType.To, "{Email}")); var mimeMessage = mmm.GetMimeMessage(so); Assert.IsTrue(mimeMessage.To.ToString().Contains(anonymous.Email)); Assert.IsTrue(mimeMessage.TextBody.Contains(text.Replace("{Email}", anonymous.Email).Replace("{Continent}", ((Dictionary <string, string>)so[1])["Continent"]))); MailMergeMessage.DisposeFileStreams(mimeMessage); }
public void MissingVariableAndAttachmentsExceptions() { // build message with a total of 9 placeholders which will be missing var mmm = new MailMergeMessage("Missing in subject {subject}", "Missing in plain text {plain}", "<html><head></head><body>{html}{:template(Missing)}</body></html>"); mmm.MailMergeAddresses.Add(new MailMergeAddress(MailAddressType.From, "{from.address}")); mmm.MailMergeAddresses.Add(new MailMergeAddress(MailAddressType.To, "{to.address}")); mmm.AddExternalInlineAttachment(new FileAttachment("{inlineAtt.filename}.jpg", string.Empty)); mmm.FileAttachments.Add(new FileAttachment("{fileAtt.filename}.xml", "{fileAtt.displayname}")); mmm.FileAttachments.Add(new FileAttachment("{throwParingError.xml", "DisplayName")); // **************** Part 1: mmm.Config.IgnoreMissingInlineAttachments = false; mmm.Config.IgnoreMissingFileAttachments = false; // ************************ try { mmm.GetMimeMessage(default(object)); Assert.Fail("Expected exceptions not thrown."); } catch (MailMergeMessage.MailMergeMessageException exceptions) { Console.WriteLine($"Aggregate {nameof(MailMergeMessage.MailMergeMessageException)} thrown."); Console.WriteLine(); /* Expected exceptions: * 1) 9 missing variables for {placeholders} and {:templates(...)} * 2) No recipients * 3) No FROM address * 4) Missing file attachment {fileAtt.filename}.xml * 5) Missing inline attachment {inlineAtt.filename}.jpg * 6) Parsing error in file attachment "{throwParingError.xml" */ Assert.AreEqual(6, exceptions.InnerExceptions.Count); foreach (var ex in exceptions.InnerExceptions.Where(ex => !(ex is MailMergeMessage .AttachmentException))) { if (ex is MailMergeMessage.VariableException) { Assert.AreEqual(9, (ex as MailMergeMessage.VariableException).MissingVariable.Count); Console.WriteLine($"{nameof(MailMergeMessage.VariableException)} thrown successfully:"); Console.WriteLine("Missing variables: " + string.Join(", ", (ex as MailMergeMessage.VariableException).MissingVariable)); Console.WriteLine(); } if (ex is MailMergeMessage.AddressException) { Console.WriteLine($"{nameof(MailMergeMessage.AddressException)} thrown successfully:"); Console.WriteLine((ex as MailMergeMessage.AddressException).Message); Console.WriteLine(); Assert.That((ex as MailMergeMessage.AddressException).Message == "No recipients." || (ex as MailMergeMessage.AddressException).Message == "No from address."); } } // one exception for a missing file attachment, one for a missing inline attachment var attExceptions = exceptions.InnerExceptions.Where(ex => ex is MailMergeMessage.AttachmentException) .ToList(); Assert.AreEqual(2, attExceptions.Count); // Inline file missing Console.WriteLine($"{nameof(MailMergeMessage.AttachmentException)} thrown successfully:"); Console.WriteLine("Missing inline attachment files: " + string.Join(", ", (attExceptions[0] as MailMergeMessage.AttachmentException).BadAttachment)); Console.WriteLine(); Assert.AreEqual(1, (attExceptions[0] as MailMergeMessage.AttachmentException).BadAttachment.Count); // 2 file attachments missing Console.WriteLine($"{nameof(MailMergeMessage.AttachmentException)} thrown successfully:"); Console.WriteLine("Missing attachment files: " + string.Join(", ", (attExceptions[1] as MailMergeMessage.AttachmentException).BadAttachment)); Console.WriteLine(); Assert.AreEqual(2, (attExceptions[1] as MailMergeMessage.AttachmentException).BadAttachment.Count); } // **************** Part 2: mmm.Config.IgnoreMissingInlineAttachments = true; mmm.Config.IgnoreMissingFileAttachments = true; // ************************ try { mmm.GetMimeMessage(default(object)); Assert.Fail("Expected exceptions not thrown."); } catch (MailMergeMessage.MailMergeMessageException exceptions) { /* Expected exceptions: * 1) 9 missing variables for {placeholders} and {:templates(...)} * 2) No recipients * 3) No FROM address * 4) 1 parsing error */ Assert.AreEqual(4, exceptions.InnerExceptions.Count); Assert.IsFalse(exceptions.InnerExceptions.Any(e => e is MailMergeMessage.AttachmentException)); Console.WriteLine("Exceptions for missing attachment files suppressed."); } }