F#电子邮件监听器

时间:2012-11-22 22:55:35

标签: .net service f# listener imap

我想创建一个侦听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的解释也会受到赞赏,我的原始问题部分得到了一些人的回答,我为自己找到了一些答案,但还没有完全回答,这个问题只是演变成稍微不同的东西。

1 个答案:

答案 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()