如何在Exchange C#上检测发送电子邮件失败

时间:2018-08-31 14:53:59

标签: c# .net exchangewebservices

我正在尝试检测我的应用程序发送的电子邮件是否发送失败。这意味着我不是在尝试验证电子邮件,而是实际上只是在到达目的地邮箱之后。

这是我正在使用的.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 :(得分:0)

如果您归档的电子邮件地址无效,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);

    }
}

您可以找到其他示例here

答案 1 :(得分:0)

  

我正在尝试检测我的应用程序发送的电子邮件是否发送失败。这意味着我不是在尝试验证电子邮件,而是实际上只是在到达目的地邮箱之后。

一旦您将邮件传递给Exchange,它甚至可能不会立即发送出去。一旦Exchange尝试发送它,它可能会发现远程服务器不可用,然后稍后重试。

最终,Exchange将使远程服务器接受该邮件,否则它将放弃。

如果远程服务器接受该消息,则在消息中配置标记后,您将获得发送回执。但是,这不是并不意味着该邮件实际上已传递给收件人或收件人已阅读该邮件;仅表示Exchange能够将其提供给目标服务器。

许多服务器只是接受和丢弃发送给不存在的用户的邮件。其他人则将它们扔到全局的“垃圾邮件”文件夹中。

如果您在邮件中设置了正确的“回复”地址,并且在Exchange管理员设置的超时时间内无法将邮件传递到远程服务器,您将收到来自Exchange的电子邮件。这通常需要几天的时间。

但是,即使您设置了“阅读回执”标志,收件人也有可能完全阅读而不发送邮件。遵守是自愿的。

真正非常简短的答案是“您可以检测到立即失败,但实际上不能确保已读取或传递了消息”,无论如何在代码中都不会发生。

如果有帮助,可以立即检测到一些错误,这些错误将显示在try / catch块中,但这是例外,而不是规则。