我需要向400个客户发送自定义电子邮件。我正在这样做:
for (Client c : clients){
setUpEmail(c);
sendMail(c);
}
我的问题是我的电子邮件提供商授权我每分钟仅发送10封电子邮件。我该如何在循环中做到这一点?谢谢。
RateLimiter
。如果您的库路径中已经包含番石榴,或者您有兴趣添加它,则可以使用以下解决方案:
RateLimiter
您的问题恰恰是创建RateLimiter rateLimiter = RateLimiter.create(10/60d); // 10 permits per 60 seconds.
for (Client c : clients){
setUpEmail(c);
rateLimiter.acquire(1);
sendMail(c);
}
的原因。
使用计数器,等待十分钟后发送:
RateLimiter
这不理想,因为您可能会浪费一些时间,例如当发送十封邮件需要20秒时,您只能等待40秒才能开始新的批量发送。
另一种选择是在每封邮件之间等待,以使10封邮件的时间至少为60秒:
int counter = 0;
for (Client c : clients){
counter++;
setUpEmail(c);
sendMail(c);
if(counter%10==0){
Thread.sleep(60*1000); // wait a minute
}
}
以及更复杂的一个:
for (Client c : clients){
setUpEmail(c);
sendMail(c);
Thread.sleep(6*1000); // wait 6 seconds
}
int counter = 0;
long start = System.currentTimeMillis();
for (Client c : clients){
counter++;
setUpEmail(c);
sendMail(c);
if(counter%10==0){
long needed = System.currentTimeMillis() - start; // ms needed for ten mails
Thread.sleep(60*1000 - needed); // wait rest of the minute
start = System.currentTimeMillis(); // start of the next bulk
}
}