public Task SendEmailAsync(Models.Mail.MailMessage message)
        {
            var client = new SmtpClient(_globalSettings.Mail.Smtp.Host, _globalSettings.Mail.Smtp.Port);

            client.EnableSsl             = _globalSettings.Mail.Smtp.Ssl;
            client.UseDefaultCredentials = _globalSettings.Mail.Smtp.UseDefaultCredentials;
            client.DeliveryMethod        = SmtpDeliveryMethod.Network;

            if (!string.IsNullOrWhiteSpace(_globalSettings.Mail.Smtp.Username) &&
                !string.IsNullOrWhiteSpace(_globalSettings.Mail.Smtp.Password))
            {
                client.Credentials = new NetworkCredential(_globalSettings.Mail.Smtp.Username,
                                                           _globalSettings.Mail.Smtp.Password);
            }

            var smtpMessage = new MailMessage();

            smtpMessage.From                 = new MailAddress(_globalSettings.Mail.ReplyToEmail, _globalSettings.SiteName);
            smtpMessage.Subject              = message.Subject;
            smtpMessage.SubjectEncoding      = Encoding.UTF8;
            smtpMessage.BodyEncoding         = Encoding.UTF8;
            smtpMessage.BodyTransferEncoding = System.Net.Mime.TransferEncoding.QuotedPrintable;
            foreach (var address in message.ToEmails)
            {
                smtpMessage.To.Add(new MailAddress(address));
            }

            if (string.IsNullOrWhiteSpace(message.TextContent))
            {
                smtpMessage.IsBodyHtml = true;
                smtpMessage.Body       = message.HtmlContent;
            }
            else
            {
                smtpMessage.Body = message.TextContent;
                var htmlView = AlternateView.CreateAlternateViewFromString(message.HtmlContent);
                htmlView.ContentType = new System.Net.Mime.ContentType("text/html");
                smtpMessage.AlternateViews.Add(htmlView);
            }

            client.SendCompleted += (sender, e) =>
            {
                if (e.Error != null)
                {
                    _logger.LogError(e.Error, "Mail send failed.");
                }

                if (e.Cancelled)
                {
                    _logger.LogWarning("Mail send canceled.");
                }

                smtpMessage.Dispose();
                client.Dispose();
            };

            client.SendAsync(smtpMessage, null);
            return(Task.FromResult(0));
        }
Esempio n. 2
0
        public async Task SendEmailAsync(Models.Mail.MailMessage message)
        {
            var httpClient = _clientFactory.CreateClient("PostalMailDeliveryService");

            httpClient.DefaultRequestHeaders.Add("X-Server-API-Key", _globalSettings.Mail.PostalApiKey);

            var request = new PostalRequest
            {
                subject   = message.Subject,
                from      = _from,
                reply_to  = _reply,
                html_body = message.HtmlContent,
                to        = new List <string>(),
                tag       = _baseTag
            };

            foreach (var address in message.ToEmails)
            {
                request.to.Add(CoreHelpers.PunyEncode(address));
            }

            if (message.BccEmails != null)
            {
                request.bcc = new List <string>();
                foreach (var address in message.BccEmails)
                {
                    request.bcc.Add(CoreHelpers.PunyEncode(address));
                }
            }

            if (!string.IsNullOrWhiteSpace(message.TextContent))
            {
                request.plain_body = message.TextContent;
            }

            if (!string.IsNullOrWhiteSpace(message.Category))
            {
                request.tag = string.Concat(request.tag, "-Cat_", message.Category);
            }

            var responseMessage = await httpClient.PostAsJsonAsync(
                $"https://{_globalSettings.Mail.PostalDomain}/api/v1/send/message",
                request);

            if (responseMessage.IsSuccessStatusCode)
            {
                var response = await responseMessage.Content.ReadFromJsonAsync <PostalResponse>();

                if (response.status != "success")
                {
                    _logger.LogError("Postal send status was not successful: {0}, {1}",
                                     response.status, response.message);
                }
            }
            else
            {
                _logger.LogError("Postal send failed: {0}", responseMessage.StatusCode);
            }
        }
        public async Task SendEmailAsync(Models.Mail.MailMessage message)
        {
            var mimeMessage = new MimeMessage();

            mimeMessage.From.Add(new MailboxAddress(_globalSettings.SiteName, _globalSettings.Mail.ReplyToEmail));
            mimeMessage.Subject = message.Subject;
            if (!string.IsNullOrWhiteSpace(_replyDomain))
            {
                mimeMessage.MessageId = $"<{Guid.NewGuid()}@{_replyDomain}>";
            }

            foreach (var address in message.ToEmails)
            {
                mimeMessage.To.Add(new MailboxAddress(address));
            }

            if (message.BccEmails != null)
            {
                foreach (var address in message.BccEmails)
                {
                    mimeMessage.Bcc.Add(new MailboxAddress(address));
                }
            }

            var builder = new BodyBuilder();

            if (!string.IsNullOrWhiteSpace(message.TextContent))
            {
                builder.TextBody = message.TextContent;
            }
            builder.HtmlBody = message.HtmlContent;
            mimeMessage.Body = builder.ToMessageBody();

            using (var client = new SmtpClient())
            {
                if (_globalSettings.Mail.Smtp.TrustServer)
                {
                    client.ServerCertificateValidationCallback = (s, c, h, e) => true;
                }

                var useSsl = _globalSettings.Mail.Smtp.Port == 587 && !_globalSettings.Mail.Smtp.SslOverride ?
                             false : _globalSettings.Mail.Smtp.Ssl;
                await client.ConnectAsync(_globalSettings.Mail.Smtp.Host, _globalSettings.Mail.Smtp.Port, useSsl);

                if (!string.IsNullOrWhiteSpace(_globalSettings.Mail.Smtp.Username) &&
                    !string.IsNullOrWhiteSpace(_globalSettings.Mail.Smtp.Password))
                {
                    await client.AuthenticateAsync(_globalSettings.Mail.Smtp.Username,
                                                   _globalSettings.Mail.Smtp.Password);
                }

                await client.SendAsync(mimeMessage);

                await client.DisconnectAsync(true);
            }
        }