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

C# 如何在Exchange C上检测发送电子邮件失败#,c#,.net,exchangewebservices,C#,.net,Exchangewebservices,我正在尝试检测我的应用程序发送的电子邮件是否传递失败。这意味着我不是在验证电子邮件,而是在它到达目标邮箱时验证它 以下是我正在使用的.Net Framework应用程序代码: public void Send(EmailRequest emailRequest) { // Creates the message itselft EmailMessage message = new EmailMessage(ServiceExchange);

我正在尝试检测我的应用程序发送的电子邮件是否传递失败。这意味着我不是在验证电子邮件,而是在它到达目标邮箱时验证它

以下是我正在使用的.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?

    }   
public void发送(EmailRequest EmailRequest)
{
//自己创建消息
EmailMessage=新的EmailMessage(ServiceExchange);
message.Body=newmessagebody(emailRequest.message);
message.Subject=emailRequest.Subject;
message.ToRecipients.Add(emailRequest.To);
//创建自定义扩展属性并将其添加到消息中。
Guid myPropertySetId=Guid.NewGuid();
ExtendedPropertyDefinition myExtendedPropertyDefinition=新的ExtendedPropertyDefinition(myPropertySetId,“MyExtendedPropertyName”,MapPropertyType.String);
message.SetExtendedProperty(myExtendedPropertyDefinition,“MyExtendedPropertyValue”);
//异步地,调用
message.SendAndSaveCopy();
//等待一秒钟(EWS发送并保存消息时)。
系统线程线程睡眠(1000);
//现在,使用自定义扩展属性查找消息的保存副本。
ItemView视图=新的ItemView(5);
SearchFilter SearchFilter=newsearchfilter.IsEqualTo(myExtendedPropertyDefinition,“MyExtendedPropertyValue”);
view.PropertySet=newpropertyset(BasePropertySet.IdOnly,ItemSchema.Subject,myExtendedPropertyDefinition);
FindItemsResults findResults=ServiceExchange.FindItems(WellKnownFolderName.SentItems、searchFilter、view);
if(findResults==null)抛出新异常(“找不到结果-findResults为null”);
if(findResults.Items==null)抛出新异常(“找不到结果-findResults.Items为null”);
if(findResults.Items.Count==0)抛出新异常(“找不到结果-findResults.Items为0”);
如果(findResults.Items.Count>1)抛出新异常(“findResults Items返回多个结果”);
ItemId ItemId=null;
//TODO将此更改为单行
//处理结果并检索电子邮件项目ID(唯一)
foreach(findResults.Items中的项目myItem)
{
如果(myItem是EmailMessage)
{
EmailMessage em=myItem作为EmailMessage;
itemID=em.Id;
//控制台写入线(em.Subject);
//控制台写入线(em.Id.UniqueId);
}
}
//TODO:有没有办法检索电子邮件故障?
}   
例如:如果我把它发送到一封有效的电子邮件,一切都很好。这里的目标是检测故障,以便我们能够联系业务部门并检查为什么存储了错误的电子邮件地址


谢谢

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

    }
}
你可以找到其他的例子

我正在尝试检测我的应用程序发送的电子邮件是否传递失败。这意味着我不是在验证电子邮件,而是在它到达目标邮箱时验证它

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

最终,Exchange要么让远程服务器接受消息,要么放弃

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

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

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

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

真正简短的回答是“您可以检测到即时故障,但不能真正确定消息是否已被读取或传递”,而且在任何情况下,它都不会发生在您的代码中


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

您好,谢谢您的回复。是的,事实上我不想在“阅读收据”上走得太远,或者如果它被标记为垃圾邮件并转到另一个盒子。我想要的只是交货失败。例如无效的电子邮件地址或将电子邮件发送到目标服务器过程中的任何错误。你认为我可以有一个更好的解决方案,而不是等待一分钟,然后检查我目前在测试中看到的标准“传递失败消息”吗?像某种电子邮件跟踪日志一样,Exchange日志不是您在生产环境中通常可以访问的。它们更适合调试。然而,如果你这样做,你当然可以观看他们。通过合理的努力,您最多只能在代码中设置一个try.catch块,并监视“回复”地址,以查找与您的电子邮件相关的反弹消息。您好,Deltri,很遗憾,根据我正在进行的测试,这是不可能的。SendAndSaveCopy()是异步的,这意味着不会捕获电子邮件传输中的任何问题。