private async Task SendMessageAsync(string email, string subject, string body, Guid messageId) { var auditMessage = new UpdateAuditMessageEvent { MessageId = messageId.ToString() }; try { var message = new MimeMessage(); message.From.Add(_senderAddress); message.To.Add(new MailboxAddress(email)); message.Subject = subject; message.Body = new TextPart("html") { Text = body }; using (var mailClient = _mailClientFactory.CreateMailClient()) { // For demo-purposes, accept all SSL certificates (in case the server supports STARTTLS) mailClient.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true; await mailClient.ConnectAsync(_host, _port, _useSsl); if (_useAuth) { await mailClient.AuthenticateAsync(_username, _password); } await mailClient.SendAsync(message); auditMessage.DeliveryStatus = DeliveryStatus.Ok; auditMessage.SentTimestamp = DateTime.UtcNow; await _auditMessagePublisher.PublishAsync(auditMessage); await mailClient.DisconnectAsync(true); } } catch (Exception e) { var errorMessage = $"Mail with id \"{messageId}\" could not be sent for email: \"{email.SanitizeEmail()}\" with subject: \"{subject}\""; _log.Error(e, errorMessage); auditMessage.DeliveryStatus = DeliveryStatus.Error; auditMessage.SentTimestamp = DateTime.UtcNow; auditMessage.DeliveryComment = $"{errorMessage}{Environment.NewLine}{e.Message}"; await _auditMessagePublisher.PublishAsync(auditMessage); } }
public async Task ProcessPushNotificationAsync( Guid messageId, string pushRegistrationId, string message, string customPayload, string messageGroupId, Dictionary <string, string> messageParameters) { var customPayloadDict = !string.IsNullOrWhiteSpace(customPayload) ? JsonConvert.DeserializeObject <Dictionary <string, string> >(customPayload) : new Dictionary <string, string>(); if (!string.IsNullOrWhiteSpace(messageGroupId)) { customPayloadDict.TryAdd("MessageGroupId", messageGroupId); } if (messageParameters != null && messageParameters.Count > 0) { foreach (var messageParameter in messageParameters) { if (customPayloadDict.ContainsKey(messageParameter.Key)) { _log.Warning( $"Message parameter with key {messageParameter.Key} already exists in CustomPayload", messageParameter.Key); } else { customPayloadDict.Add(messageParameter.Key, messageParameter.Value); } } } var request = new SendPushNotificationRequest { MessageId = messageId.ToString(), CustomPayload = customPayloadDict, Message = message, PushRegistrationId = pushRegistrationId }; var response = await _pushProviderClient.Api.SendPushNotificationAsync(request); var auditMessage = new UpdateAuditMessageEvent { MessageId = messageId.ToString(), SentTimestamp = DateTime.UtcNow }; if (response.Result != ResultCode.Ok) { var errorMessage = $"Could not send PUSH for registration {pushRegistrationId}: {response.ErrorMessage}"; _log.Error(message: errorMessage, context: new { messageId }); auditMessage.DeliveryStatus = DeliveryStatus.Error; auditMessage.DeliveryComment = errorMessage; } else { auditMessage.DeliveryStatus = DeliveryStatus.Ok; } await _auditMessagePublisher.PublishAsync(auditMessage); }
public async Task ProcessSmsMessageAsync(string phoneNumber, string message, Guid messageId) { if (string.IsNullOrEmpty(phoneNumber)) { _log.Warning("Phone number must not be empty", context: new { messageId }); return; } // Get providers matching this phone number var rule = _smsProviderRulesService.GetSmsProviderRule(phoneNumber); var providers = rule?.SmsProviders; var auditMessage = new UpdateAuditMessageEvent { MessageId = messageId.ToString() }; if (providers == null) { var errorMessage = "Could not find any sms providers to match with phone number"; _log.Error(message: errorMessage, context: new { messageId }); auditMessage.DeliveryStatus = DeliveryStatus.Error; auditMessage.DeliveryComment = errorMessage; auditMessage.SentTimestamp = DateTime.UtcNow; await _auditMessagePublisher.PublishAsync(auditMessage); return; } // Try to send SMS provider by provider - one should succeed foreach (var provider in providers) { var client = _smsProviderClientFactory.CreateClient(provider.ServiceUrl); SmsSenderResult response; try { response = await client.Api.SendSmsAsync(new SendSmsRequestModel { PhoneNumber = phoneNumber, Message = message, MessageId = messageId }); } catch (Exception e) { var errorMessage = "Could not send SMS with specific provider"; _log.Error(e, errorMessage, new { messageId, Provider = provider.Name }); auditMessage.DeliveryStatus = DeliveryStatus.Error; auditMessage.DeliveryComment = $"{errorMessage}{Environment.NewLine}{e.Message}"; auditMessage.SentTimestamp = DateTime.UtcNow; await _auditMessagePublisher.PublishAsync(auditMessage); continue; } if (response.Result != SmsResult.Ok) { var errorMessage = $"Could not send SMS with provider {provider.Name}: {response.ErrorMessage}"; _log.Warning(errorMessage, context: new { messageId }); auditMessage.DeliveryStatus = DeliveryStatus.Error; auditMessage.DeliveryComment = errorMessage; auditMessage.SentTimestamp = DateTime.UtcNow; await _auditMessagePublisher.PublishAsync(auditMessage); continue; } _log.Info("SMS sent successfully", new { messageId }); auditMessage.DeliveryStatus = DeliveryStatus.Ok; auditMessage.SentTimestamp = DateTime.UtcNow; await _auditMessagePublisher.PublishAsync(auditMessage); return; } var errorMsg = "Could not send SMS with all available providers."; _log.Error(message: errorMsg, context: new { messageId }); auditMessage.DeliveryStatus = DeliveryStatus.Error; auditMessage.DeliveryComment = errorMsg; auditMessage.SentTimestamp = DateTime.UtcNow; await _auditMessagePublisher.PublishAsync(auditMessage); }