我在尝试从Outlook插件中获取已发送的邮件时遇到了一些问题。
在 onItemSend 事件中,我打开一个对话框,其中显示一些字段,包括收件人,主题等消息信息以及将这些信息保存到我们的数据库中的按钮。另一个要求是保存已发送消息的副本,这就是我被卡住的地方......
我可以使用 SaveAs 方法保存邮件,但问题是当我打开邮件时,它会显示:
此邮件尚未发送。此消息将通过发送 Microsoft Exchange
导致用户出现一些问题,让他们认为邮件没有发送。
在我的搜索过程中,我发现this thread其他人遇到了同样的问题,解决方案是在发送状态下创建PostItem后将消息用作PostItem而不是MailItem。另外,我们应该将MessageClass属性设置为 IPM.Note 并删除PR_ICON_INDEX
以下是我用于执行上述步骤的代码。我发现这段代码here并稍微改了一下:
PostItem postItem = this._email.Application.CreateItem(OlItemType.olPostItem);
postItem.MessageClass = "IPM.Note";
PropertyAccessor pa = postItem.PropertyAccessor;
pa.SetProperty("http://schemas.microsoft.com/mapi/proptag/0x10800003", -1);
postItem.Save();
NameSpace session = postItem.Session;
string postItemEntryID = postItem.EntryID;
Marshal.ReleaseComObject(postItem);
Marshal.ReleaseComObject(pa);
MailItem newMessage = session.GetItemFromID(postItemEntryID) as MailItem;
newMessage.BCC = this._email.BCC;
newMessage.Body = this._email.Body;
newMessage.BodyFormat = this._email.BodyFormat;
newMessage.CC = this._email.CC;
newMessage.HTMLBody = this._email.HTMLBody;
//Hard coded path just for illustration
newMessage.SaveAs("C:\\Temp\\MSG\test.msg", OlSaveAsType.olMSG);
上面的代码创建了一个postitem对象,设置了一些属性并正确保存到路径中,但它有以下问题:
执行 postItem.save 后,要创建postitem消息,它会在收件箱文件夹中创建一条阅读消息
保存邮件后,我比较了文件和重要的大小,原始邮件大小为580kb,postitem保存的邮件为52kb。它似乎没有复制消息
它丢失了信息中嵌入的一些图像,例如签名图像,显示红色X.
如何使用已发送状态获取/创建具有确切邮件内容,收件人,附件,属性等(克隆类型)的邮件,而无需在收件箱文件夹中创建其他邮件?
谢谢
答案 0 :(得分:1)
我不会对Outlook尝试发送的消息执行此操作。你可以
处理已发送邮件文件夹上的Items.ItemAdd事件。到那时发送消息并设置所有与发件人相关的属性。
您可以通过删除未发送的标志来“修复”创建的MSG文件。您可以使用Redemption执行此操作 - 调用RDOSession。GetMessageFromMsgFile / RDOMail.Sent = true / RDOMail.Save。请注意,可能尚未设置发件人信息。
答案 1 :(得分:0)
我不会用" postitem"此外,它对我来说看起来并不完美。
问题是你正在复制它发送的项目。因此副本说它还没有被发送。 如果你不需要"正常"保存在"已发送项目中的副本" -Folder,您只需更改保存项目的文件夹
Set mailitem.SaveSentMessageFolder = someother Folder '(which is defined as Outlook.folder)
如果那是不可能的,那么我会对"发送的项目进行检查(在ThisOutlookSession中)"文件夹并为其中的每个新项目制作复制操作。如果您不知道如何让我知道,那么我会复制一些代码以便为您提供帮助。
另一个问题,因为Iam很好奇:为什么要打开表单并等待某人点击确定按钮,而不是立即将数据保存到数据库中?