Случайное исключение System.Net.Mail.SmtpFailedRecipientsException — релейная учетная запись office365

У нас есть приложение, которое работает на компьютере с Windows Server 2008. Он отправляет электронные письма, используя учетную запись smtp relay office365. Однако не все электронные письма успешно отправляются. Мы случайным образом получаем эти два исключения для электронных писем, отправляемых по вызову smtp.Send:

  1. System.Net.Mail.SmtpFailedRecipientsException: невозможно отправить всем получателям. ---> System.Net.Mail.SmtpFailedRecipientException: Почтовый ящик недоступен. Ответ сервера был: 5.7.64 TenantAttribution; Доступ к передаче закрыт
  2. System.Net.Mail.SmtpFailedRecipientException: недостаточно системного хранилища. Ответ сервера был: 4.5.3 Слишком много получателей

Пока нам не удалось выяснить, почему это происходит. Любые идеи приветствуются.

Код электронной почты использует пространство имен System.Net.Mail — .Net framework 4.0. Мы передаем имя пользователя и пароль для NetworkCredential.

public void Send(string from, string[] to, string[] cc, string[] bcc, string subject, string body, string[] attachmentArr, Boolean isBodyHtml, string smtpServerName, int port = 25, bool enableSsl = true, string userName = null, string password = null, string domain = null, int timeoutMilliSec = 100000)
    {
        MailMessage objEmail = new MailMessage();

        try
        {
            foreach (string toItem in to)
            {
                objEmail.To.Add(toItem);
            }

            if (cc != null)
            {
                foreach (string toItem in cc)
                {
                    objEmail.CC.Add(toItem);
                }
            }

            if (bcc != null)
            {                    
                foreach (string toItem in bcc)
                {
                    objEmail.Bcc.Add(toItem);
                }
            }

            objEmail.From = new MailAddress(from);
            objEmail.Subject = subject;
            objEmail.Body = body;
            objEmail.IsBodyHtml = isBodyHtml;
            objEmail.Priority = MailPriority.High;

            if (attachmentArr != null)
            {
                foreach (String s1 in attachmentArr)
                {
                    objEmail.Attachments.Add(new Attachment(s1));
                }
            }

            using (SmtpClient smtp = new SmtpClient(smtpServerName))
            {
                if (string.IsNullOrEmpty(userName) == false && string.IsNullOrEmpty(password) == false)
                {
                    NetworkCredential credential = (string.IsNullOrEmpty(domain)) ? new NetworkCredential(userName, password) : new NetworkCredential(userName, password, domain);
                    smtp.Credentials = credential;
                }
                smtp.Timeout = timeoutMilliSec;
                smtp.Port = port;
                smtp.EnableSsl = enableSsl;

                smtp.Send(objEmail);
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
        finally
        {
            if (attachmentArr != null && objEmail.Attachments != null)
            {
                foreach (Attachment a1 in objEmail.Attachments)
                {
                    a1.Dispose();
                }
            }
        }
    }

person Aditya Patil    schedule 16.02.2016    source источник


Ответы (1)


Наконец-то мы обнаружили, что происходит — ограничение электронной почты. В Office365 установлен предел регулирования в 30 сообщений в минуту для отправки клиента SMTP https://technet.microsoft.com/en-us/library/dn554323%28v=exchg.150%29.aspx#summary Решение состояло в том, чтобы отправлять менее 30 сообщений в минуту. Я думаю, что на это влияют другие сообщения (отправленные Outlook), которые также отображаются для отправки сервером. Мы уменьшили задержку между сообщениями почти до пяти секунд. С тех пор мы не видели повторения ошибки.

person Aditya Patil    schedule 13.04.2016