3

我是一名新手开发人员,我已经被 EWS 困住了好几个小时。我需要阅读最新的电子邮件,获取所有未读的电子邮件并使用其中的数据来做一些事情。

此时我的代码看起来像这样。

static void Main(string[] args)
    {
        ServicePointManager.ServerCertificateValidationCallback = CertificateValidationCallBack;
        ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2013);
        service.Credentials = new WebCredentials("support@mycompany.com", "mysupersuperdupersecretpassword");


        service.AutodiscoverUrl("support@mycompany.com", RedirectionUrlValidationCallback);


        FindItemsResults<Item> findResults = service.FindItems(WellKnownFolderName.Inbox,new ItemView(2));
        foreach (Item item in findResults.Items)
        {
            // works perfectly until here
            Console.WriteLine(item.Subject);
            Console.WriteLine('\n');
            item.Load();
            string temp = item.Body.Text;
            // I can't seem to get TextBody to work. so I used a RegEx                                                 Match match = Regex.Match(temp, "<body>.*?</body>", RegexOptions.Singleline);
            string result = match.Value;
            result = result.Replace("<body>", "");
            result = result.Replace("</body>", "");
            Console.Write(result);
            Console.WriteLine('\n');
            //Now the email boddy is fine but IsNew always returns false.
            if (item.IsNew)
            {
                Console.WriteLine("This message is unread!");
            }
            else
            {
                Console.WriteLine("This message is read!");
            }
        }        


    }

我已经用谷歌搜索并尝试并搜索了更多信息,但我被卡住了。我现在如何阅读哪些电子邮件,有没有办法获得比我所做的更有效的电子邮件正文?任何帮助将不胜感激。

4

1 回答 1

2

如果您还没有阅读过MSDN 的使用文章,那么它非常好。

对于您的问题,请将您的项目投射到 EmailMessage

foreach (Item item in findResults.Items)
{
    var mailItem = (EmailMessage)item;
    // works perfectly until here
    Console.WriteLine(mailItem.Subject);
}

我确实注意到您没有使用属性集,而是仅将 EWS 用于事件通知而不通过现有邮件,它可能会有所不同。

更新根据您的更改添加

将此用于您的属性集

new PropertySet(BasePropertySet.FirstClassProperties) {
    RequestedBodyType = BodyType.Text
};

这也读起来更好,并使用该Body.Text属性

foreach (Item myItem in findResults.Items.Where(i=>i is EmailMessage))
{
    var mailItem = myItem as EmailMessage;
    Console.WriteLine(mailItem.Subject);
    mailItem.Load(new PropertySet(BasePropertySet.FirstClassProperties) {
        RequestedBodyType = BodyType.Text
    }); // Adding this parameter does the trick :)
    Console.WriteLine(mailItem.Body.Text);

    if(! mailItem.IsRead)
        Console.WriteLine("Who is Your Daddy!!!!");

}
于 2013-07-24T07:52:45.480 回答