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); } }
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(); } }
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++; } }
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++; } }
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); }
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); }
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); }
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); }
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++; } }
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); }