created_at->diffInMonths() * 100; return min($limit, 5000); } public function isThrottled(Company $company) { $key = $company->company_key; // http://stackoverflow.com/questions/1375501/how-do-i-throttle-my-sites-api-users $day = 60 * 60 * 24; $day_limit = $this->getDailyEmailLimit(); $day_throttle = Cache::get("email_day_throttle:{$key}", null); $last_api_request = Cache::get("last_email_request:{$key}", 0); $last_api_diff = time() - $last_api_request; if (is_null($day_throttle)) { $new_day_throttle = 0; } else { $new_day_throttle = $day_throttle - $last_api_diff; $new_day_throttle = $new_day_throttle < 0 ? 0 : $new_day_throttle; $new_day_throttle += $day / $day_limit; $day_hits_remaining = floor(($day - $new_day_throttle) * $day_limit / $day); $day_hits_remaining = $day_hits_remaining >= 0 ? $day_hits_remaining : 0; } Cache::put("email_day_throttle:{$key}", $new_day_throttle, 60); Cache::put("last_email_request:{$key}", time(), 60); if ($new_day_throttle > $day) { $error_email = config('ninja.error_email'); if ($error_email && ! Cache::get("throttle_notified:{$key}")) { Mail::raw('Account Throttle: '.$company->company_key, function ($message) use ($error_email, $company) { $message->to($error_email) ->from(config('ninja.contact.email')) ->subject('Email throttle triggered for company '.$company->id); }); } Cache::put("throttle_notified:{$key}", true, 60 * 24); return true; } return false; } }