将电子邮件附件添加到C#结构中

时间:2016-01-22 04:49:23

标签: c# data-structures bytearray office365

我对此非常好奇。我是一名新员工,正在开发一款可以调用MS 365 api的应用程序,并抓取所需的邮箱。我的目标是过滤掉任何带附件的电子邮件,检索发件人姓名,发件人主题,最后是附件。这是一个将在服务器上运行的控制台应用程序,因此根据我的理解,为了获得最佳性能,C#结构是最佳选择。这是我被困的地方。我用我需要的适当属性构建了我的结构。奇怪的是我正在设置一个Byte数组属性(我从来没有这样做过)。然后在我的函数中,我调用api,然后列出我的结构列表,以便将每个电子邮件添加为对象我觉得这将提高性能。现在我能够检索电子邮件的发件人,并且没有任何问题,因为它们是字符串。但是现在,我如何获得附件以使其成为内存中的完整电子邮件对象。这是我的代码片段。

结构:

struct Emailed_Expenses
{
    private string sender;
    private string subject;
    private byte [] attachment;        

    public string Email_Sender
    {
        get
        {
            return sender;
        }
        set
        {
            sender = value;
        }
    }
    public string Email_Subject
    {
        get
        {
            return subject;
        }
        set
        {
            subject = value;
        }
    } 
    public byte[] Email_Attachment
    {
        get
        {
            return attachment;
        }
        set
        {
            attachment = value;
        }
    }
}

电子邮件抓取工具

        public static List<Emailed_Expenses> Get_Star_Mailbox()
    {
        //var star_user = "*******@dell.com";
        OutlookServicesClient star_Mail_Box = Start_OutLook_Services();
        List<Emailed_Expenses> star_Inbox = new List<Emailed_Expenses>();

        try
        {

            var Email_Box = star_Mail_Box.Users["******@dell.com"].Messages.ExecuteAsync().Result;

            var messages = Email_Box.CurrentPage;
            //var messages = star_Mail_Box.Me.Folders["Inbox"].Messages.OrderByDescending(m => m.DateTimeReceived).Take(10).ExecuteAsync();

            foreach (var message in messages)
            {
                if (message.Attachments.CurrentPage.Count > 0)
                {
                    Emailed_Expenses email = new Emailed_Expenses
                    {
                        Email_Sender = message.Sender.ToString(),
                        Email_Subject = message.Subject.ToString(),
                        >>>>>>>>Email_Attachment = byte [message.Attachments],<<<<< this is what I am talking about !!!!*****
                    };

                    star_Inbox.Add(email);
                }

            }
        }

我现在看起来有点幼稚,但我现在已经开始工作了大约11个小时,而且我没有找到任何可以指导我引入我的结构附件的例子。

主要目标:我想在我的结构中阅读电子邮件附件。

1 个答案:

答案 0 :(得分:1)

首先,Message上有两种类型的附件:ItemAttachments和FileAttachments。 ItemAttachments是附加的其他Outlook对象(消息,事件等)。对于这些,您会得到一个附件类型的对象,因此您无法使用二进制数据。所以我假设你只关心FileAttachments。

正如mybirthname在评论中所说,你需要遍历每个附件。如果它是FileAttachment,那么您可以使用ContentBytes属性来获取附件的字节数组。假设您将Email_Attachment更改为可以包含所有附件的List<>,这就是我认为的样子:

foreach (var message in messages)
{
    Emailed_Expenses email = null;

    foreach (var attachment in message.Attachments.CurrentPage)
    {
        FileAttachment file = attachment as FileAttachment;
        if (file != null)
        {
            if (email == null)
            {
                email = new Emailed_Expenses
                {
                    Email_Sender = message.Sender.ToString(),
                    Email_Subject = message.Subject,
                    Email_Attachment = new List<byte[]>
                };
            }

            email.Email_Attachment.Add(file.ContentBytes);
        }
    }

    if (file != null)
    {
        star_Inbox.Add(email);
    }
}

这是我的头脑和未经测试,所以它可能有一些错误,但我认为它应该给你一般的想法。另请注意,由于.ToString()已经是字符串,因此我在message.Subject上删除了对Subject的调用。我也不确定在.ToString()上调用message.Sender的内容是什么样的。如果你已经知道那给你你想要的东西,那就太好了!但您可能需要根据需要调到message.Sender.EmailAddress.Namemessage.Sender.EmailAddress.Address

至于它是否会更好地作为结构或类,这实际上取决于它将如何在整个应用程序的其余部分中使用。这似乎每个实例都会相当大,你通常不想要结构。但是,这是一个指导原则,而不是一个严格的规则。如何使用它是一个更好的决定因素,它应该是一个类还是结构。