【问题标题】:Get the 'Out of the office' status获取“不在办公室”状态
【发布时间】:2022-04-03 08:15:49
【问题描述】:

我正在制作一个控制台应用程序,用于向必须在其他客户端应用程序上执行某些操作的用户发送邮件。

这行得通。

问题是,我想避免发送邮件,如果此用户在其 Outlook 框上启用了“外出”消息(邮件的邮件客户端将始终是 Outlook)。

但我没有找到一种方法来检查“不在办公室”消息是否启用,无论是使用outlook interop 还是MailMessage

因为“不在办公室”消息是第一次发送,所以我必须知道状态。

首先,使用 interop 或 MailMessage 会更容易吗? 二、可以吗?

【问题讨论】:

  • 事后回复不是不在办公室
  • 嗯,这是 Outlook 中的设置,所以我们不能知道电子邮件地址是否启用?

标签: c# outlook


【解决方案1】:

你可以使用 Redemption(我是它的作者)和它的 RDOOutOfOfficeAssistant 对象,但它需要先打开用户的邮箱。 您也可以直接使用 EWS 及其 GetUserOofSettingsRequest 动词。

【讨论】:

    【解决方案2】:

    我不确定 MailMessage,但我肯定会使用 Outlook 互操作!只要您从同一网络内发送邮件就可以了!

    【讨论】:

    • 问题是,“不在办公室”消息只会在第一次显示,所以我需要知道它是否启用。不检查我是否收到了回信。*
    • 您不能在知道收到回复后将邮件停用 x 天吗?
    • 停用我的邮件?我每天可以联系 20 个或更多用户。不知道他们什么时候回来。这就是为什么我在尝试发送邮件时需要检查“不在办公室”状态的原因。
    【解决方案3】:

    最简单的方法可能是使用 Exchange Web 服务 (EWS) 中的邮件提示来获取邮件用户的外出状态。此代码 sn-p 使用 Exchange 端的服务帐户,可以读取任意用户的帐户信息。 (如果您收到拒绝访问响应,您可能需要让您的 Exchange 管理员启用该帐户的模拟。)如果您只想测试代码,您可以为凭据指定您自己的域帐户并请求注销-您自己帐户的办公室状态。

    // Returns the user's out-of-office message, or null if the user does not have out-of-office set.
    public static string GetUserOutOfOfficeMessage(string userEmailAddress)
    {
        const string outOfOfficeRequestMessageTemplate =
           @"<soap:Envelope xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance""
                            xmlns:xsd=""http://www.w3.org/2001/XMLSchema""
                            xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/""
                            xmlns:t=""http://schemas.microsoft.com/exchange/services/2006/types"">
                <soap:Header>
                    <t:RequestServerVersion Version=""Exchange2010""/>
                </soap:Header>
                <soap:Body>
                    <GetMailTips xmlns=""http://schemas.microsoft.com/exchange/services/2006/messages"">
                    <SendingAs>
                        <t:EmailAddress>{0}</t:EmailAddress>
                        <t:RoutingType>SMTP</t:RoutingType></SendingAs>
                        <Recipients>
                        <t:Mailbox>
                            <t:EmailAddress>{1}</t:EmailAddress>
                            <t:RoutingType>SMTP</t:RoutingType>
                        </t:Mailbox>
                        </Recipients>
                    <MailTipsRequested>OutOfOfficeMessage</MailTipsRequested>
                    </GetMailTips>
                </soap:Body>
             </soap:Envelope>";
    
        string exchangeServiceUrl = "https://.../Exchange.asmx";  // get the full URL from your Exchange admin
        WebRequest exchangeServiceRequest = WebRequest.Create(exchangeServiceUrl);
        HttpWebRequest exchangeSoapServiceRequest = (HttpWebRequest)exchangeServiceRequest;
        exchangeSoapServiceRequest.Method = "POST";
        exchangeSoapServiceRequest.ContentType = "text/xml; charset=utf-8";
        exchangeSoapServiceRequest.ProtocolVersion = HttpVersion.Version11;
        exchangeSoapServiceRequest.Credentials = new NetworkCredential(serviceAccountUserName, 
            serviceAccountPassword, yourDomain);  // for serviceAccountUserName try either login name or email address
        exchangeSoapServiceRequest.Timeout = 60000;
        Stream exchangeSoapServiceRequestStream = exchangeSoapServiceRequest.GetRequestStream();
    
        using (StreamWriter exchangeServiceWriter = new StreamWriter(exchangeSoapServiceRequestStream, Encoding.ASCII))
        {
            string outOfOfficeMessageRequest = string.Format(
                outOfOfficeRequestMessageTemplate, serviceAccountUserName, userEmailAddress);
    
            try
            {
                exchangeServiceWriter.Write(outOfOfficeMessageRequest);
            }
            catch (Exception ex)
            {
                // log something
            }
            finally
            {
                exchangeServiceWriter.Close();
            }
        }
    
        string outOfOfficeResponse = null;
        string userOutOfOfficeMessage = null;
    
        try
        {
            HttpWebResponse exchangeServiceResponse = (HttpWebResponse)exchangeSoapServiceRequest.GetResponse();
    
            using (StreamReader exchangeServiceResponseStream = new StreamReader(exchangeServiceResponse.GetResponseStream()))
            {
                outOfOfficeResponse = exchangeServiceResponseStream.ReadToEnd();
            }
        }
        catch (Exception ex)
        {
            // log something
        }
    
        if (outOfOfficeResponse != null)
        {
            const int messageElementStartTagLength = 11;
            int messageStartIndex = outOfOfficeResponse.IndexOf("<t:Message>");
    
            if (messageStartIndex >= 0)
            {
                int messageEndIndex = outOfOfficeResponse.IndexOf("</t:Message>");
    
                if (messageEndIndex >= 0)
                {
                    int outOfOfficeMessageLength = messageEndIndex - messageStartIndex;
    
                    // Adjust for length of the <t:message> tag itself so that we don't include the tag in the output.
                    messageStartIndex += messageElementStartTagLength;
                    outOfOfficeMessageLength -= messageElementStartTagLength;
    
                    userOutOfOfficeMessage = outOfOfficeResponse.Substring(messageStartIndex, outOfOfficeMessageLength);
                }
            }
        }
    
        return userOutOfOfficeMessage;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-12
      • 2018-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-06
      • 2011-10-22
      • 2010-11-07
      相关资源
      最近更新 更多