Example #1
0
        public void HtmlMailMergeWithInlineAndAtt()
        {
            var dataItem = new
            {
                Name        = "John",
                MailboxAddr = "*****@*****.**",
                Success     = true,
                Date        = DateTime.Now,
                SenderAddr  = "*****@*****.**"
            };

            using var mmm = MessageFactory.GetHtmlMailWithInlineAndOtherAttachments();
            var msg         = mmm.GetMimeMessage(dataItem);
            var msgFilename = Path.GetFullPath(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 == mmm.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")));

            MailMergeMessage.DisposeFileStreams(msg);
        }
        public void MessagesFromList()
        {
            var recipients = new List <Recipient>();

            for (var i = 0; i < 10; i++)
            {
                recipients.Add(new Recipient()
                {
                    Email = $"recipient-{i}@example.com", Name = $"Name of {i}"
                });
            }

            var mmm = new MailMergeMessage("Get MimeMessages Test", string.Empty, "<html><head></head><body>This is the plain text part for {Name} ({Email})</body></html>");

            mmm.ConvertHtmlToPlainText();
            mmm.MailMergeAddresses.Add(new MailMergeAddress(MailAddressType.From, "*****@*****.**"));
            mmm.MailMergeAddresses.Add(new MailMergeAddress(MailAddressType.To, "{Name}", "{Email}"));

            var cnt = 0;

            foreach (var mimeMessage in mmm.GetMimeMessages <Recipient>(recipients))
            {
                Assert.IsTrue(mimeMessage.TextBody == string.Format($"This is the plain text part for {recipients[cnt].Name} ({recipients[cnt].Email})"));
                Assert.IsTrue(mimeMessage.HtmlBody.Contains(string.Format($"This is the plain text part for {recipients[cnt].Name} ({recipients[cnt].Email})")));
                Assert.IsTrue(mimeMessage.To.ToString().Contains(recipients[cnt].Name) && mimeMessage.To.ToString().Contains(recipients[cnt].Email));
                MailMergeMessage.DisposeFileStreams(mimeMessage);
                cnt++;

                // The message could be sent using the low-level API using a configured SmtpClient:
                // new SmtpClient().Send(FormatOptions.Default, mimeMessage);
            }
        }
Example #3
0
        public void DisposeFileStreamsOfMessageAttachments()
        {
            var dataItem = new
            {
                Name        = "John",
                MailboxAddr = "*****@*****.**",
                Success     = true,
                Date        = DateTime.Now,
                SenderAddr  = "*****@*****.**",
                Image       = MessageFactory.ImgSuccess
            };

            using (var mmm = MessageFactory.GetHtmlMailWithInlineAndOtherAttachments())
            {
                var mimeMsg = mmm.GetMimeMessage(dataItem);
                foreach (var filename in new[] { MessageFactory.LogFileName, dataItem.Image })
                {
                    // file streams are still in use
                    Assert.Throws <IOException>(() => File.OpenWrite(Path.Combine(TestFileFolders.FilesAbsPath, filename)));
                }

                // dispose file streams
                MailMergeMessage.DisposeFileStreams(mimeMsg);
            }

            // now all files are fully accessible
            foreach (var filename in new[] { MessageFactory.LogFileName, dataItem.Image })
            {
                var fs = File.OpenWrite(Path.Combine(TestFileFolders.FilesAbsPath, filename));
                fs.Dispose();
            }
        }
Example #4
0
        public void HtmlMailMergeWithStreamAttachment()
        {
            var dataItem = new
            {
                Name        = "John",
                MailboxAddr = "*****@*****.**",
                Success     = true,
                Date        = DateTime.Now,
                SenderAddr  = "*****@*****.**"
            };

            var text = "Some test for stream attachment";
            var streamAttFilename = $"StreamFilename_{dataItem.Date:yyyy-MM-dd}.txt";

            using var mmm = MessageFactory.GetHtmlMailWithInlineAndOtherAttachments();
            mmm.FileAttachments.Clear();
            mmm.InlineAttachments.Clear();
            mmm.StreamAttachments.Clear();
            mmm.StringAttachments.Clear();

            using var stream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(text ?? string.Empty));
            mmm.StreamAttachments.Add(new StreamAttachment(stream, streamAttFilename, "text/plain"));

            var msg = mmm.GetMimeMessage(dataItem);
            var att = msg.Attachments.FirstOrDefault() as MimePart;

            Assert.IsTrue(att?.FileName == streamAttFilename && att.IsAttachment);
            Assert.IsTrue(msg.ToString().Contains(text));

            MailMergeMessage.DisposeFileStreams(msg);
        }
        public void MessagesFromDataRows()
        {
            var tbl = new DataTable();

            tbl.Columns.Add("Email", typeof(string));
            tbl.Columns.Add("Continent", typeof(string));
            tbl.Rows.Add("*****@*****.**", "Europe");
            tbl.Rows.Add("*****@*****.**", "Asia");
            tbl.Rows.Add("*****@*****.**", "America");
            var text = "Lorem ipsum dolor. Email={Email}, Continent={Continent}.";

            var mmm = new MailMergeMessage("Subject for {Continent}", text);

            mmm.MailMergeAddresses.Add(new MailMergeAddress(MailAddressType.From, "*****@*****.**"));
            mmm.MailMergeAddresses.Add(new MailMergeAddress(MailAddressType.To, "{Email}"));

            var i = 0;

            foreach (var mimeMessage in mmm.GetMimeMessages <DataRow>(tbl.Rows.OfType <DataRow>()))
            {
                Assert.IsTrue(mimeMessage.To.ToString().Contains(tbl.Rows[i]["Email"].ToString()));
                Assert.IsTrue(mimeMessage.TextBody.Contains(text.Replace("{Email}", tbl.Rows[i]["Email"].ToString()).Replace("{Continent}", tbl.Rows[i]["Continent"].ToString())));
                MailMergeMessage.DisposeFileStreams(mimeMessage);
                i++;
            }
        }
