public async Task SendPasswordResetEmailAsync( ISiteContext siteSettings, string toAddress, string subject, string resetUrl) { SmtpOptions smtpOptions = GetSmptOptions(siteSettings); if (smtpOptions == null) { var logMessage = $"failed to send password reset email because smtp settings are not populated for site {siteSettings.SiteName}"; log.LogError(logMessage); return; } EmailSender sender = new EmailSender(); // in account controller we are calling this method without await // so it doesn't block the UI. Which means it is running on a background thread // similar as the old ThreadPool.QueueWorkItem // as such we need to handle any error that may happen so it doesn't // brind down the thread or the process try { var plainTextMessage = await viewRenderer.RenderViewAsString <string>("EmailTemplates/PasswordResetTextEmail", resetUrl); var htmlMessage = await viewRenderer.RenderViewAsString <string>("EmailTemplates/PasswordResetHtmlEmail", resetUrl); await sender.SendEmailAsync( smtpOptions, toAddress, siteSettings.DefaultEmailFromAddress, subject, plainTextMessage, htmlMessage).ConfigureAwait(false); } catch (Exception ex) { log.LogError("error sending password reset email", ex); } }
public async Task AccountPendingApprovalAdminNotification( ISiteContext siteSettings, ISiteUser user) { if (siteSettings.AccountApprovalEmailCsv.Length == 0) { return; } SmtpOptions smtpOptions = GetSmptOptions(siteSettings); if (smtpOptions == null) { var logMessage = $"failed to send new account notifications to admins because smtp settings are not populated for site {siteSettings.SiteName}"; log.LogError(logMessage); return; } string subject = "新用户审批"; EmailSender sender = new EmailSender(); try { var plainTextMessage = await viewRenderer.RenderViewAsString <ISiteUser>("EmailTemplates/AccountPendingApprovalAdminNotificationTextEmail", user).ConfigureAwait(false); var htmlMessage = await viewRenderer.RenderViewAsString <ISiteUser>("EmailTemplates/AccountPendingApprovalAdminNotificationHtmlEmail", user).ConfigureAwait(false); await sender.SendMultipleEmailAsync( smtpOptions, siteSettings.AccountApprovalEmailCsv, siteSettings.DefaultEmailFromAddress, subject, plainTextMessage, htmlMessage).ConfigureAwait(false); } catch (Exception ex) { log.LogError("error sending email verification email", ex); } }
private SmtpOptions GetSmptOptions(ISiteContext siteSettings) { if (string.IsNullOrWhiteSpace(siteSettings.SmtpServer)) { return(globalSmtpSettings); } SmtpOptions smtpOptions = new SmtpOptions(); smtpOptions.Password = siteSettings.SmtpPassword; smtpOptions.Port = siteSettings.SmtpPort; smtpOptions.PreferredEncoding = siteSettings.SmtpPreferredEncoding; smtpOptions.RequiresAuthentication = siteSettings.SmtpRequiresAuth; smtpOptions.Server = siteSettings.SmtpServer; smtpOptions.User = siteSettings.SmtpUser; smtpOptions.UseSsl = siteSettings.SmtpUseSsl; return(smtpOptions); }
public async Task SendAccountConfirmationEmailAsync( ISiteContext siteSettings, string toAddress, string subject, string confirmationUrl) { SmtpOptions smtpOptions = GetSmptOptions(siteSettings); if (smtpOptions == null) { var logMessage = $"failed to send account confirmation email because smtp settings are not populated for site {siteSettings.SiteName}"; log.LogError(logMessage); return; } EmailSender sender = new EmailSender(); try { var plainTextMessage = await viewRenderer.RenderViewAsString <string>("EmailTemplates/ConfirmAccountTextEmail", confirmationUrl).ConfigureAwait(false); var htmlMessage = await viewRenderer.RenderViewAsString <string>("EmailTemplates/ConfirmAccountHtmlEmail", confirmationUrl).ConfigureAwait(false); await sender.SendEmailAsync( smtpOptions, toAddress, siteSettings.DefaultEmailFromAddress, subject, plainTextMessage, htmlMessage).ConfigureAwait(false); } catch (Exception ex) { log.LogError("error sending account confirmation email", ex); } }
public async Task SendEmailAsync( SmtpOptions smtpOptions, string to, string from, string subject, string plainTextMessage, string htmlMessage, string replyTo = null) { if (string.IsNullOrWhiteSpace(to)) { throw new ArgumentException("no to address provided"); } if (string.IsNullOrWhiteSpace(from)) { throw new ArgumentException("no from address provided"); } if (string.IsNullOrWhiteSpace(subject)) { throw new ArgumentException("no subject provided"); } var hasPlainText = !string.IsNullOrWhiteSpace(plainTextMessage); var hasHtml = !string.IsNullOrWhiteSpace(htmlMessage); if (!hasPlainText && !hasHtml) { throw new ArgumentException("no message provided"); } var m = new MimeMessage(); m.From.Add(new MailboxAddress("", from)); if (!string.IsNullOrWhiteSpace(replyTo)) { m.ReplyTo.Add(new MailboxAddress("", replyTo)); } m.To.Add(new MailboxAddress("", to)); m.Subject = subject; //m.Importance = MessageImportance.Normal; //Header h = new Header(HeaderId.Precedence, "Bulk"); //m.Headers.Add() BodyBuilder bodyBuilder = new BodyBuilder(); if (hasPlainText) { bodyBuilder.TextBody = plainTextMessage; } if (hasHtml) { bodyBuilder.HtmlBody = htmlMessage; } m.Body = bodyBuilder.ToMessageBody(); using (var client = new SmtpClient()) { //client.ServerCertificateValidationCallback = delegate ( // Object obj, X509Certificate certificate, X509Chain chain, // SslPolicyErrors errors) //{ // return (true); //}; await client.ConnectAsync( smtpOptions.Server, smtpOptions.Port, smtpOptions.UseSsl) .ConfigureAwait(false); //await client.ConnectAsync(smtpOptions.Server, smtpOptions.Port, SecureSocketOptions.StartTls); // Note: since we don't have an OAuth2 token, disable // the XOAUTH2 authentication mechanism. client.AuthenticationMechanisms.Remove("XOAUTH2"); // Note: only needed if the SMTP server requires authentication if (smtpOptions.RequiresAuthentication) { await client.AuthenticateAsync(smtpOptions.User, smtpOptions.Password) .ConfigureAwait(false); } await client.SendAsync(m).ConfigureAwait(false); await client.DisconnectAsync(true).ConfigureAwait(false); } }