我想创建一个侦听imap邮箱的电子邮件侦听器。我的基本想法是使用imap客户端继续轮询服务器,如何在f#中创建这种循环,如何将程序转换为可以干净地启动和停止的服务。另外,有没有更好的方法来监听imap服务器,而不是每隔几秒钟进行一次轮询?
修改:
我发现这个问题回答了我关于创建服务的问题: Writing a polling Windows service。 但问题仍然存在,这是否是正确的方式来收听IMAP邮箱。会不会有任何问题?
编辑2
我一直在寻找使用C#中的事件处理程序的S22.Imap但是我不知道如何在F#中实现它,基本上这一行:
// We want to be informed when new messages arrive
Client.NewMessage += new EventHandler<IdleMessageEventArgs>(OnNewMessage);
我认为这是程序保持活动的方式,它是否在这条线上等待事件?
代码的作者也把这个放在我不太明白的地方:
// Put calling thread to sleep. This is just so the example program does
// not immediately exit.
System.Threading.Thread.Sleep(60000);
有人可以向我解释如何在F#中实现这一点吗?完整示例可用here。
编辑3
不确定为什么这个问题被关闭了,也许没有读过编辑2的最后一句话。所以我的问题是:
有人可以向我解释如何在F#中实现事件处理吗?我在Google上找不到任何不适用于GUI应用程序的内容。如何将上面的示例C#代码转换为F#中的某些内容?
任何关于downvotes的解释也会受到赞赏,我的原始问题部分得到了一些人的回答,我为自己找到了一些答案,但还没有完全回答,这个问题只是演变成稍微不同的东西。
答案 0 :(得分:4)
看起来你正在使用的API使这非常容易。由于IMAP客户端提供NewMessage
事件,因此您无需实施自己的轮询。您引用的示例( EDIT 2 )是一个控制台应用程序,因此对Thread.Sleep
的调用会阻止它立即退出。这不是Windows服务中的问题。服务经理将保持该过程。以下代码应为您的服务提供工作基础。
open S22.Imap
type ImapService() =
inherit System.ServiceProcess.ServiceBase()
let mutable client = null
override __.OnStart(_) =
client <- new ImapClient("imap.gmail.com", 993,
"username", "password", AuthMethod.Login, true)
client.NewMessage.Add(fun args ->
let msg = client.GetMessage(args.MessageUID, FetchOptions.HeadersOnly)
//do something with msg
()
)
override __.OnStop() =
client.Dispose()