Example #6
0
        public void MessagesFromJsonArray()
        {
            var recipients = JArray.Parse(@"
[
    {
      'Email': '*****@*****.**',
      'Name': 'John'
    },
    {
      'Email': '*****@*****.**',
      'Name': 'Mary'
    },
    {
      'Email': '*****@*****.**',
      'Name': 'Steve'
    }
]
");
            var mmm        = new MailMergeMessage("Get MimeMessages JSON Test", string.Empty, "<html><head></head><body>This is the plain text part for {Name} ({Email})</body></html>");

            mmm.ConvertHtmlToPlainText();
            mmm.MailMergeAddresses.Add(new MailMergeAddress(MailAddressType.From, "*****@*****.**"));
            mmm.MailMergeAddresses.Add(new MailMergeAddress(MailAddressType.To, "{Name}", "{Email}"));

            var cnt = 0;

            foreach (var mimeMessage in mmm.GetMimeMessages(recipients))
            {
                Assert.IsTrue(mimeMessage.TextBody == string.Format($"This is the plain text part for {recipients[cnt]["Name"]} ({recipients[cnt]["Email"]})"));
                Assert.IsTrue(mimeMessage.HtmlBody.Contains(string.Format($"This is the plain text part for {recipients[cnt]["Name"]} ({recipients[cnt]["Email"]})")));
                Assert.IsTrue(mimeMessage.To.ToString().Contains(recipients[cnt]["Name"].ToString()) && mimeMessage.To.ToString().Contains(recipients[cnt]["Email"].ToString()));
                MailMergeMessage.DisposeFileStreams(mimeMessage);
                cnt++;
            }
        }
Example #7
0
        public void HtmlMailMergeWithMoreEqualInlineAtt()
        {
            var dataItem = new
            {
                Name        = "John",
                MailboxAddr = "*****@*****.**",
                Success     = true,
                Date        = DateTime.Now,
                SenderAddr  = "*****@*****.**",
                Image       = MessageFactory.ImgSuccess
            };

            var mmm = MessageFactory.GetHtmlMsgWithThreeInlineAttachments();

            var msg         = mmm.GetMimeMessage(dataItem);
            var msgFilename = Path.GetFullPath(Path.Combine(Path.GetTempPath(), "test-msg-equal-inline-att.eml"));

            msg.WriteTo(msgFilename);
            Console.WriteLine($"Test mime message saved as {msgFilename}");

            Assert.IsTrue(new HtmlParser().Parse(msg.HtmlBody).All.Count(m => m is IHtmlImageElement) == 3);
            Assert.IsTrue(msg.BodyParts.Count(bp => bp.ContentDisposition?.Disposition == ContentDisposition.Inline && bp.ContentType.IsMimeType("image", "jpeg")) == 1);

            MailMergeMessage.DisposeFileStreams(msg);
        }
Example #8
0
        public void IgnoreImgSrcWithUriTypeHttp()
        {
            const string httpImage = "http://example.com/sample.png";

            using 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));
            MailMergeMessage.DisposeFileStreams(msg);
        }
