4

我想做一个收听 imap 邮箱的电子邮件监听器。我的基本想法是继续使用 imap 客户端轮询服务器,我将如何在 f# 中创建这种循环以及如何将程序变成可以干净地启动和停止的服务。此外,有没有比每隔几秒钟轮询一次 imap 服务器更好的方法来监听 imap 服务器?

编辑

我发现这个问题回答了我关于创建服务的问题: 编写轮询 Windows 服务。但是问题仍然存在,这是收听 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# 中实现它吗?完整示例可在此处获得。

编辑 3

不知道为什么这个问题被关闭了,也许编辑 2 的最后一句话没有被阅读。所以我的问题是:

有人可以向我解释如何在 F# 中实现事件处理吗?我在谷歌上找不到任何不适合 GUI 应用程序的东西。如何将上面的示例 C# 代码转换为 F# 中的内容?

任何对否决票的解释也将不胜感激,我最初的问题得到了一些人的部分回答,我为自己找到了一些答案,但还没有完全回答,这个问题只是演变成稍微不同的东西。

4

1 回答 1

4

看起来您使用的 API 使这变得非常容易。NewMessage由于 IMAP 客户端提供事件,因此您无需实现自己的轮询。您引用的示例(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()
于 2012-11-26T20:54:08.740 回答