日期:2014-05-18  浏览次数:20758 次

javamail群发大量用户的问题
现在要用javamail发送13万多用户,如何高效率的发送邮件,如果要用多线程,如何用,另外如果访问smtp服务器太过频繁,是否会发生服务器内部错误?最好能用一个简单的代码示例!上次我发送360多封邮件,发送邮件的过程中出现了500服务器内部错误,请高手指点一下!

------解决方案--------------------
一个邮件CC或to, 里面应该可以填充多个用户的吧?
------解决方案--------------------
发那么多,即时性本身肯定无法保证,建议做成TimeTask去调线程慢慢跑这个任务
------解决方案--------------------
探讨
发那么多,即时性本身肯定无法保证,建议做成TimeTask去调线程慢慢跑这个任务

------解决方案--------------------
顶4楼。
如果邮件内容相同,可以增加To或者Cc等地址列表的长度,把压力转给MTA一些。
------解决方案--------------------
我以前做过邮件服务器,收件人数量一定是会有限制的
------解决方案--------------------
探讨
一个邮件CC或to, 里面应该可以填充多个用户的吧?

------解决方案--------------------
1>. 用BCC, BCC一次抄送N个用户.
2>. 用多线程并行发送,当然每次要间隔一定时间,比如20s
可以用jdk1.5 concurrent 里的ScheduledExecutorService

代码如下:
//同时发送线程数量
final int POOL_SIZE = 20;
//BCC一次100个用户
final int BCC_SIZE = 100;
//每隔10秒发送一次
final int PEROID = 10;
//BCC邮件帐号分隔符
final String DELIMITER = ";";
//拿到所有邮件帐号
final List<String> allAddresses = getAllAddresses()

ScheduledExecutorService scheduler = 
Executors.newScheduledThreadPool(POOL_SIZE);

class SendRunnable implements Runnable {
private String address;
public SendRunnable(String address) {
this.address = address;
}
public void run() {
//send email...
}
}

StringBuilder bccBuffer = new StringBuilder();
for (int i = 0; i < allAddresses.size(); ++i) {
bccBuffer.append(allAddresses.get(i)).append(DELIMITER);
if (i % BCC_SIZE == 0) {
scheduler.scheduleAtFixedRate(new SendRunnable(bccBuffer.toString()), 0, PEROID, TimeUnit.SECONDS);
bccBuffer = new StringBuilder();
} else {
scheduler.scheduleAtFixedRate(new SendRunnable(bccBuffer.toString()), 0, PEROID, TimeUnit.SECONDS);
}
}
try {
scheduler.awaitTermination(Long.MAX_VALUE, TimeUnit.SECONDS);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
------解决方案--------------------
一次发送一定量的邮件。
相隔一定时间后发送,也就是定时发送。
------解决方案--------------------
探讨
继续讨论起,bcc懂起什么意思!

------解决方案--------------------
用哪里的邮件服务器发送,一般的ISP都会做一些限制的,
发送很简单,用多线程 一封一封发送就可以了
------解决方案--------------------
探讨
但是smtp服务器好像禁止了群发的,我用的那个smtp服务器发到第100多封邮件的时候,就报错了!!超出最大发件限制!

------解决方案--------------------
个人认为建立独立的邮件系统,使用EJB调用或者Spring来控制该邮件系统发送邮件是较好的解决方法,这样不会给当前系统造成太大压力,也达到效果!
------解决方案--------------------
单独建立一个邮件系统,邮件系统和你的系统是2个独立体,而为了方便需要在你的系统中来调用邮件系统中发送邮件相关的类,这样就达到了目的,既缓解了系统压力而且群发肯定没有问题,因为是2个不同的系统,而这2个系统相对独立,统一起来就需要使用EJB或者Spring来调度了!因为涉及到2个系统的统一处很少,建议用Spring,这样更方便!