using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Configuration; using System.IO; using System.Linq; using System.Net.Mail; using System.Threading.Tasks; using System.Web; using Common.Logging; using Application.Business.UnitOfWork; using Application.Business.Repository; using System.Text; namespace Application.Business.Service { public class EmailService { static readonly string host; static readonly int port; private class SerializableAttachment { public string Name; public string Content; public string ContentType = "application/octet-stream"; } private class SerializableMailMessage { public string Sender = ""; public string From = ""; public List To = new List(); public List CC = new List(); public List BCC = new List(); public List ReplyTo = new List(); public string Subject = ""; public string Body = ""; public int Priority = 0; public bool IsBodyHtml = true; public List<keyvaluepair<string, string>> Headers = new List<keyvaluepair<string, string>>(); public List Attachments = new List(); } static EmailService() { host = ConfigurationManager.AppSettings["SmtpHost"]; port = Convert.ToInt32(ConfigurationManager.AppSettings["SmtpPort"]); //unitOfWorkFactory = new UnitOfWorkFactory(); //repositoryFactory = new RepositoryFactory(); } private static string GetMailAddressAsString(MailAddress mailAddress) { if (mailAddress != null) { return mailAddress.ToString(); } return null; } private static IEnumerable GetAddressList(MailAddressCollection mailAddressCollection) { if (mailAddressCollection != null) { return mailAddressCollection.Select(e => GetMailAddressAsString(e)).Where(e => !String.IsNullOrWhiteSpace(e)); } return new List(); } private static MailAddress GetMailAddress(string mailAddress) { if (!String.IsNullOrWhiteSpace(mailAddress)) { return new MailAddress(mailAddress); } return null; } private static void AddMailAddresses(MailAddressCollection collection, IEnumerable addresses) { foreach (var address in addresses) { if (!String.IsNullOrWhiteSpace(address)) { collection.Add(new MailAddress(address)); } } } private static byte[] GetAllBytesFromStream(Stream stream) { stream.Position = 0; var bytes = default(byte[]); using (var memstream = new MemoryStream()) { stream.CopyTo(memstream); bytes = memstream.ToArray(); return bytes; } } public static string SerializeMailMessage(MailMessage mailMessage) { var s = new SerializableMailMessage(); s.Sender = GetMailAddressAsString(mailMessage.Sender); s.From = GetMailAddressAsString(mailMessage.From); s.To.AddRange(GetAddressList(mailMessage.To)); s.CC.AddRange(GetAddressList(mailMessage.CC)); s.BCC.AddRange(GetAddressList(mailMessage.Bcc)); s.ReplyTo.AddRange(GetAddressList(mailMessage.ReplyToList)); s.Subject = mailMessage.Subject; s.Body = mailMessage.Body; s.IsBodyHtml = mailMessage.IsBodyHtml; s.Priority = (int)mailMessage.Priority; foreach (var key in mailMessage.Headers.AllKeys) { s.Headers.Add(new KeyValuePair<string, string> (key, mailMessage.Headers[key])); } s.Attachments.AddRange(mailMessage.Attachments.Select(a => { a.ContentStream.Position = 0; return new SerializableAttachment() { Name = a.Name, ContentType = a.ContentType.MediaType, Content = Convert.ToBase64String(GetAllBytesFromStream(a.ContentStream)) }; })); return JsonConvert.SerializeObject(s); } public static MailMessage DeserializeMailMessage(string mailMessageJson) { var s = JsonConvert.DeserializeObject(mailMessageJson); MailMessage message = new MailMessage(); message.Sender = GetMailAddress(s.Sender); message.From = GetMailAddress(s.From); AddMailAddresses(message.To, s.To); AddMailAddresses(message.CC, s.CC); AddMailAddresses(message.Bcc, s.BCC); AddMailAddresses(message.ReplyToList, s.ReplyTo); message.Subject = s.Subject; message.Body = s.Body; message.Priority = (MailPriority)s.Priority; message.IsBodyHtml = s.IsBodyHtml; foreach (var header in s.Headers) { message.Headers[header.Key] = header.Value; } foreach (var attachment in s.Attachments) { var stream = new MemoryStream(); // using or Dispose not needed here memory stream is managed var data = Convert.FromBase64String(attachment.Content); stream.Write(data, 0, data.Length); stream.Position = 0; message.Attachments.Add(new Attachment(stream, attachment.Name, attachment.ContentType)); } return message; } // public static async Task AddEmailToQueue(string from, IEnumerable to, string subject, string body, bool ishtml = false) // { // var message = new MailMessage // { // Subject = subject, // From = new MailAddress(@from), // Body = body, // IsBodyHtml = ishtml // }; //#if DEBUG // to = new[] { ConfigurationManager.AppSettings["DebugEmailAddress"]}; //#endif // foreach (var address in to) // { // if (!String.IsNullOrEmpty(address)) // { // message.To.Add(address); // } // } // await AddEmailToQueue(message); // } //public static async Task AddEmailToQueue(MailMessage mailMessage) { // var mailMessageJson = SerializeMailMessage(mailMessage); // using (var unitOfWork = unitOfWorkFactory.Create()) // { // var repository = repositoryFactory.Create(unitOfWork); // var emailQueueRepository = repositoryFactory.Create(unitOfWork); // var emailQueueItem = new EmailQueueItem(); // emailQueueItem.Id = Guid.NewGuid(); // emailQueueItem.InsertedAt = DateTime.Now; // emailQueueItem.LastException = String.Empty; // emailQueueItem.LastProcessedAt = null; // emailQueueItem.EmailFrom = GetMailAddressAsString(mailMessage.From); // emailQueueItem.EmailTo = String.Join(";", mailMessage.To.Select(e => e.ToString())); // emailQueueItem.EmailSubject = mailMessage.Subject; // emailQueueItem.EmailContent = mailMessageJson; // emailQueueRepository.Add(emailQueueItem); // await unitOfWork.ValidateAndCommitAsync(); // } // try // { // ScheduledTaskService.TriggerTaskNow(); // } // catch (Exception ex) // { // log.Error("Failed to start ProcessEmailQueueTask at EmailService.AddEmailToQueue()", ex); // // Ignore this error and continue; the task wil be started regularly // } //} public static async Task SendMailNoQueueAsync(string from, IEnumerable to, string subject, string body) { var message = new MailMessage { Subject = subject, From = new MailAddress(@from), Body = body, BodyEncoding = Encoding.UTF8, IsBodyHtml = true }; foreach (var address in to) { message.To.Add(address); } await SendMailNoQueueAsync(message); } public static async Task SendMailNoQueueAsync(MailMessage mailMessage) { using (var smtpClient = new SmtpClient(host, port)) { await smtpClient.SendMailAsync(mailMessage); } } } }
53800cookie-checkC# EmailService