Java:如何每分钟发送x封电子邮件

时间:2020-04-27 08:09:50

标签: java jakarta-mail

我需要向400个客户发送自定义电子邮件。
我正在这样做:

for (Client c : clients){
  setUpEmail(c);
  sendMail(c);
}

我的问题是我的电子邮件提供商授权我每分钟仅发送10封电子邮件。我该如何在循环中做到这一点? 谢谢。

3 个答案:

答案 0 :(得分:1)

使用番石榴的RateLimiter

如果您的库路径中已有番石榴,或者您有兴趣添加番石榴,则可以使用以下解决方案:

RateLimiter rateLimiter = RateLimiter.create(10/60d); // 10 permits per 60 seconds.
for (Client c : clients){
  setUpEmail(c);
  rateLimiter.acquire(1);
  sendMail(c);
}

您遇到的问题正是创建RateLimiter的原因。

答案 1 :(得分:0)

使用计数器,等待一分钟,当发送十封邮件时:

import pyspark.sql.functions as psf
df.select(psf.to_timestamp(psf.col('t'), 'MMM-YY HH:mm:ss').alias('dt'))

这不理想,因为您可能会浪费一些时间,例如当发送十封邮件需要20秒时,您只能等待40秒才能开始新的批量发送。

另一种选择是在每封邮件之间等待,以便10封邮件的时间至少为60秒:

Jan-17

还有一种更复杂的方法:

2017-01-01

答案 2 :(得分:0)

Deque clientsDeque = new ArrayDeque(clients);
ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
Runnable task = () => {
   for (int i=0; i<10; i++){
     Client c = clientsDeque.poll();
     setUpEmail(c);
     sendMail(c);
   }
}
executor.schedule(task, 60, TimeUnit.SECONDS);