javaMail 群发探讨最近才接触到邮件群发,用于包揽公司的海量客户。现在遇到了几个问题:1:邮件地址无效,并非
javaMail 群发探讨
最近才接触到邮件群发,用于包揽公司的海量客户。
现在遇到了几个问题:
1:邮件地址无效,并非格式无效,会导致错误之后的其他地址发送不成功。
2:smtp服务器有限制。
第一个经过努力已经基本解决,可以捕获一个SendFailedException 异常,从异常类中获取然:e.getValidUnsentAddresses(),之后递归一下。
第二个问题是存在的,并且我反复检查程序也没发现什么问题,每次密抄15个,20秒执行一次,根据服务提供的信息,应该不会受到smtp服务器限制。可还是发上14左右后就抛异常了。
javax.mail.MessagingException: 451 Out of recipients limit for this sender .......
有时抛socket 异常。
有经验的分享下,一起探讨探讨。................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 objectProperties props = System.getProperties();props.setProperty("mail.smtp.host", STMT_SERVER);// --设置SMTP服务器地坄1?7props.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?7props.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?7session.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?7msg.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 blocke1.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"public class SendMail implements Runnable { public SendMail() { } public void run() { // 发送一封邮件 }}public class Task { private TaskExecutor executor;// 任务执行器 public void execute() { executor.execute(new SendMai()); }} 5 楼 snarkzen 2008-09-05 呵呵,我写邮件的时候也常出问题,你比我好多了 6 楼 xiao0556 2008-09-06 我也遇到过楼主的同楼的问题,现在自己建邮件服务用来群发。虽然可以发了 但是基本上所有的邮箱都把我发的邮件过滤了 要不就是当垃圾邮件。不知道应该怎么弄了 7 楼 tou3921 2008-09-07 xiao0556 写道我也遇到过楼主的同楼的问题,现在自己建邮件服务用来群发。虽然可以发了 但是基本上所有的邮箱都把我发的邮件过滤了 要不就是当垃圾邮件。不知道应该怎么弄了
像163什么都服务器肯定是要验证你的服务器的,所以会不过,没办法,我现在只能这样弄了,还凑合。 8 楼 mysoko 2008-12-02 貌似不需要这样吧,我用递归发送,知道我集合里面所有数据发送完
我用gmail发送有限制每天100个。
你这个每天可以发9w??么得限制??