为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
富国沪深 2021-12-25 18:43:40
我试图检测我的应用程序发送的电子邮件是否发送失败。这意味着我不是要验证电子邮件,而实际上只是验证它是否到达了目标邮箱。这是我正在使用的 .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;    }   例如:如果我将其发送到有效的电子邮件,一切都很好。这里的目标是检测故障,以便我们可以联系业务并检查为什么我们存储了错误的电子邮件地址。
查看完整描述

2 回答

?
慕容3067478

TA贡献1773条经验 获得超3个赞

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


    }

}

您可以在此处找到其他示例。


查看完整回答
反对 回复 2021-12-25
?
慕的地6264312

TA贡献1817条经验 获得超6个赞

我试图检测我的应用程序发送的电子邮件是否发送失败。这意味着我不是要验证电子邮件,而实际上只是验证它是否到达了目标邮箱。

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

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

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

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

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

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

真正非常简短的回答是“您可以检测到即时故障,但实际上无法确定消息是否已被读取或传送”,并且无论如何都不会在您的代码中发生。

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


查看完整回答
反对 回复 2021-12-25
  • 2 回答
  • 0 关注
  • 188 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信