我已经使用C#开发了一个Outlook插件,对于收到的每封新邮件,我获取(并保存)发件人/主题/电子邮件正文&附件。好吧,最后的2让我很头疼。我可以看到发件人和新邮件的主题,但对于身体和附件,这似乎是一个问题。我使用NewMailEx在收件箱中获取新邮件。该函数如下所示:
private void Application_NewMailEx(string EntryIDCollection)
{
string[] entryIdArray = EntryIDCollection.Split(',');
foreach (string entryId in entryIdArray)
{
try
{
Outlook.MailItem item = (Outlook.MailItem)Application.Session.GetItemFromID(EntryIDCollection, null);
string subj = item.Subject; //works
string to = item.To; //works
string bec = item.BCC; //does not work but dont care
string body = item.Body; //DOES NOT SAVE THE BODY OF THE NEW MAIL RECEIVED
string final = "Sender: " + item.SenderEmailAddress + "\r\n" + "Subject: " + subj + "\r\n" + "BCC: " + bec + "\r\n" + "TO: " + to + "\r\n\n" + "Body: " + body + "\r\n\n";
System.IO.File.AppendAllText(@"D:\tmp\atr.txt", final);
//the result of item.attachments.count is always 0 , even though I've
//sent mails with a different number of attachments. So the if
//statement is false
if (item.Attachments.Count > 0)
{
for (int i = 1; i <= item.Attachments.Count; i++)
{
item.Attachments[i].SaveAsFile(@"D:\tmp\" + item.Attachments[i].FileName);
}
}
Marshal.ReleaseComObject(item);
}
catch (System.Exception e)
{
MessageBox.Show(e.Message);
}
}
}
答案 0 :(得分:0)
Item变量来自哪里?您需要使用Application.Session.getItemfromID()初始化它。
答案 1 :(得分:0)
我正在用VBA写作,所以我觉得在这里发布我的代码会是一个失礼,但是我已经找到了一个使用Outlook应用程序中的类似对象库的解决方案,我认为这很好地转移到了你的C ++意图。 / p>
首先,切换到POP3肯定会解决这个问题,但是你仍然坚持使用POP3,这只是从编程的角度来看是理想的。
我找到的解决方案遵循此算法:
{{1}}
您看到调用与Application_NewMailEx相同的函数如何创建一种循环,因为如果item.DownloadState不是1,您将再次调用该函数?我知道这不是最理想的编码实践,但我已经搜索了互联网,Outlook应用程序和Outlook对象库专家不知道如何以任何其他方式解决这个问题(事实上,没有人提出这个解决方案)< / p>
对于我的完整VBA解决方案,请查看:
https://superuser.com/questions/894972/outlook-strange-item-attachments-error/990968#990968