Как обнаружить ошибку отправки электронной почты на Exchange C # - PullRequest
0 голосов
/ 31 августа 2018

Я пытаюсь определить, была ли ошибка, отправленная моим приложением, доставлена. Это означает, что я не пытаюсь проверить электронную почту, но на самом деле просто, если она достигла почтового ящика назначения.

Вот код приложения .Net Framework, который я использую:

    public void Send(EmailRequest emailRequest)
    {
        // Creates the message itselft
        EmailMessage message = new EmailMessage(ServiceExchange);
        message.Body = new MessageBody(emailRequest.Message);
        message.Subject = emailRequest.Subject;
        message.ToRecipients.Add(emailRequest.To);

        // Create a custom extended property and add it to the message. 
        Guid myPropertySetId = Guid.NewGuid();
        ExtendedPropertyDefinition myExtendedPropertyDefinition = new ExtendedPropertyDefinition(myPropertySetId, "MyExtendedPropertyName", MapiPropertyType.String);
        message.SetExtendedProperty(myExtendedPropertyDefinition, "MyExtendedPropertyValue");

        // Asynchronously, call
        message.SendAndSaveCopy();

        // Wait one second (while EWS sends and saves the message). 
        System.Threading.Thread.Sleep(1000);

        // Now, find the saved copy of the message by using the custom extended property. 
        ItemView view = new ItemView(5);
        SearchFilter searchFilter = new SearchFilter.IsEqualTo(myExtendedPropertyDefinition, "MyExtendedPropertyValue");
        view.PropertySet = new PropertySet(BasePropertySet.IdOnly, ItemSchema.Subject, myExtendedPropertyDefinition);
        FindItemsResults<Item> findResults = ServiceExchange.FindItems(WellKnownFolderName.SentItems, searchFilter, view);

        if (findResults == null) throw new Exception("Could not find results - findResults is null");
        if (findResults.Items == null) throw new Exception("Could not find results - findResults.Items is null");
        if (findResults.Items.Count == 0) throw new Exception("Could not find results - findResults.Items is 0");
        if (findResults.Items.Count > 1) throw new Exception("findResults items returned more than one result");

        ItemId itemID = null;

        // TODO change this to single line
        // Process results and retrieve the email item ID (unique)
        foreach (Item myItem in findResults.Items)
        {
            if (myItem is EmailMessage)
            {
                EmailMessage em = myItem as EmailMessage;
                itemID = em.Id;
                //Console.WriteLine(em.Subject);
                //Console.WriteLine(em.Id.UniqueId);
            }
        }

        // TODO: ANY WAY TO RETRIEVE EMAIL FAILURE?

    }   

Например: если я отправлю это на действительное письмо, все будет в порядке. Цель здесь - обнаружить сбои, чтобы мы могли связаться с бизнесом и проверить, почему у нас хранится неправильный адрес электронной почты.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

Я пытаюсь определить, была ли ошибка, отправленная моим приложением, доставлена. Это означает, что я не пытаюсь проверить электронную почту, но на самом деле просто, если она достигла целевого почтового ящика.

Как только вы передадите сообщение в Exchange, оно может даже сразу не выйти. Как только Exchange попытается отправить его, он может обнаружить, что удаленный сервер недоступен, а затем повторить попытку позже.

В конце концов, Exchange либо заставит удаленный сервер принять сообщение, либо он сдастся.

Если удаленный сервер принимает сообщение, вы можете получить квитанцию ​​об отправке, если настроите флаг в своем сообщении. Однако это не означает, что сообщение было фактически доставлено получателю или что получатель прочитал его; это только означает, что Exchange смог передать его на целевой сервер.

Многие серверы просто принимают и отбрасывают почту, отправленную несуществующему пользователю. Другие бросают их в глобальную папку «спам».

Если вы установите правильный адрес для ответа в своем сообщении, вы получите электронное письмо от Exchange, если сообщение не может быть доставлено на удаленный сервер в течение времени, установленного администратором Exchange. Это обычно пара дней.

Однако даже если вы установите флаг «Чтение квитанции», получатель может полностью прочитать сообщение, а не отправить его. Соблюдение является добровольным.

Действительно, очень короткий ответ: «Вы можете обнаружить немедленные сбои, но на самом деле не можете быть уверены, что сообщение было прочитано или доставлено», и в любом случае это не может произойти в вашем коде.

Если это полезно, есть несколько ошибок, которые могут быть обнаружены немедленно, и они появятся в вашем блоке try / catch, но это скорее исключение, чем правило.

0 голосов
/ 31 августа 2018

Если адрес электронной почты, который вы указали в файле, является недействительным, SendAndSaveCopy () должно выдать исключение, в котором указывается столько же. Вы можете реализовать оператор try / catch для обнаружения любых сбоев и отправить сбои в регистратор, который даст вам текстовый список для работы:

public void Send(EmailRequest emailRequest)
{
    try
    {
        // Creates the message itselft
        EmailMessage message = new EmailMessage(ServiceExchange);
        message.Body = new MessageBody(emailRequest.Message);
        message.Subject = emailRequest.Subject;
        message.ToRecipients.Add(emailRequest.To);

        // Create a custom extended property and add it to the message. 
        Guid myPropertySetId = Guid.NewGuid();
        ExtendedPropertyDefinition myExtendedPropertyDefinition = new ExtendedPropertyDefinition(myPropertySetId, "MyExtendedPropertyName", MapiPropertyType.String);
        message.SetExtendedProperty(myExtendedPropertyDefinition, "MyExtendedPropertyValue");

        // Asynchronously, call
        message.SendAndSaveCopy();

        // Wait one second (while EWS sends and saves the message). 
        System.Threading.Thread.Sleep(1000);
    }
    catch (Exception x)
    {
        logger.LogError(x.Message);

    }
}

Вы можете найти другие примеры здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...