浏览 8453 次
锁定老帖子 主题:javaMail 群发探讨
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-09-03
现在遇到了几个问题: 1:邮件地址无效,并非格式无效,会导致错误之后的其他地址发送不成功。 2:smtp服务器有限制。 第一个经过努力已经基本解决,可以捕获一个SendFailedException 异常,从异常类中获取然:e.getValidUnsentAddresses(),之后递归一下。 第二个问题是存在的,并且我反复检查程序也没发现什么问题,每次密抄15个,20秒执行一次,根据服务提供的信息,应该不会受到smtp服务器限制。可还是发上14左右后就抛异常了。 javax.mail.MessagingException: 451 Out of recipients limit for this sender ....... 有时抛socket 异常。 有经验的分享下,一起探讨探讨。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-09-03
自己搭建一个Email服务器吧。现在服务商提供的Email服务器限制很多。我估计是你虽然20秒发一次,一次15个。但是有可能20秒无法执行完发送15个的任务。累计下来,就超了。
|
|
返回顶楼 | |
发表时间:2008-09-03
应该不会,我是发完15条之后停20秒,总会有20秒空闲的吧。
代码发上来看看有啥问题没: ................ public static boolean sendMail(String subject,String body,String to,String content,Address[] ValidUnsentAddresses,boolean isReSend) { logger.info("***开始发送邮件***"); boolean result=false; try { Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider()); // Get a Properties object Properties props = System.getProperties(); props.setProperty("mail.smtp.host", STMT_SERVER);// --设置SMTP服务器地坄1�7 props.setProperty("mail.transport.protocol", "smtp");// --设置使用smtp协议 // props.setProperty("mail.smtp.socketFactory.class", SSL_FACTORY); props.setProperty("mail.smtp.socketFactory.fallback", "false"); props.setProperty("mail.smtp.port", PORT);// --设置SMTP端口叄1�7 props.setProperty("mail.smtp.socketFactory.port", PORT); props.put("mail.smtp.auth", "true");// --SMTP服务用户认证 final String username = USERNAME; final String password = PASSWORD; // --认证 Session session = Session.getDefaultInstance(props, new Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(username, password); } }); // --是否以调试模式运衄1�7 session.setDebug(true); Transport transport = session.getTransport("smtp"); Message msg = new MimeMessage(session); // -- 创建丄1�7个新信息 -- if(ValidUnsentAddresses==null){ List list=new ArrayList();; String[] gods=to.split(","); for (int i = 0; i < gods.length; i++) { try { if(gods[i]!=null && !"".equals(gods[i])&&SendMailManager.checkEmail(gods[i])){ list.add(new InternetAddress(gods[i])); } } catch (AddressException e) { logger.error(SendMailManager.class.getName()+" :"+e.getMessage()); e.printStackTrace(); } } // ---------- InternetAddress[] address = (InternetAddress[])list.toArray(new InternetAddress[list.size()]); msg.setRecipients(Message.RecipientType.BCC, address); }else{ msg.setRecipients(Message.RecipientType.BCC, ValidUnsentAddresses); } // --发�1�7�人 msg.setFrom(new InternetAddress(USER_EMAIL)); // --标题 msg.setSubject(subject); // --发�1�7�时闄1�7 msg.setSentDate(new Date()); if(body!=null&&!"".equals(body)){ MimeMultipart mp = new MimeMultipart(); MimeBodyPart bp = new MimeBodyPart(); bp.setContent(body, "text/html;charset=utf-8"); mp.addBodyPart(bp); msg.setContent(mp); }else if(!"".equals(content)){ msg.setText(content); } msg.saveChanges(); transport.connect((String) props.get("mail.smtp.host"),USER_EMAIL, password); transport.sendMessage(msg, msg.getRecipients(Message.RecipientType.BCC)); transport.close(); result=true; System.out.println("邮件已发送成功!"); } catch (SendFailedException e) { try { Thread.currentThread().sleep(10000); } catch (InterruptedException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } if(e.getValidUnsentAddresses()!=null && isReSend){ sendMail(subject,body,"",content,e.getValidUnsentAddresses(),false); } }catch (MessagingException e) { result=false; System.out.println("邮件已发失败!"); logger.error(SendMailManager.class.getName()+" :"+e.getMessage()); e.printStackTrace(); }finally{ //System.out.println(new Date().toLocaleString()+"连接smtp一次"); } return result; } 外部调用的是这个 sendMail(subject,body,to,content,null,true); 完成后当前线程sleep20秒 to=“地址1,地址2" |
|
返回顶楼 | |
发表时间:2008-09-03
使用TaskExecutor试试,每个线程只发一封邮件,然后放在异步线程池中,每20秒钟执行Task一次
public class SendMail implements Runnable { public SendMail() { } public void run() { // 发送一封邮件 } } public class Task { private TaskExecutor executor;// 任务执行器 public void execute() { executor.execute(new SendMai()); } } |
|
返回顶楼 | |
发表时间:2008-09-04
对于自己搭建服务器,还是没有时间、精力。经验、
ok,就这样吧,实在想不到什么好办法。 最后只能用2个用户循环发,捕获到 MessagingException 和socketException时 停上3分钟。现在基本90%以上可以成功。 效率确实令人汗颜,24小时最多也就90000封, 不过垃圾制造的够多的 |
|
返回顶楼 | |
发表时间:2008-09-05
呵呵,我写邮件的时候也常出问题,你比我好多了
|
|
返回顶楼 | |
发表时间:2008-09-06
我也遇到过楼主的同楼的问题,现在自己建邮件服务用来群发。虽然可以发了 但是基本上所有的邮箱都把我发的邮件过滤了 要不就是当垃圾邮件。不知道应该怎么弄了
|
|
返回顶楼 | |
发表时间:2008-09-07
xiao0556 写道 我也遇到过楼主的同楼的问题,现在自己建邮件服务用来群发。虽然可以发了 但是基本上所有的邮箱都把我发的邮件过滤了 要不就是当垃圾邮件。不知道应该怎么弄了
像163什么都服务器肯定是要验证你的服务器的,所以会不过,没办法,我现在只能这样弄了,还凑合。 |
|
返回顶楼 | |
发表时间:2008-12-02
貌似不需要这样吧,我用递归发送,知道我集合里面所有数据发送完
我用gmail发送有限制每天100个。 你这个每天可以发9w??么得限制?? |
|
返回顶楼 | |