Beispiel #1
0
        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);
        }