Example #1
0
        public async Task <bool> SendMailAsync(MailMessage message, IMailServerSettings settings)
        {
            var smtpSettings = settings as SmtpMailServerSettings;

            if (string.IsNullOrEmpty(smtpSettings.Host))
            {
                return(false);
            }

            using (var smtp = new SmtpClient())
            {
                smtp.Host = smtpSettings.Host.Trim();

                if (smtpSettings.Port > 0)
                {
                    smtp.Port = smtpSettings.Port;
                }

                if (smtpSettings.RequiresAuthentication)
                {
                    smtp.Credentials = new System.Net.NetworkCredential(smtpSettings.Username, smtpSettings.Password);
                }

                smtp.EnableSsl = smtpSettings.RequiresSsl;

                smtp.Timeout = smtpSettings.ConnectionTimeout;

                await smtp.SendMailAsync(message);
            }

            return(true);
        }
Example #2
0
        public async Task <bool> SendMailAsync(MailMessage message, IMailServerSettings settings)
        {
            var mgSettings = settings as MailgunMailServerSettings;

            if (string.IsNullOrEmpty(mgSettings.Domain))
            {
                return(false);
            }

            var request = new MultipartRequest();

            if (message.Subject != null)
            {
                request.AddField("subject", message.Subject);
            }

            if (message.From != null)
            {
                request.AddField("from", ComposeEmailDisplayAndAddress(message.From.DisplayName, message.From.Address));
            }

            if (message.To != null && message.To.Count > 0)
            {
                foreach (var to in message.To)
                {
                    request.AddField("to", ComposeEmailDisplayAndAddress(to.DisplayName, to.Address));
                }
            }

            if (message.CC != null)
            {
                foreach (var to in message.CC)
                {
                    request.AddField("cc", ComposeEmailDisplayAndAddress(to.DisplayName, to.Address));
                }
            }

            if (message.Bcc != null)
            {
                foreach (var to in message.Bcc)
                {
                    request.AddField("bcc", ComposeEmailDisplayAndAddress(to.DisplayName, to.Address));
                }
            }

            if (message.ReplyToList != null && message.ReplyToList.Count > 0)
            {
                request.AddField("h:Reply-To",
                                 string.Join(",",
                                             message.ReplyToList.Select(x => ComposeEmailDisplayAndAddress(x.DisplayName, x.Address))));
            }

            foreach (var key in message.Headers.AllKeys)
            {
                if (key.StartsWith("h:") || key.StartsWith("o:") || key.StartsWith("v:"))
                {
                    var values = message.Headers.GetValues(key);
                    foreach (var value in values)
                    {
                        request.AddField(key, value);
                    }
                }
                else if (key.StartsWith("Mailgun:")) // Any mailgun header to pass. "Mailgun:" will be stripped from the key.
                {
                    var values  = message.Headers.GetValues(key);
                    var keyPart = key.Remove(0, 8);
                    foreach (var value in values)
                    {
                        request.AddField(keyPart, value);
                    }
                }
                else if (key == "X-Mailgun-Tag") // Compatibility with SMTP api
                {
                    var values = message.Headers.GetValues(key);
                    foreach (var value in values)
                    {
                        request.AddField("o:tag", value);
                    }
                }
            }

            var hasHtmlBody = false;
            var hasTextBody = false;

            if (!string.IsNullOrWhiteSpace(message.Body))
            {
                request.AddField(message.IsBodyHtml ? "html" : "text", message.Body);
                if (message.IsBodyHtml)
                {
                    hasHtmlBody = true;
                }
                else
                {
                    hasTextBody = true;
                }
            }

            if (!hasHtmlBody)
            {
                var content = message.AlternateViews.FirstOrDefault(x => x.ContentType.MediaType == "text/html");
                if (content != null)
                {
                    request.AddField("html", content);
                }
            }

            if (!hasTextBody)
            {
                var content = message.AlternateViews.FirstOrDefault(x => x.ContentType.MediaType == "text/plain");
                if (content != null)
                {
                    request.AddField("text", content);
                }
            }

            if (message.Attachments != null)
            {
                foreach (var attachment in message.Attachments)
                {
                    var fileStream = attachment.ContentStream as FileStream;
                    if (fileStream == null)
                    {
                        continue;
                    }

                    if (attachment.ContentDisposition.Inline)
                    {
                        request.AddFile(
                            "inline",
                            fileStream.Name,
                            attachment.ContentId,
                            attachment.ContentType.MediaType);
                    }
                    else
                    {
                        request.AddFile(
                            "attachment",
                            fileStream.Name,
                            attachment.Name,
                            attachment.ContentType.MediaType);
                    }
                }
            }

            var url = string.Format("https://api.mailgun.net/v3/{0}/messages", mgSettings.Domain);

            var webRequest = (HttpWebRequest)WebRequest.Create(url);

            webRequest.Method      = "POST";
            webRequest.ContentType = request.ContentTypeHeader;
            webRequest.Timeout     = mgSettings.ConnectionTimeout;

            webRequest.Headers.Add("Authorization", "basic " + Convert.ToBase64String(Encoding.ASCII.GetBytes($"api:{mgSettings.ApiKey}")));

            using (var stream = await webRequest.GetRequestStreamAsync())
            {
                await request.SendAsync(stream);
            }

            try
            {
                using (var response = (HttpWebResponse)(await webRequest.GetResponseAsync()))
                {
                    if (response == null || response.StatusCode != HttpStatusCode.OK)
                    {
                        throw new WebException(
                                  string.Format("Status {0} returned from MailGun API",
                                                response == null ? 0 : (Int32)response.StatusCode));
                    }

                    if (!response.ContentType.StartsWith("application/json"))
                    {
                        throw new WebException(
                                  string.Format("Invalid response returned from MailGun API",
                                                response == null ? 0 : (Int32)response.StatusCode));
                    }
                }
            }
            catch (WebException ex)
            {
                HttpWebResponse response = null;

                if (ex.Response != null)
                {
                    response = (HttpWebResponse)ex.Response;
                }

                // Figure out more data about the error
                string responseData = "";

                try
                {
                    responseData = new StreamReader(response.GetResponseStream()).ReadToEnd();
                }
                catch
                {
                    // Rethrow default
                    throw ex;
                }

                // Rethrow
                throw new WebException(ex.Message + ": " + responseData, ex, ex.Status, ex.Response);
            }

            return(true); // Consumed it
        }