Example #9
0
        public void IgnoreImgSrcWithEmbeddedBase64Image()
        {
            const string embeddedImage = "data:image/gif;base64,R0lGODlhAQABAIAAAAUEBAAAACwAAAAAAQABAAACAkQBADs=";

            using 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));
            MailMergeMessage.DisposeFileStreams(msg);
        }
Example #10
0
        public void AddLinkedResourceManually()
        {
            var dataItem = new
            {
                Name        = "John",
                MailboxAddr = "*****@*****.**",
                Success     = true,
                Date        = DateTime.Now,
                SenderAddr  = "*****@*****.**"
            };

            using var mmm = MessageFactory.GetHtmlMsgWithManualLinkedResources();
            var msg = mmm.GetMimeMessage(dataItem);

            Assert.IsTrue(msg.BodyParts.Any(bp => bp.ContentDisposition?.Disposition == ContentDisposition.Inline && bp.ContentType.IsMimeType("image", "jpeg") && bp.ContentId == MessageFactory.MyContentId));
            MailMergeMessage.DisposeFileStreams(msg);
        }
Example #11
0
        public void MessagesFromListOfSmartObjects()
        {
            var dataList = new List <SmartObjects>();
            var so1      = new SmartObjects(new [] { new Dictionary <string, string>()
                                                     {
                                                         { "Email", "*****@*****.**" }
                                                     }, new Dictionary <string, string>()
                                                     {
                                                         { "Continent", "Europe" }
                                                     } });
            var so2 = new SmartObjects(new[] { new Dictionary <string, string>()
                                               {
                                                   { "Email", "*****@*****.**" }
                                               }, new Dictionary <string, string>()
                                               {
                                                   { "Continent", "Asia" }
                                               } });
            var so3 = new SmartObjects(new[] { new Dictionary <string, string>()
                                               {
                                                   { "Email", "*****@*****.**" }
                                               }, new Dictionary <string, string>()
                                               {
                                                   { "Continent", "America" }
                                               } });

            dataList.AddRange(new [] { so1, so2, so3 });

            var text = "Lorem ipsum dolor. Email={Email}, Continent={Continent}.";

            var mmm = new MailMergeMessage("Subject for {Continent}", text);

            mmm.MailMergeAddresses.Add(new MailMergeAddress(MailAddressType.From, "*****@*****.**"));
            mmm.MailMergeAddresses.Add(new MailMergeAddress(MailAddressType.To, "{Email}"));

            var i = 0;

            foreach (var mimeMessage in mmm.GetMimeMessages <SmartObjects>(dataList))
            {
                Assert.IsTrue(mimeMessage.To.ToString().Contains(((Dictionary <string, string>)dataList[i][0])["Email"]));
                Assert.IsTrue(mimeMessage.TextBody.Contains(text.Replace("{Email}", ((Dictionary <string, string>)dataList[i][0])["Email"]).Replace("{Continent}", ((Dictionary <string, string>)dataList[i][1])["Continent"])));
                MailMergeMessage.DisposeFileStreams(mimeMessage);
                i++;
            }
        }
Example #12
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);
        }