1

Say I have the following script on page.cfm. Everytime somebody comes to page.cfm, an e-mail is sent to me. So if 1000 people come to page.cfm, I get 1000 e-mails.

<cfmail to="joe@smith.com"
from="error@smith.com"
subject="Error"
type="text">
A person visited.
</cfmail>

I would like to limit it so I only get e-mails when the first 5 people visit in one day.

So if 2 people visit today, I get 2 e-mails. if 5 people visit I get 5, but if 100 people visit, I still get only 5 e-mails. And then the cycle continues the next day (if 2 people visit only 2 e-mails are send, but if 100 people visit only 5 e-mails are sent)

How can I do this with ColdFusion only? (without cfschedule)

4

3 回答 3

7

我能想到的最简单的方法是在一对应用程序变量中放置一个计数器和一个日期戳。

然后,对于每个请求,检查您记录的日期。如果不是今天,请将计数器变量重置为 1 并将日期重新设置为今天。

然后,在您放置 cfmail 标记的位置,检查计数器是否已达到您的限制。如果没有,请发送邮件。无论哪种方式,增加计数器。

在 Application.cfc onApplicationStart() 中:

<cfset application.alertDate = now()>
<cfset application.alertCount = 1>

(以上主要是为了保证以后使用时变量存在)

在 Application.cfc onRequestStart() 中:

<cfif dateCompare(application.alertDate,now(),"d") EQ -1)>
  <cfset application.alertCount = 1>
  <cfset application.alertDate = now()>
</cfif>

在 page.cfm 中:

<cfset application.alertCount++>
<cfif application.alertCount LTE 5>
  <cfmail ... >
</cfif>
于 2012-04-12T18:43:17.647 回答
2

将访问/电子邮件计数存储在应用程序范围中,并每天通过以下任一方式重置应用程序范围

  1. 将上次访问者日期也存储在应用程序范围内,并添加一些逻辑来重置计数,或者

  2. 每天使用 cfscheduler 将计数重置为 0

于 2012-04-12T18:41:36.400 回答
0

聚会迟到了,我还不能评论以前的答案,所以我会这样做。给出的两个答案都可以,但是您确实需要知道,如果您的应用程序结束,这些应用程序范围变量将消失并重新初始化。如果它对您很重要,您将希望将值保存在某处,例如使用 getProfileString/setProfileString 访问的 INI 文件或数据库中的表。

于 2012-04-19T01:39:42.407 回答