创建一个邮件对象并在已发送文件夹中追踪它

Create a mail object and track it down in sent folder

我需要通过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方法,但保存的文件是未发送的版本,可以编辑并再次发送。

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

我发现的 "brute force" 方法意味着在发送之前保存 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

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

最大,

您可以处理属于已发送邮件文件夹的邮件 class 的 ItemAdd 事件。当一个或多个项目被添加到指定的集合时,它被触发。

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

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

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

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

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

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