Esempio n. 1
0
        public void Send(EmailMessage email, SmtpHost host, ICredentials credentials,
            IEnumerable<Attachment> attachments)
        {
            if (string.IsNullOrWhiteSpace(email.SentTo))
            {
                throw new ArgumentNullException(email.SentTo);
            }

            if (string.IsNullOrWhiteSpace(email.Message))
            {
                throw new ArgumentNullException(email.Message);
            }

            string[] addresses = email.SentTo.Split(',');
            foreach (string address in addresses)
            {
                Validator validator = new Validator(address);
                validator.Validate();

                if (!validator.IsValid)
                {
                    return;
                }
            }

            addresses = addresses.Distinct().ToArray();
            email.SentTo = string.Join(",", addresses);
            email.Status = Status.Executing;

            ThreadPool.QueueUserWorkItem(callback =>
            {
                MailAddress sender = new MailAddress(email.FromEmail, email.FromName);

                using (MailMessage mail = new MailMessage(email.FromEmail, email.SentTo))
                {
                    foreach (var attachment in attachments)
                    {
                        mail.Attachments.Add(attachment);
                    }

                    mail.From = sender;
                    using (SmtpClient smtp = new SmtpClient(host.Address, host.Port))
                    {
                        smtp.DeliveryMethod = host.DeliveryMethod;
                        smtp.PickupDirectoryLocation = host.PickupDirectory;

                        smtp.EnableSsl = host.EnableSSL;
                        smtp.UseDefaultCredentials = false;
                        smtp.Credentials = new NetworkCredential(credentials.Username, credentials.Password);
                        try
                        {
                            mail.Subject = email.Subject;
                            mail.Body = email.Message;
                            mail.IsBodyHtml = true;
                            mail.SubjectEncoding = Encoding.UTF8;
                            email.Status = Status.Completed;

                            smtp.Send(mail);
                        }
                        catch (SmtpException ex)
                        {
                            email.Status = Status.Failed;
                            Log.Warning(@"Could not send email to {To}. {Ex}. ", email.SentTo, ex);
                        }
                    }
                }
            });
        }
Esempio n. 2
0
        public async Task<bool> Send(EmailMessage email, SmtpHost host, ICredentials credentials,
            bool deleteAttachmentes, params string[] attachments)
        {
            if (string.IsNullOrWhiteSpace(email.SentTo))
            {
                throw new ArgumentNullException(email.SentTo);
            }

            if (string.IsNullOrWhiteSpace(email.Message))
            {
                throw new ArgumentNullException(email.Message);
            }

            string[] addresses = email.SentTo.Split(',');
            foreach (string address in addresses)
            {
                Validator validator = new Validator(address);
                validator.Validate();

                if (!validator.IsValid)
                {
                    return false;
                }
            }

            addresses = addresses.Distinct().ToArray();
            email.SentTo = string.Join(",", addresses);
            email.Status = Status.Executing;

            MailAddress sender = new MailAddress(email.FromEmail, email.FromName);

            using (MailMessage mail = new MailMessage(email.FromEmail, email.SentTo))
            {
                if (attachments != null)
                {
                    foreach (string file in attachments)
                    {
                        if (!string.IsNullOrWhiteSpace(file))
                        {
                            if (File.Exists(file))
                            {
                                Attachment attachment = new Attachment(file, MediaTypeNames.Application.Octet);

                                ContentDisposition disposition = attachment.ContentDisposition;
                                disposition.CreationDate = File.GetCreationTime(file);
                                disposition.ModificationDate = File.GetLastWriteTime(file);
                                disposition.ReadDate = File.GetLastAccessTime(file);

                                disposition.FileName = Path.GetFileName(file);
                                disposition.Size = new FileInfo(file).Length;
                                disposition.DispositionType = DispositionTypeNames.Attachment;

                                mail.Attachments.Add(attachment);
                            }
                        }
                    }
                }


                mail.From = sender;
                using (SmtpClient smtp = new SmtpClient(host.Address, host.Port))
                {
                    smtp.DeliveryMethod = host.DeliveryMethod;
                    smtp.PickupDirectoryLocation = host.PickupDirectory;

                    smtp.EnableSsl = host.EnableSSL;
                    smtp.UseDefaultCredentials = false;
                    smtp.Credentials = new NetworkCredential(credentials.Username, credentials.Password);
                    try
                    {
                        mail.Subject = email.Subject;
                        mail.Body = email.Message;
                        mail.IsBodyHtml = true;
                        mail.SubjectEncoding = Encoding.UTF8;
                        email.Status = Status.Completed;

                        await smtp.SendMailAsync(mail);
                        return true;
                    }
                    catch (SmtpException ex)
                    {
                        email.Status = Status.Failed;
                        Log.Warning(@"Could not send email to {To}. {Ex}. ", email.SentTo, ex);
                    }
                    finally
                    {
                        foreach (IDisposable item in mail.Attachments)
                        {
                            if (item != null)
                            {
                                item.Dispose();
                            }
                        }

                        if (deleteAttachmentes)
                        {
                            this.DeleteFiles(attachments);
                        }
                    }
                }
            }

            return false;
        }