public async Task <ServiceResult> SendPasswordResetEmailAsync(string token, string email) { var result = new ServiceResult(); var user = await users.FindByEmailAsync(email); if (user == null) { result.Errors.Add(new ServiceResult.Error { Key = nameof(Errors.UserNotFound), Message = Errors.UserNotFound }); result.Code = 404; return(result); } // We need to encode the token since it will be used in a reset link. var encodedToken = HttpUtility.UrlEncode(token); var baseUrl = hosting.IsDevelopment() ? "https://localhost:52215" : "https://passport.slash.gg"; var link = $"{baseUrl}/password-reset?token={encodedToken}&id={user.Id}"; var model = new PasswordResetTemplateData { ResetLink = link, UserName = user.UserName }; var message = new SendGridMessage(); message.SetupNoReplyMessage(PASSWORD_RESET_TEMPLATE_ID, email, model); var response = await client.SendEmailAsync(message); if (response.StatusCode != System.Net.HttpStatusCode.Accepted) { var raw = await response.Body.ReadAsStringAsync(); var data = JsonConvert.DeserializeObject <SendGridError>(raw); foreach (var error in data.Errors) { result.Errors.Add(new ServiceResult.Error { Key = error.Field, Message = error.Message }); } result.Code = 500; } return(result); }
/// <summary> /// Utilizes transactional templates and the SendGrid dynamic content API to create/send /// a password reset email. /// </summary> public Task ExecutePasswordReset(string apiKey, string email, string passResetUrl) { var dynamicTemplateData = new PasswordResetTemplateData() { PassResetUrl = passResetUrl }; var client = new SendGridClient(apiKey); var msg = new SendGridMessage() { TemplateId = "d-b42fcf5f2418464fb32a1178fdd53ad3", From = new EmailAddress("*****@*****.**", Options.SendGridUser), }; msg.SetTemplateData(dynamicTemplateData); msg.AddTo(new EmailAddress(email)); // Disable click tracking. // See https://sendgrid.com/docs/User_Guide/Settings/tracking.html msg.SetClickTracking(false, false); return(client.SendEmailAsync(msg)); }