使用F#的Outlook互操作MailItem

时间:2015-03-27 21:06:07

标签: f# outlook vsto c#-to-f#

我正在将C#转换为F#以获取Outlook电子邮件消息。如果发送电子邮件给我发送异常,将在try ... with block中调用此函数。我通常使用仅在生产环境中工作的SMTP邮件服务。我必须在开发中使用Outlook。

open System.Net.Mail
open System.Runtime.InteropServices
open System.Reflection
open System.Collections
open System.Threading
open Microsoft.Office.Interop
open Microsoft.Office.Interop.Outlook

let sendEmail2 (sMessage:string) =
    let subject = "Load Failed at " + DateTime.Now.ToString() + "."
    let body = sMessage
    let app = new Outlook.ApplicationClass
    let mailItem = new app.CreateItem(OlItemType.olMailItem)
    //let mailItem = app.CreateItem(OlItemType.olMailItem)
    mailItem.Subject = subject
    mailItem.Body = body
    mailItem.To = "user@mycompany.com"
    mailItem.Send()

问题在于创建MailItem。最初的C#代码就是这样做的

Outlook.Application app = new Outlook.Application();
Outlook.MailItem mailItem = app.CreateItem(Outlook.OlItemType.olMailItem);

我尝试在等号右侧使用C#代码,完全引用互操作程序集等。我甚至查看了MSDN Word和Excel中的一个示例来引用ApplicationClass。我甚至认为使用MailItemClass,但它受到保护。

它始终在mailItem行出错,并显示错误:

  

表达式中此点或之前的不完整结构化构造

1 个答案:

答案 0 :(得分:3)

错误消息表示在报告错误的位置附近某处存在语法错误。所以,看一下,第一个问题是在构造Outlook.ApplicationClass的实例时你缺少参数。它应该是:

let app = new Outlook.ApplicationClass()

正如评论中已经提到的,还有其他问题 - 分配应使用<-编写,app.CreateItem是方法调用,因此您不需要new

let mailItem = app.CreateItem(OlItemType.olMailItem)
mailItem.Subject <- subject
mailItem.Body <- body
mailItem.To <- "user@mycompany.com"

作为旁注,这可能不是一个你可以从使用F#获得很多好处的领域,所以如果这是为了工作,最好将代码保留在C#中并使用F#进行一些操作比Office互操作更多的功能问题。但你也可以在F#中做到这一点。