Beispiel #1
0
 internal protected abstract ComponentResult OnSend(MessageInfo <TMessage> messageInfo, MessagingServiceBase <TMessage> service);
Beispiel #2
0
        /// <summary>
        /// См. <see cref="OutcomingMessageSender{TMessage}.OnSend(MessageInfo{TMessage}, MessagingServiceBase{TMessage})"/>.
        /// </summary>
        internal protected override ComponentResult OnSend(MessageInfo <EmailMessage> message, MessagingServiceBase <EmailMessage> service)
        {
            try
            {
                var mailMessage = new MailMessage()
                {
                    From            = new MailAddress(message.Message.From.ContactData, string.IsNullOrEmpty(message.Message.From.Name) ? message.Message.From.ContactData : message.Message.From.Name),
                    SubjectEncoding = Encoding.UTF8,
                    Subject         = message.Message.Subject,
                    IsBodyHtml      = true,
                    BodyEncoding    = Encoding.UTF8,
                    Body            = message.Message.Body?.ToString(),
                };

                if (service is EmailService && service is IDebugSupported emailService && emailService.IsDebugModeEnabled())
                {
                    var debugEmail = emailService.GetDebugRecipient();
                    if (string.IsNullOrEmpty(debugEmail))
                    {
                        return(ComponentResult.NotHandled);
                    }

                    message.Message.To.ForEach(x => mailMessage.To.Add(new MailAddress(debugEmail, string.IsNullOrEmpty(x.Name) ? x.ContactData : x.Name)));
                }
                else
                {
                    message.Message.To.ForEach(x => mailMessage.To.Add(new MailAddress(x.ContactData, string.IsNullOrEmpty(x.Name) ? x.ContactData : x.Name)));
                }

                try
                {
                    if (_isIgnoreCertErrors && ServicePointManager.ServerCertificateValidationCallback != _certCallback)
                    {
                        ServicePointManager.ServerCertificateValidationCallback = _certCallback;
                    }
                    getClient().Send(mailMessage);
                    return(ComponentResult.Complete);
                }
                catch (System.Security.Authentication.AuthenticationException ex)
                {
                    if (DateTime.Now > _certErrorTimeout)
                    {
                        service.RegisterServiceEvent(EventType.Error, "SMTP - ошибка отправки письма", "Ошибка проверки сертификата", ex);
                        _certErrorTimeout = DateTime.Now.AddMinutes(15);
                    }
                    return(ComponentResult.NotHandled);
                }
                catch (SmtpException ex)
                {
                    if (ex.Message.Contains("5.7.1 Client does not have permissions to send as this sender"))
                    {
                        return(ComponentResult.Error($"У пользователя, от имени которого выполняется подключение к почтовому серверу, недостаточно прав для отправки писем от имени '{message.Message.From.ContactData}'."));
                    }

                    var canBeResend = true;
                    service.RegisterServiceEvent(EventType.Error, "SMTP - ошибка отправки письма", null, ex);
                    //if (ex.Message.Contains("Message rejected: Email address is not verified"))
                    //{
                    //    var match = System.Text.RegularExpressions.Regex.Match(ex.Message, "Message rejected: Email address is not verified. The following identities failed the check in region ([^:]+): (.+)");
                    //    if (match.Success)
                    //    {
                    //        throw new Exception($"Добавьте адрес '{match.Groups[2].Value}' в раздел 'Identity Management/Email Addresses', либо снимите ограничения на отправку писем в регионе '{match.Groups[1].Value}'.");
                    //    }
                    //    canBeResend = false;
                    //}

                    if (canBeResend)
                    {
                        switch (ex.StatusCode)
                        {
                        case SmtpStatusCode.ServiceClosingTransmissionChannel:
                        case SmtpStatusCode.ServiceNotAvailable:
                        case SmtpStatusCode.TransactionFailed:
                        case SmtpStatusCode.GeneralFailure:
                            try
                            {
                                _client.Dispose();
                                InitClient();
                            }
                            catch { }

                            getClient().Send(mailMessage);
                            return(ComponentResult.Complete);

                        default:
                            throw;
                        }
                    }
                    else
                    {
                        throw;
                    }
                }

                //todo добавить прикрепление файлов в отправку писем.
                //if (is_array($files) && count($files) > 0)
                //	foreach ($files as $k=>$v)
                //	{
                //		if (isset($v['url"]) && isset($v['name"]))
                //			$mail->AddAttachment(SITE_PATH.$v['url"], $v['name"].'.'.pathinfo($v['url"], PATHINFO_EXTENSION));
                //		else if (isset($v['path"]) && isset($v['name"]))
                //			$mail->AddAttachment($v['path"], $v['name"]);
                //	}

                //$success = $mail->send();
            }
 internal protected abstract ReceivedMessageInfo <TMessage> OnBeginReceive(MessagingServiceBase <TMessage> service);
 internal protected abstract bool OnEndReceive(bool isSuccess, ReceivedMessageInfo <TMessage> messageInfo, MessagingServiceBase <TMessage> service);
 internal protected abstract List <ReceivedMessageInfo <TMessage> > OnReceive(MessagingServiceBase <TMessage> service);