Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#下载电子邮件-未找到附件_C#_Email_Outlook - Fatal编程技术网

C#下载电子邮件-未找到附件

C#下载电子邮件-未找到附件,c#,email,outlook,C#,Email,Outlook,我正在使用EWS管理的API下载电子邮件,并且我成功地下载了电子邮件本身。我可以通过EmailMessage.From.Name和EmailMessage.Subject验证它是否正确 但是,在Outlook中查看时,它有一个附件,.Net对象的EmailMessage.HasAttachments设置为false,EmailMessage.Attachments.Count设置为零 为什么我可以在Outlook中看到附件,但不能通过.Net对象看到 我的守则如下: using System;

我正在使用EWS管理的API下载电子邮件,并且我成功地下载了电子邮件本身。我可以通过EmailMessage.From.Name和EmailMessage.Subject验证它是否正确

但是,在Outlook中查看时,它有一个附件,.Net对象的EmailMessage.HasAttachments设置为false,EmailMessage.Attachments.Count设置为零

为什么我可以在Outlook中看到附件,但不能通过.Net对象看到

我的守则如下:

using System;
using System.Collections.Generic;
using System.Configuration;
using System.IO;
using System.IO.Compression;
using System.Linq;
using Microsoft.Exchange.WebServices.Data;

namespace CiscoPrimeInfrastructureDataAccess
{
    public static class EmailFetcher
    {
        private const string _EMAIL = @"foo@bar.com";
        private const string _USERNAME = "foo";
        private const string _PASSWORD = "bar123";
        private const string _DOMAIN = "bar";
        private const string _SUBJECT = "foobar subject";

        public static string GetCurrentPrimeCsv()
        {
            string inboxFolder = ConfigurationManager.AppSettings["Inbox"];

            if (!File.Exists(inboxFolder))
                File.Create(inboxFolder);

            var service = CreateExchangeService();

            var newestInventoryReport = GetNewestInventoryEmail(service);

            Console.WriteLine("From: {0}{1}Subject: {2}{3}Number of Attachments: {4}", newestInventoryReport.From.Name, Environment.NewLine, newestInventoryReport.Subject, Environment.NewLine, newestInventoryReport.Attachments.Count);

            FileAttachment attachment = newestInventoryReport.Attachments[0] as FileAttachment;

            string guid = Guid.NewGuid().ToString();

            string downloadFilePath = Path.Combine(inboxFolder, guid + "_" + attachment.FileName);
            string extractedFilePath = Path.Combine(inboxFolder, guid + "_extracted.csv");

            attachment.Load(Path.Combine(downloadFilePath));

            ZipFile.ExtractToDirectory(downloadFilePath, extractedFilePath);

            string csv = String.Empty;

            using (var reader = new StreamReader(extractedFilePath))
            {
                csv = reader.ReadToEnd();
            }

            return csv;
        }



        private static ExchangeService CreateExchangeService()
        {
            ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2007_SP1);
            service.Credentials = new WebCredentials(_USERNAME, _PASSWORD, _DOMAIN);

            service.AutodiscoverUrl(_EMAIL);

            return service;
        }


        private static EmailMessage GetNewestInventoryEmail(ExchangeService service)
        {
            var firstSeveralEmails = GetFirstSeveralEmails(service);

            EmailMessage newestEmail = null;

            foreach (var email in firstSeveralEmails)
            {
                if (email.Subject.Contains(_SUBJECT))
                {
                    if (newestEmail == null || email.DateTimeReceived > newestEmail.DateTimeReceived)
                    {
                        newestEmail = email;
                    }
                }
            }

            return newestEmail;
        }

