我对此非常好奇。我是一名新员工,正在开发一款可以调用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个小时,而且我没有找到任何可以指导我引入我的结构附件的例子。
主要目标:我想在我的结构中阅读电子邮件附件。
答案 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.Name
或message.Sender.EmailAddress.Address
。
至于它是否会更好地作为结构或类,这实际上取决于它将如何在整个应用程序的其余部分中使用。这似乎每个实例都会相当大,你通常不想要结构。但是,这是一个指导原则,而不是一个严格的规则。如何使用它是一个更好的决定因素,它应该是一个类还是结构。