Example #1
0
        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));
            }
        }
Example #2
0
        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));
        }
Example #3
0
        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);
                }
            }
        }
Example #4
0
        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());
        }
Example #5
0
        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);
        }
Example #6
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);
            }
        }
Example #7
0
        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));
        }
Example #8
0
        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));
        }
Example #9
0
        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")));
        }
Example #10
0
        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);
        }
Example #11
0
        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.");
            }
        }