我有一个监听器,用于处理inetpub/mailroot/Queue
目录中的电子邮件。监听器处理完电子邮件后,会继续将电子邮件移动到另一个目录。但是,由于进程锁定了文件,因此无法移动电子邮件inetinfo.exe
。我注意到,该文件锁定会在几小时到几天的一段时间后释放。您可以看到,Queue
随着时间的推移,目录会变得非常满。
我能解决此问题的唯一方法是手动停止并启动 IIS 中的 SMTP 虚拟服务器。
是否可以通过编程方式释放此文件锁?如果不行,是否可以加快释放此文件锁?
更新
监听器会监控Queue
文件夹中的来信,然后处理这些邮件。然后,邮件中的数据会被插入到我们的内部程序中。监听器处理完邮件后,会将邮件移至其他地方的成功或失败目录。
解决了
近一年后,我再次遇到这个问题,终于解决了!解决方案是配置 SMTP 虚拟服务器的本地(默认)域,并将其设置为我想要处理的电子邮件的相应域。这样电子邮件就会进入文件夹,在那里Drop
可以自由操作,而不必担心进程锁定。
答案1
“队列”目录供 SMTP 服务器进程内部使用。您发现文件被锁定在那里,因为您不应该在那里处理它们。如果您的“队列”目录已满,那么您最好弄清楚为什么电子邮件传递失败。我不清楚旧的SMTPDiag 工具微软的 Windows Server 2008 可能可以运行,但它只是一个起点。
更新:
我不清楚你到底想用你的处理任务做什么。“队列”文件夹用于保存等待传递的消息。已接受本地传递的消息存储在“丢弃”文件夹中。假设你正在寻找已接受本地传递的消息,我会担心为什么它们会停留在“队列”中而不是“丢弃”中。除非出现问题,否则不应该在“队列”中堆积文件。
(顺便说一句:查找有关 Windows Server 2008 中的 SMTP 服务的文档变得相当困难。SMTP 服务一直有点孤儿的感觉,生活在 Windows 操作系统和 Exchange 之间的阴间。>叹息<)
答案2
注册表中有一些参数可以控制锁定时间......
但为了保持简单...
只需重新启动 IIS(如每‘n’分钟执行一次的计划任务),如果您使用的是 IIS 7.0,请按照这种方式执行...
// stop iis and other web services
net stop WAS
//
( pause a few seconds, +30s )
>>> Do your processing... files should be released now...
// start iis and web services
net start W3SVC