        private static IEnumerable<EmailMessage> GetFirstSeveralEmails(ExchangeService service)
        {
            Mailbox mailbox = new Mailbox(_EMAIL);
            FolderId inboxFolderId = new FolderId(WellKnownFolderName.Inbox, mailbox);

            FindItemsResults<Item> findItemsResults = service.FindItems(inboxFolderId, new ItemView(128));

            return findItemsResults.OfType<EmailMessage>().Select(findEmailResult => findEmailResult as EmailMessage).ToList();
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用系统配置;
使用System.IO;
使用系统IO压缩;
使用System.Linq;
使用Microsoft.Exchange.WebServices.Data;
命名空间CiscoPrimeInfrastructureDataAccess
{
公共静态类EmailFetcher
{
私有常量字符串\u EMAIL=@”foo@bar.com";
私有常量字符串_USERNAME=“foo”;
私有常量字符串\u PASSWORD=“bar123”;
私有常量字符串_DOMAIN=“bar”;
私有常量字符串_SUBJECT=“foobar SUBJECT”;
公共静态字符串GetCurrentPrimeCsv()
{
字符串inboxFolder=ConfigurationManager.AppSettings[“收件箱”];
如果(!File.Exists(inboxFolder))
创建(收件箱文件夹);
var service=CreateExchangeService();
var newestInventoryReport=GetNewestInventoryEmail(服务);
Console.WriteLine(“From:{0}{1}主题:{2}{3}附件数:{4}”,newestInventoryReport.From.Name,Environment.NewLine,newestInventoryReport.Subject,Environment.NewLine,newestInventoryReport.Attachments.Count);
FileAttachment attachment=newestInventoryReport。作为FileAttachment的附件[0];
字符串guid=guid.NewGuid().ToString();
string downloadFilePath=Path.Combine(inboxFolder,guid+“”+attachment.FileName);
string extractedFilePath=Path.Combine(inboxFolder,guid+“_extracted.csv”);
attachment.Load(Path.Combine(downloadFilePath));
ExtractToDirectory(下载文件路径,extractedFilePath);
string csv=string.Empty;
使用(var reader=newstreamreader(extractedFilePath))
{
csv=reader.ReadToEnd();
}
返回csv;
}
专用静态ExchangeService CreateChangeService()
{
ExchangeService服务=新的ExchangeService(ExchangeVersion.Exchange2007_SP1);
service.Credentials=新的WebCredentials(\u用户名、\u密码、\u域);
服务。自动发现URL(_电子邮件);
回程服务;
}
专用静态EmailMessage GetNewestInventoryEmail(ExchangeService服务)
{
var FirstSeveralMails=GetFirstSeveralMails(服务);
EmailMessage newestEmail=null;
foreach(前几个邮件中的var电子邮件)
{
if(email.Subject.Contains(_Subject))
{
if(newestEmail==null | | email.DateTimeReceived>newestEmail.DateTimeReceived)
{
newestEmail=电子邮件;
}
}
}
返回新邮件;
}
私有静态IEnumerable GetFirstSeveralMails(ExchangeService服务)
{
邮箱邮箱=新邮箱(\u电子邮件);
FolderId inboxFolderId=新的FolderId(WellKnownFolderName.Inbox,邮箱);
FindItemsResults FindItemsResults=service.FindItems(inboxFolderId,新项目视图(128));
返回findItemResults.OfType().Select(findEmailResult=>findEmailResult作为EmailMessage.ToList();
}
}
}

我没有使用EWS,所以这可能是错误的

我得看看邮件的正文。附件实际上在正文中传输,通常作为base64编码字符串,在编码数据之前和之后带有mime标记,以区分不同的文件。EWS可能没有在您获取的对象中处理这些。当您获取一个项目并强制转换为EnailMessage时,电子邮件可能尚未完全处理,例如提取附件。请注意,文档中说:


这可能会有所帮助。

此处显示的内容:
Console.WriteLine(“From:{0}{1}主题:{2}{3}附件数:{4}”、newestInventoryReport.From.Name、Environment.NewLine、newestInventoryReport.Subject、Environment.NewLine、newestInventoryReport.Attachments.Count)发件人:Christell,Canin主题:foobar主题附件数量:0