我想知道是否有人知道通过C#发送多少封电子邮件的好方法?
这是我的情景。我有一个Windows服务,监视其他三个Windows服务。我正在使用服务控制器来获取所有3个服务的状态,如果任何这些服务的状态变为停止,它会发送一封电子邮件。我的问题是,我在一个60秒的计时器上运行它,所以它每60秒发送一次电子邮件,直到有人启动服务备份。
我的第一个想法是,在发送第一封电子邮件时,创建一个文本文件并使用计数器对其进行编号。在计数器< 6所以我最多只能收到5封电子邮件。我认为这会有效,但看起来有点傻。
有没有人可以替代这个,或者我应该先考虑一下并对文件进行清理?
谢谢
编辑:我试图限制发送的电子邮件数量的原因是因为收到这些电子邮件的人不会很快做出反应。与此同时,处理Exchange的人不希望该服务向人们发送垃圾邮件。我觉得5就足以安抚双方了。答案 0 :(得分:2)
我建议您应该跟踪每项服务的停机时间。
因此,每隔60秒检查一次,如果服务已关闭,请存储服务已关闭的DateTime。在接下来的60秒间隔内,您可以检查服务是否已经关闭。即你可以判断服务是否已经停止或已经停止了一段时间。您还可以添加另一个标志以确定上次检查是上升还是下降。
然后,当程序首次找到服务时,它可以发送电子邮件。一旦服务恢复,它可以重置此标志值,以便下次知道发送新电子邮件的停机时间。
如果需要,您还可以使用这些标志来延迟电子邮件频率。只需为LastEmailSentTime添加一个新的DateTime字段,并将其与您想要的错误电子邮件间隔(例如10分钟)进行比较
希望能给你一些想法
编辑:一些示例...
bool ServiceWasDown = false;
DateTime ServiceDownTime = DateTime.Now;
DateTime LastEmailTime = DateTime.Now;
void OnTimerElapsed()
{
if(IsServiceDown())
ServiceDown();
else
ServiceUp();
}
void ServiceDown()
{
if(ServiceWasDown)//already know about service
{
//if LastEmailTime more than 10 minutes ago send another email and update LastEmailTime
}
else//service just went down
{
//send new email
LastEmailTime = DateTime.Now;
ServiceWasDown = true;
ServiceDownTime = DateTime.Now;
}
}
void ServiceUp()
{
ServiceWasDown = false;
}
答案 1 :(得分:1)
如果您使用System.Timers.Timer,那么您可以为计数Elapsed事件添加一个int变量。