论坛首页 Java企业应用论坛

javaMail 群发探讨

浏览 8453 次
精华帖 (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 异常。

有经验的分享下,一起探讨探讨。
   发表时间:2008-09-03  
自己搭建一个Email服务器吧。现在服务商提供的Email服务器限制很多。我估计是你虽然20秒发一次,一次15个。但是有可能20秒无法执行完发送15个的任务。累计下来,就超了。
1 请登录后投票
   发表时间: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"
0 请登录后投票
   发表时间: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());
    }
}
0 请登录后投票
   发表时间:2008-09-04  
对于自己搭建服务器,还是没有时间、精力。经验、
ok,就这样吧,实在想不到什么好办法。
最后只能用2个用户循环发,捕获到 MessagingException 和socketException时
停上3分钟。现在基本90%以上可以成功。
效率确实令人汗颜,24小时最多也就90000封,
不过垃圾制造的够多的
0 请登录后投票
   发表时间:2008-09-05  
呵呵,我写邮件的时候也常出问题,你比我好多了
0 请登录后投票
   发表时间:2008-09-06  
我也遇到过楼主的同楼的问题,现在自己建邮件服务用来群发。虽然可以发了 但是基本上所有的邮箱都把我发的邮件过滤了 要不就是当垃圾邮件。不知道应该怎么弄了
0 请登录后投票
   发表时间:2008-09-07  
xiao0556 写道
我也遇到过楼主的同楼的问题,现在自己建邮件服务用来群发。虽然可以发了 但是基本上所有的邮箱都把我发的邮件过滤了 要不就是当垃圾邮件。不知道应该怎么弄了

像163什么都服务器肯定是要验证你的服务器的,所以会不过,没办法,我现在只能这样弄了,还凑合。
0 请登录后投票
   发表时间:2008-12-02  
貌似不需要这样吧,我用递归发送,知道我集合里面所有数据发送完
我用gmail发送有限制每天100个。
你这个每天可以发9w??么得限制??
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics