创建邮件对象并在已发送文件夹中对其进行跟踪

时间:2015-04-09 15:07:22

标签: outlook-vba

我需要通过VBA创建邮件,发送邮件,然后导出已发送邮件的.msg文件进行存档(我知道,这很奇怪,但这就是老板的要求)。

创建邮件非常简单:

Set OLK = Outlook.Session
Set ML = OLK.Createitem olMailItem
With ML 
 .Recipients.add "somebody@somedomain.com"
 .Subject = "Great mail you have there"
 .Body = "It would be a shame if somebody couldn't archive it"
 End with 

ML.Send

问题是,发送邮件后,在发送文件夹中移动,ML对象指向什么。

我可以在发送之前使用.saveas方法,但是保存的文件是未发送的版本,可以编辑并再次发送。

如何跟踪已发送文件夹中的邮件?

我发现的“蛮力”方式意味着在发送

之前保存ConversationIndex
IDX= ML.ConversationIndex 

然后扫描已发送文件夹中的所有项目:

For each ML in OLK.Session.GetDefaultFolder(olFolderSentMail).Items 
    If ML.ConversationIndex = IDX Then ML.SaveAs HomeDir & "\" & OutFileName: Exit For
Next

但这并不是一项顺利的工作....(如果有一些smartass回复自动邮件,即使没有人应该这样做,也可能会失败)

2 个答案:

答案 0 :(得分:0)

最大,

您可以处理属于“已发送邮件”文件夹的Items类的ItemAdd事件。将一个或多个项目添加到指定集合时会触发它。

在ItemAdd事件处理程序中,您可以检查是否应保存特定项目。例如,您可以在调用Send方法之前添加用户属性。有关详细信息,请参阅UserProperties课程。

 Set myProp = myItem.UserProperties.Add("MyPropName", olText)

请注意,MailItem类提供SaveSentMessageFolder属性,该属性允许设置一个Folder对象,该对象表示发送后将保存电子邮件副本的文件夹。因此,您可以指定一个自定义文件夹来保存它们。

答案 1 :(得分:0)

您可以添加用户属性(MailItem.UserProperties.Add),但这会导致以TNEF格式发送消息,除非UseTnef属性(DASL名称http://schemas.microsoft.com/mapi/id/{00062008-0000-0000-C000-000000000046}/8582000B)明确设置为false。 / p>

您可以使用PropertyAccessor.SetProperty设置命名的MAPI属性 - 只需选择您的自定义GUID和属性名称。 E.g。

ML.PropertyAccessor.SetProperty("http://schemas.microsoft.com/mapi/string/{3ADE3813-37A9-49C9-AD84-D49C8FF5D660}/MyOwnProp", "SomeValue")