2014-09-29 167 views
1

我正试图从Outlook插件获取发送的邮件时遇到了一些问题。在Outlook Addin中收到发送的邮件

onItemSend事件,我打开一个对话框,它显示了一些领域,有消息信息,如收件人,主题等,并一个按钮,将保存这些信息进入我们的数据库。另一个要求是,以保存已发送邮件的副本,这是我卡住了...

我可以使用另存为方法保存该消息,但问题是,当我打开该邮件,它显示:

此消息尚未发送。此消息将通过 的Microsoft Exchange

发送导致一些问题的用户,让他们觉得不发送的消息。

在我的搜索期间,我发现this thread其中一个人有同样的问题,并且解决方法是使用邮件作为PostItem而不是MailItem,一旦PostItem被创建为发送状态。此外,我们应该将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对象,设置一些属性并保存到正确的路径,但它有以下问题:

  1. 执行postItem.save,创建postitem消息后,它会在收件箱中读取消息

  2. 保存的消息后,我比较了文件和S在有意义的情况下,原始邮件大小为580kb,保存后的邮件为52kb。看起来它没有复制消息

  3. 它丢失了某些嵌入到消息中的图像,如签名图像,显示了红色的X。

我如何获得/创建消息,用确切的消息内容,收件人,附件,属性等(克隆那种)与发送的状况,而无需创建收件箱文件夹内的另一消息?

谢谢

+0

请,我必须执行这样的事情,你可以提供给我的源代码,或指出我在哪里可以找到解决方案,我需要存储一些电子邮件到我们的数据库。你是怎样做的 ? – 2016-09-06 08:38:13

+0

请看看[this](https://blogs.msdn.microsoft.com/emeamsgdev/2011/12/06/process-incoming-mail-using-an-outlook-addin)。在这个例子中,它展示了如何获取收到的电子邮件并对其进行处理。如果您需要发送项目,请添加如下所示的处理程序:this.itemsendhndler = new Microsoft.Office.Interop.Outlook.ApplicationEvents_11_ItemSendEventHandler(Application_ItemSend); this.Application.ItemSend + = itemsendhndler ;.让我知道你是否需要任何其他的东西。 :) – UncleFester 2016-09-07 16:13:58

回答

1

我不会这样做Outlook邮件正试图发送。您可以

  1. 处理已发送邮件文件夹中的Items.ItemAdd事件。到那个时候消息被发送并且所有发送者相关的属性被设置。

  2. 您可以通过删除未发送的标志来“修复”创建的MSG文件。您可以使用Redemption - 致电RDOSession .GetMessageFromMsgFile/RDOMail.Sent = true/RDOMail.Save。请记住,发件人信息可能尚未设置。

+0

嗨德米特里!只是关于你的第一个建议的问题......我已经阅读过某处,用户可以更改已发送的项目文件夹。如果用户更改此文件夹,我是否可以获取发送的消息?我必须在itemAdd事件之前设置发送的文件夹吗?如果我更改发送的文件夹位置,它是否会覆盖用户的选项?感谢您的建议 – UncleFester 2014-09-30 13:43:47

+0

您可以跟踪Application.ItemSend事件并检查MailItem.SaveSentMessageFolder属性是否指向由Namespace.GetDefaultFolder(使用Namespace..CompareEntryIds)返回的期望的已发送邮件文件夹。然后,您可以跟踪该文件夹上的ItemAdd事件,或将自定义文件夹的条目标识保存在自定义属性(MailItem.UserProperties)中,并将SaveSentMessageFolder属性重置为默认的已发送邮件文件夹。当您在该文件夹上处理ItemAdd时,可以使用该自定义属性打开自定义文件夹并将消息移动到那里。 – 2014-09-30 21:15:52

+0

嗨德米特里你可以解释如何“跟踪该文件夹上的ItemAdd事件”。这是否意味着将“Public WithEvents justinreserve1 As Outlook.Items”这样的东西进行定义,然后将其用于该文件夹? – Max 2014-10-01 13:03:14

0

我不会走那条路与“postitem”进一步,不知它看起来不完美的方式适合我。

问题是,您正在复制它发送的项目。因此该副本表示它尚未发送。 如果你不需要它保存在“已发送邮件” - 文件夹“正常”的副本,你可以只改变其中项目被保存

Set mailitem.SaveSentMessageFolder = someother Folder '(which is defined as Outlook.folder) 

的文件夹,如果这是不可能的,那么我将对“已发送的项目”文件夹进行检查(在ThisOutlookSession中),并为其中的每个新项目进行复制操作。如果你不知道如何让我知道,那么我会复制你一些代码来为你提供帮助。

另一个问题,只是因为IAM好奇:你为什么打开窗体并等待某人按下OK按钮,而不是立刻将数据保存到你的数据库?

+0

嗨马克斯,谢谢你的建议。我会尝试......关于你的好奇心,我会在窗体上显示另一个字段,用户将在其中添加注释,从某些下拉列表中选择一些数据,然后当用户点击确定按钮时,它将保存所有的用户选择和消息本身。我只是没有写在窗体上发生的所有事情:)谢谢 – UncleFester 2014-09-30 13:34:55

+0

嗨,“发送项目”文件夹“的检查(在ThisOutlookSession中)与Dimitri的建议是一样的,当然他有更好的解释。在这里这也只会在用户没有更改sent-items-Folder或者甚至是vba的情况下才起作用。 – Max 2014-10-01 13:04:03

相关问题