我正在将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行出错,并显示错误:
表达式中此点或之前的不完整结构化构造
答案 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#中做到这一点。