从2层应用程序发送电子邮件通知的客户端可能未连接到互联网
我必须将电子邮件通知添加到客户端服务器应用程序。从2层应用程序发送电子邮件通知的客户端可能未连接到互联网
通知发生在用户在客户端UI上执行某些特定操作时发生。
如果我有一个中间层或在服务器上运行的服务,我可以想像如何做到这一点:
1)我只需要创建一个数据库表以作为用户“等待通知”
2)并生成一个通知的动作,我将记录添加到表
3)服务器端我会不断尝试发送这些邮件,并从一次发送表中删除他们是成功的
现在,我现在不能做到这一点,我有一个计划去稍后再提供服务,但现在我必须采取快速和肮脏的方式。
所以某种程度上我在想什么的就是实现这样的:
1)作为通知价值的事件发生在客户端,相同的客户端(我的EXE)试图发送的通知,一旦失败就会在“待处理的通知”表中记录通知(失败可能是因为缺少互联网连接或任何其他问题)
2)我添加了一个可以从任何客户端机器检查待处理通知的计时器。如果有任何客户端会尝试发送电子邮件(使用事务:我将标记为“TryngToSendFromClientX”的字段,如果失败,我会将该字段重置为NULL)
我认为这种方法会工作,它有明显的局限性(如果失败后没有人登录到系统中,则不会发送通知 - 如果服务“关闭”)将发送通知。但是,您可以评论这种方法并提出更好的建议吗?
的其他注意事项(以更好地了解情况):
一)注:所有通知都来自同一个电子邮件帐户发送。
b)我不需要跟踪谁发送了电子邮件。
c)现在创建服务的问题在于它会使部署显着复杂化,我需要创建用于监视服务状态的工具。我将来会做但不是现在,将来我会计划为服务添加更多功能(不仅仅是发送通知),所以在这种情况下,创建它更有意义。
d)我将通过使用Indy组件和SMTP服务器发送电子邮件。
如果您现在不愿意创建服务,我认为您遇到了您描述的情况。有一些事情,虽然你可以做,以避免没有用户再次启动客户端的问题,而仍然有未决的消息。
您可以添加命令行实用程序(或命令行参数,如建议的bepe4711),它只会检查待处理消息并尝试发送它们。
将此命令行实用程序添加到注册表中的启动文件夹或运行密钥。这种方式至少会在计算机重新启动时发送消息,即使用户没有启动您的应用程序。
添加计划任务以每天至少运行一次此实用程序。计划任务可以通过代码或安装程序添加。
如果您同时执行这两项操作,您只需要担心从未启动计算机的用户的待处理消息。
也许你可以添加一个参数到你的客户端,这会导致它只查看待处理的通知并发送它们。之后它可以自行终止。它只会像某种服务一样行事。
然后在服务器上安装客户端并每隔x分钟启动一次。
mmmm ....在服务器上留下一个“空闲”运行客户端真的不是一个坏主意。它在快速和肮脏的领域,但有效。 – LaBracca 2010-06-24 07:42:57
如果你以后要写一个服务,我现在不会付出很大的努力来寻找解决方案。快速和肮脏,所以你有更多的时间来“真正”的服务... – bepe4711 2010-06-24 07:56:16
是的,我同意。为临时解决方案投入大量资金是浪费时间和金钱的。如果快速和肮脏以可接受的方式使工作(替代方案“完全没有工作”),这已经是一个改进。那么未来“真正”的实施将是最后的选择。 – LaBracca 2010-06-24 08:08:39
如果两个系统都在Windows上运行,请查看MS消息队列。它旨在将通知发送到系统,而不是通过在线方式。我在.Net中做过,已经实现了易于使用的类。不知道德尔福。
我做了一些非常类似于你描述的方法。我不需要发送电子邮件,而需要调用Web服务。我的应用程序安装在几台笔记本电脑上,通常不会连接到任何网络。
当我的应用程序引发异常时,我收集各种信息,包括用户评论和屏幕截图。然后我尝试将其发送到我们的Web服务。如果偶然,Web服务不可用。 (即未连接到Internet或Web服务已关闭)我将结果写入User Profile(App_Data)目录中的磁盘上的XML文件。
一个主要区别是我不轮询检查服务器是否启动。我试图在应用程序启动时再次发送它们。
是的,我会做类似的发送buglogs /报告。在这种情况下,他们没有发送消息,因为他们再也不会启动应用程序,这不是什么大问题。然而,OP要求建议避免依赖于用户再次启动应用程序的限制。 – 2010-06-24 10:05:59
我唯一的问题是,其他用户的通知感兴趣,所以我不能等待用户再次申请他的应用程序,这可能会在下周发生......太晚了。我为我的所有临时和用户设置文件使用App_Data文件夹,但在这种情况下,它对我来说不可行。 – LaBracca 2010-06-24 10:09:44
最新版本的Windows使用更多的Windows任务计划程序,现在任务可以在事件(即网卡连接...)时触发。您可以编写一个单独的实用程序,尝试发送待处理的通知,即使没有人登录。
一个单独的实用程序或服务器无论如何都是一个问题。我现在没有这个选项。 – LaBracca 2010-06-24 11:50:58
感谢您填写bepe4711答案。 – LaBracca 2010-06-24 08:09:17