{"id":538,"date":"2016-12-16T13:20:04","date_gmt":"2016-12-16T12:20:04","guid":{"rendered":"https:\/\/solidt.eu\/site\/?p=538"},"modified":"2019-10-24T13:25:42","modified_gmt":"2019-10-24T12:25:42","slug":"c-emailservice","status":"publish","type":"post","link":"https:\/\/solidt.eu\/site\/c-emailservice\/","title":{"rendered":"C# EmailService"},"content":{"rendered":"\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">using Newtonsoft.Json;\nusing System;\nusing System.Collections.Generic;\nusing System.Configuration;\nusing System.IO;\nusing System.Linq;\nusing System.Net.Mail;\nusing System.Threading.Tasks;\nusing System.Web;\nusing Common.Logging;\nusing Application.Business.UnitOfWork;\nusing Application.Business.Repository;\nusing System.Text;\n\nnamespace Application.Business.Service\n{\n    public class EmailService\n    {\n        static readonly string host;\n        static readonly int port;\n\n        private class SerializableAttachment\n        {\n            public string Name;\n            public string Content;\n            public string ContentType = \"application\/octet-stream\";\n        }\n\n        private class SerializableMailMessage\n        {\n            public string Sender = \"\";\n            public string From = \"\";\n            public List To = new List();\n            public List CC = new List();\n            public List BCC = new List();\n            public List ReplyTo = new List();\n            public string Subject = \"\";\n            public string Body = \"\";\n            public int Priority = 0;\n            public bool IsBodyHtml = true;\n            public List&lt;keyvaluepair&lt;string, string>> Headers = new List&lt;keyvaluepair&lt;string, string>>();\n            public List Attachments = new List();\n        }\n\n        static EmailService()\n        {\n            host = ConfigurationManager.AppSettings[\"SmtpHost\"];\n            port = Convert.ToInt32(ConfigurationManager.AppSettings[\"SmtpPort\"]);\n\n            \/\/unitOfWorkFactory = new UnitOfWorkFactory();\n            \/\/repositoryFactory = new RepositoryFactory();\n        }\n\n        private static string GetMailAddressAsString(MailAddress mailAddress)\n        {\n            if (mailAddress != null)\n            {\n                return mailAddress.ToString();\n            }\n            return null;\n        }\n\n        private static IEnumerable GetAddressList(MailAddressCollection mailAddressCollection)\n        {\n            if (mailAddressCollection != null)\n            {\n                return mailAddressCollection.Select(e => GetMailAddressAsString(e)).Where(e => !String.IsNullOrWhiteSpace(e));\n            }\n            return new List();\n        }\n\n        private static MailAddress GetMailAddress(string mailAddress)\n        {\n            if (!String.IsNullOrWhiteSpace(mailAddress))\n            {\n                return new MailAddress(mailAddress);\n            }\n            return null;\n        }\n\n        private static void AddMailAddresses(MailAddressCollection collection, IEnumerable addresses)\n        {\n            foreach (var address in addresses)\n            {\n                if (!String.IsNullOrWhiteSpace(address))\n                {\n                    collection.Add(new MailAddress(address));\n                }\n            }\n        }\n\n        private static byte[] GetAllBytesFromStream(Stream stream)\n        {\n            stream.Position = 0;\n            var bytes = default(byte[]);\n            using (var memstream = new MemoryStream())\n            {\n                stream.CopyTo(memstream);\n                bytes = memstream.ToArray();\n                return bytes;\n            }\n        }\n\n        public static string SerializeMailMessage(MailMessage mailMessage)\n        {\n            var s = new SerializableMailMessage();\n            s.Sender = GetMailAddressAsString(mailMessage.Sender);\n            s.From = GetMailAddressAsString(mailMessage.From);\n            s.To.AddRange(GetAddressList(mailMessage.To));\n            s.CC.AddRange(GetAddressList(mailMessage.CC));\n            s.BCC.AddRange(GetAddressList(mailMessage.Bcc));\n            s.ReplyTo.AddRange(GetAddressList(mailMessage.ReplyToList));\n            s.Subject = mailMessage.Subject;\n            s.Body = mailMessage.Body;\n            s.IsBodyHtml = mailMessage.IsBodyHtml;\n            s.Priority = (int)mailMessage.Priority;\n\n            foreach (var key in mailMessage.Headers.AllKeys)\n            {\n                s.Headers.Add(new KeyValuePair&lt;string, string> (key, mailMessage.Headers[key]));\n            }\n\n            s.Attachments.AddRange(mailMessage.Attachments.Select(a => {\n                a.ContentStream.Position = 0;\n                return new SerializableAttachment()\n                {\n                    Name = a.Name,\n                    ContentType = a.ContentType.MediaType,\n                    Content = Convert.ToBase64String(GetAllBytesFromStream(a.ContentStream))\n                };\n            }));\n\n            return JsonConvert.SerializeObject(s);\n        }\n\n        public static MailMessage DeserializeMailMessage(string mailMessageJson)\n        {\n            var s = JsonConvert.DeserializeObject(mailMessageJson);\n\n            MailMessage message = new MailMessage();\n            message.Sender = GetMailAddress(s.Sender);\n            message.From = GetMailAddress(s.From);\n            AddMailAddresses(message.To, s.To);\n            AddMailAddresses(message.CC, s.CC);\n            AddMailAddresses(message.Bcc, s.BCC);\n            AddMailAddresses(message.ReplyToList, s.ReplyTo);\n            message.Subject = s.Subject;\n            message.Body = s.Body;\n            message.Priority = (MailPriority)s.Priority;\n            message.IsBodyHtml = s.IsBodyHtml;\n\n            foreach (var header in s.Headers)\n            {\n                message.Headers[header.Key] = header.Value;\n            }\n\n            foreach (var attachment in s.Attachments)\n            {\n                var stream = new MemoryStream(); \/\/ using or Dispose not needed here memory stream is managed            \n                var data = Convert.FromBase64String(attachment.Content);\n                stream.Write(data, 0, data.Length);\n                stream.Position = 0;\n                message.Attachments.Add(new Attachment(stream, attachment.Name, attachment.ContentType));\n            }\n            return message;\n        }\n\n        \/\/        public static async Task AddEmailToQueue(string from, IEnumerable to, string subject, string body, bool ishtml = false)\n        \/\/        {\n        \/\/            var message = new MailMessage\n        \/\/            {\n        \/\/                Subject = subject,\n        \/\/                From = new MailAddress(@from),\n        \/\/                Body = body,\n        \/\/                IsBodyHtml = ishtml\n        \/\/            };\n\n        \/\/#if DEBUG\n        \/\/            to = new[] { ConfigurationManager.AppSettings[\"DebugEmailAddress\"]};\n        \/\/#endif\n        \/\/            foreach (var address in to)\n        \/\/            {\n        \/\/                if (!String.IsNullOrEmpty(address))\n        \/\/                {\n        \/\/                    message.To.Add(address);\n        \/\/                }\n        \/\/            }\n        \/\/            await AddEmailToQueue(message);\n        \/\/        }\n\n        \/\/public static async Task AddEmailToQueue(MailMessage mailMessage) {\n        \/\/    var mailMessageJson = SerializeMailMessage(mailMessage);\n\n        \/\/    using (var unitOfWork = unitOfWorkFactory.Create())\n        \/\/    {\n        \/\/        var repository = repositoryFactory.Create(unitOfWork);\n        \/\/        var emailQueueRepository = repositoryFactory.Create(unitOfWork);\n\n        \/\/        var emailQueueItem = new EmailQueueItem();\n        \/\/        emailQueueItem.Id = Guid.NewGuid();\n        \/\/        emailQueueItem.InsertedAt = DateTime.Now;\n        \/\/        emailQueueItem.LastException = String.Empty;\n        \/\/        emailQueueItem.LastProcessedAt = null;\n        \/\/        emailQueueItem.EmailFrom = GetMailAddressAsString(mailMessage.From);\n        \/\/        emailQueueItem.EmailTo = String.Join(\";\", mailMessage.To.Select(e => e.ToString()));\n        \/\/        emailQueueItem.EmailSubject = mailMessage.Subject;\n        \/\/        emailQueueItem.EmailContent = mailMessageJson;\n\n        \/\/        emailQueueRepository.Add(emailQueueItem);\n\n        \/\/        await unitOfWork.ValidateAndCommitAsync();\n        \/\/    }\n\n        \/\/    try\n        \/\/    {\n        \/\/        ScheduledTaskService.TriggerTaskNow();\n        \/\/    }\n        \/\/    catch (Exception ex) \n        \/\/    {                \n        \/\/        log.Error(\"Failed to start ProcessEmailQueueTask at EmailService.AddEmailToQueue()\", ex);\n        \/\/        \/\/ Ignore this error and continue; the task wil be started regularly\n        \/\/    }\n        \/\/}\n\n        public static async Task SendMailNoQueueAsync(string from, IEnumerable to, string subject, string body)\n        {\n            var message = new MailMessage\n            {\n                Subject = subject,\n                From = new MailAddress(@from),\n                Body = body,\n                BodyEncoding = Encoding.UTF8,\n                IsBodyHtml = true\n            };\n\n            foreach (var address in to)\n            {\n                message.To.Add(address);\n            }\n\n            await SendMailNoQueueAsync(message);\n        }\n\n        public static async Task SendMailNoQueueAsync(MailMessage mailMessage)\n        {\n            using (var smtpClient = new SmtpClient(host, port))\n            {\n                await smtpClient.SendMailAsync(mailMessage);\n            }\n        }\n    }\n}<\/pre>\n","protected":false},"excerpt":{"rendered":"","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[6],"tags":[],"class_list":["post-538","post","type-post","status-publish","format-standard","hentry","category-dotnet"],"_links":{"self":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/538","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/comments?post=538"}],"version-history":[{"count":4,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/538\/revisions"}],"predecessor-version":[{"id":2708,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/538\/revisions\/2708"}],"wp:attachment":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/media?parent=538"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/categories?post=538"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/tags?post=538"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}