用javamail写了个群发邮件的程序,问题是如果一个收件地址错误,全部邮件都发不出去!?求解决办法

Android_ 2013-06-27 03:07:30
能不能在发送邮件之前就能检测到收件人地址是不是有效地址?这样就可以在群发时如果某个收件地址错误直接跳过
...全文
3439 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
番茄鲨鱼面 2015-09-25
  • 打赏
  • 举报
回复
实践证明,InternetAddress是行不通的。楼主怎么解决的?
践行者John 2015-01-21
  • 打赏
  • 举报
回复
我也遇到群发失败的问题,其实很好解决, 1.在catch里拿到SendFailedException, 2.校验下是否能转为SMTPAddressFailedException如果能转型,则转型 3.从SMTPAddressFailedException里能拿到校验不通过的用户,从收件人地址里删除,然后重发即可 多了一次发送请求而已。
sunmun 2015-01-16
  • 打赏
  • 举报
回复
这个问题最终解决了吗?
虎翼 2013-07-05
  • 打赏
  • 举报
回复
参见 http://www.cnblogs.com/Rockay/archive/2009/05/29/1491771.html
虎翼 2013-07-05
  • 打赏
  • 举报
回复
好像用smtp命令可以判定邮件地址是否有效. 通过邮箱专用smtp命令,尝试向邮箱发送邮件,邮箱服务器会返回邮箱是否真实存在,实际上并不发送邮件。 http://www.hbcms.com/cms/e7/361.html
文心寒梅 2013-07-02
  • 打赏
  • 举报
回复
引用 23 楼 Android_ 的回复:
[quote=引用 22 楼 wenxinhanmei 的回复:] [quote=引用 10 楼 Android_ 的回复:] [quote=引用 9 楼 a1006570862 的回复:] 把代码贴出来吧亲,这才有点底
public static boolean sendEmails(String content, String title, String[] address) {
		if (title.length() > 30) {
			title = title.substring(0, 30) + "...";
		}
		String receivers = "";
		boolean isSend = false;
		try {
			Address[] tos = null;
			if (address != null && address.length != 0) {
				tos = new InternetAddress[address.length];
				for (int i = 0; i < address.length; i++) {
					String s = address[i];
					tos[i] = new InternetAddress(s);
					receivers += s + ",";
				}
			}
			
			Properties p = new Properties();
			p.put("mail.smtp.auth", "true");
			p.put("mail.transport.protocol", "smtp");
			p.put("mail.smtp.host", "mail.XXX.com");
			p.put("mail.smtp.port", "25");
			Session session = Session.getInstance(p);
			Message msg = new MimeMessage(session);

			msg.setContent(content, "text/html;charset=utf8");
			msg.setFrom(new InternetAddress("XXX@XXX.com"));
			msg.setRecipients(Message.RecipientType.TO, tos);
			msg.setSentDate(new Date());
			msg.setSubject(title);
			msg.setContent(content, "text/html;charset=utf8");
			Transport tran = session.getTransport("smtp");
			tran.connect("mail.XXX.com", "XXX@XXX.com", "XXXXXX");
			tran.sendMessage(msg, msg.getAllRecipients());
			tran.isConnected();
			isSend = true;
		} catch (Exception e) {
			isSend = false;
		}
		return isSend;
	}
[/quote] 将收件人地址设置成InternetAddress[] 具体操作为: InternetAddress[] tos= new InternetAddress[address.length]; for (int i = 0; i < address.length; i++) { if(!address[i].trim().matches("^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)+$")){ System.exit(-1); } tos[i] = new InternetAddress(address[i].trim()); } mimeMsg.setRecipients(MimeMessage.RecipientType.TO,tos);//设置收件人,抄送 这样可以跳过不存在的地址。 实例地址 http://download.csdn.net/detail/wenxinhanmei/5397705 java邮件发送程序,在配置文件中配置配置邮件内容,收件人信息。[/quote] 不是地址格式上的检测,是某个邮箱地址看上去是合法,但实际不存在这个用户的情况下 就会失败,也不能跳过有问题的地址继续发送[/quote] 用InternetAddress[] 设置收件人地址,就会跳过不存在地址,继续发送。上面的实例是测试通过的。
Android_ 2013-07-01
  • 打赏
  • 举报
回复
引用 22 楼 wenxinhanmei 的回复:
[quote=引用 10 楼 Android_ 的回复:] [quote=引用 9 楼 a1006570862 的回复:] 把代码贴出来吧亲,这才有点底
public static boolean sendEmails(String content, String title, String[] address) {
		if (title.length() > 30) {
			title = title.substring(0, 30) + "...";
		}
		String receivers = "";
		boolean isSend = false;
		try {
			Address[] tos = null;
			if (address != null && address.length != 0) {
				tos = new InternetAddress[address.length];
				for (int i = 0; i < address.length; i++) {
					String s = address[i];
					tos[i] = new InternetAddress(s);
					receivers += s + ",";
				}
			}
			
			Properties p = new Properties();
			p.put("mail.smtp.auth", "true");
			p.put("mail.transport.protocol", "smtp");
			p.put("mail.smtp.host", "mail.XXX.com");
			p.put("mail.smtp.port", "25");
			Session session = Session.getInstance(p);
			Message msg = new MimeMessage(session);

			msg.setContent(content, "text/html;charset=utf8");
			msg.setFrom(new InternetAddress("XXX@XXX.com"));
			msg.setRecipients(Message.RecipientType.TO, tos);
			msg.setSentDate(new Date());
			msg.setSubject(title);
			msg.setContent(content, "text/html;charset=utf8");
			Transport tran = session.getTransport("smtp");
			tran.connect("mail.XXX.com", "XXX@XXX.com", "XXXXXX");
			tran.sendMessage(msg, msg.getAllRecipients());
			tran.isConnected();
			isSend = true;
		} catch (Exception e) {
			isSend = false;
		}
		return isSend;
	}
[/quote] 将收件人地址设置成InternetAddress[] 具体操作为: InternetAddress[] tos= new InternetAddress[address.length]; for (int i = 0; i < address.length; i++) { if(!address[i].trim().matches("^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)+$")){ System.exit(-1); } tos[i] = new InternetAddress(address[i].trim()); } mimeMsg.setRecipients(MimeMessage.RecipientType.TO,tos);//设置收件人,抄送 这样可以跳过不存在的地址。 实例地址 http://download.csdn.net/detail/wenxinhanmei/5397705 java邮件发送程序,在配置文件中配置配置邮件内容,收件人信息。[/quote] 不是地址格式上的检测,是某个邮箱地址看上去是合法,但实际不存在这个用户的情况下 就会失败,也不能跳过有问题的地址继续发送
Android_ 2013-06-28
  • 打赏
  • 举报
回复
引用 19 楼 shawncpp 的回复:
没发达前系统也不知道地址是否有效啊,只有发送后才知道,所以你说的这个问题不应该存在,看看是不是别的原因造成的呢?
我测试过一些有效地址加一个不存在的地址(公司邮箱) 然后就全部发送失败 我是想能不能想办法跳过无效地址继续发送其他的
浅忆流觞 2013-06-28
  • 打赏
  • 举报
回复
没发达前系统也不知道地址是否有效啊,只有发送后才知道,所以你说的这个问题不应该存在,看看是不是别的原因造成的呢?
sun__flow 2013-06-28
  • 打赏
  • 举报
回复
引用 17 楼 Android_ 的回复:
[quote=引用 15 楼 sun__flow 的回复:] [quote=引用 13 楼 Android_ 的回复:] [quote=引用 12 楼 sun__flow 的回复:] [quote=引用 11 楼 Android_ 的回复:] [quote=引用 4 楼 Acesidonu 的回复:] [quote=引用 1 楼 a1006570862 的回复:] 正则表达式可以判断email正确与否
++[/quote] 不是地址格式问题,是比如aaa@xxx.com这个邮件地址不存在,就会发送失败 或者能不能解决一个地址有问题 群发的全部邮件都失败的问题[/quote]群发其实就是把待发的地址放到一起,然后一个一个的发,和短信一样,不是一下子都发出去的,所以你要检查一个地址发送一个,不符合就跳过,检查下一个,直到所有地址循环一遍,循环结束再返回错误地址[/quote] 好像不能再发送前检查地址,还有就是如果按你这样说的一个一个发 收件人那看到的就不是群发。 我要收件人也知道这是群发邮件 看得到所有收件人[/quote]哦,那我知道是怎么回事了,你说的这种问题我遇到过,不过我是在局域网里,公司内部邮件,用的Outlook Express,每次发送都会检查,如果有地址不存在,那就一个都不能发送,这应该是正常现象[/quote]是啊 ,我发现客户端发送能跳过无效地址,就是不知道JavaMail怎么处理[/quote]你理解错了吧,如果其中一个地址不存在,那这封邮件就不能发送,这是正常现象,不会跳过无效地址的
Android_ 2013-06-28
  • 打赏
  • 举报
回复
引用 15 楼 sun__flow 的回复:
[quote=引用 13 楼 Android_ 的回复:] [quote=引用 12 楼 sun__flow 的回复:] [quote=引用 11 楼 Android_ 的回复:] [quote=引用 4 楼 Acesidonu 的回复:] [quote=引用 1 楼 a1006570862 的回复:] 正则表达式可以判断email正确与否
++[/quote] 不是地址格式问题,是比如aaa@xxx.com这个邮件地址不存在,就会发送失败 或者能不能解决一个地址有问题 群发的全部邮件都失败的问题[/quote]群发其实就是把待发的地址放到一起,然后一个一个的发,和短信一样,不是一下子都发出去的,所以你要检查一个地址发送一个,不符合就跳过,检查下一个,直到所有地址循环一遍,循环结束再返回错误地址[/quote] 好像不能再发送前检查地址,还有就是如果按你这样说的一个一个发 收件人那看到的就不是群发。 我要收件人也知道这是群发邮件 看得到所有收件人[/quote]哦,那我知道是怎么回事了,你说的这种问题我遇到过,不过我是在局域网里,公司内部邮件,用的Outlook Express,每次发送都会检查,如果有地址不存在,那就一个都不能发送,这应该是正常现象[/quote]是啊 ,我发现客户端发送能跳过无效地址,就是不知道JavaMail怎么处理
Android_ 2013-06-28
  • 打赏
  • 举报
回复
引用 14 楼 Uncertain_Magic 的回复:
有可能tos获取的收件人地址有问题,你有没有打印出来看看?
我说的情况就是收件人地址不存在的情况下 群发就全部失败了 但有时就会有收件人地址是无效的
sun__flow 2013-06-28
  • 打赏
  • 举报
回复
引用 13 楼 Android_ 的回复:
[quote=引用 12 楼 sun__flow 的回复:] [quote=引用 11 楼 Android_ 的回复:] [quote=引用 4 楼 Acesidonu 的回复:] [quote=引用 1 楼 a1006570862 的回复:] 正则表达式可以判断email正确与否
++[/quote] 不是地址格式问题,是比如aaa@xxx.com这个邮件地址不存在,就会发送失败 或者能不能解决一个地址有问题 群发的全部邮件都失败的问题[/quote]群发其实就是把待发的地址放到一起,然后一个一个的发,和短信一样,不是一下子都发出去的,所以你要检查一个地址发送一个,不符合就跳过,检查下一个,直到所有地址循环一遍,循环结束再返回错误地址[/quote] 好像不能再发送前检查地址,还有就是如果按你这样说的一个一个发 收件人那看到的就不是群发。 我要收件人也知道这是群发邮件 看得到所有收件人[/quote]哦,那我知道是怎么回事了,你说的这种问题我遇到过,不过我是在局域网里,公司内部邮件,用的Outlook Express,每次发送都会检查,如果有地址不存在,那就一个都不能发送,这应该是正常现象
Uncertain_Magic 2013-06-28
  • 打赏
  • 举报
回复
有可能tos获取的收件人地址有问题,你有没有打印出来看看?
Android_ 2013-06-28
  • 打赏
  • 举报
回复
引用 12 楼 sun__flow 的回复:
[quote=引用 11 楼 Android_ 的回复:] [quote=引用 4 楼 Acesidonu 的回复:] [quote=引用 1 楼 a1006570862 的回复:] 正则表达式可以判断email正确与否
++[/quote] 不是地址格式问题,是比如aaa@xxx.com这个邮件地址不存在,就会发送失败 或者能不能解决一个地址有问题 群发的全部邮件都失败的问题[/quote]群发其实就是把待发的地址放到一起,然后一个一个的发,和短信一样,不是一下子都发出去的,所以你要检查一个地址发送一个,不符合就跳过,检查下一个,直到所有地址循环一遍,循环结束再返回错误地址[/quote] 好像不能再发送前检查地址,还有就是如果按你这样说的一个一个发 收件人那看到的就不是群发。 我要收件人也知道这是群发邮件 看得到所有收件人
sun__flow 2013-06-28
  • 打赏
  • 举报
回复 1
引用 11 楼 Android_ 的回复:
[quote=引用 4 楼 Acesidonu 的回复:] [quote=引用 1 楼 a1006570862 的回复:] 正则表达式可以判断email正确与否
++[/quote] 不是地址格式问题,是比如aaa@xxx.com这个邮件地址不存在,就会发送失败 或者能不能解决一个地址有问题 群发的全部邮件都失败的问题[/quote]群发其实就是把待发的地址放到一起,然后一个一个的发,和短信一样,不是一下子都发出去的,所以你要检查一个地址发送一个,不符合就跳过,检查下一个,直到所有地址循环一遍,循环结束再返回错误地址
Android_ 2013-06-28
  • 打赏
  • 举报
回复
引用 4 楼 Acesidonu 的回复:
[quote=引用 1 楼 a1006570862 的回复:] 正则表达式可以判断email正确与否
++[/quote] 不是地址格式问题,是比如aaa@xxx.com这个邮件地址不存在,就会发送失败 或者能不能解决一个地址有问题 群发的全部邮件都失败的问题
文心寒梅 2013-06-28
  • 打赏
  • 举报
回复
引用 10 楼 Android_ 的回复:
[quote=引用 9 楼 a1006570862 的回复:] 把代码贴出来吧亲,这才有点底
public static boolean sendEmails(String content, String title, String[] address) {
		if (title.length() > 30) {
			title = title.substring(0, 30) + "...";
		}
		String receivers = "";
		boolean isSend = false;
		try {
			Address[] tos = null;
			if (address != null && address.length != 0) {
				tos = new InternetAddress[address.length];
				for (int i = 0; i < address.length; i++) {
					String s = address[i];
					tos[i] = new InternetAddress(s);
					receivers += s + ",";
				}
			}
			
			Properties p = new Properties();
			p.put("mail.smtp.auth", "true");
			p.put("mail.transport.protocol", "smtp");
			p.put("mail.smtp.host", "mail.XXX.com");
			p.put("mail.smtp.port", "25");
			Session session = Session.getInstance(p);
			Message msg = new MimeMessage(session);

			msg.setContent(content, "text/html;charset=utf8");
			msg.setFrom(new InternetAddress("XXX@XXX.com"));
			msg.setRecipients(Message.RecipientType.TO, tos);
			msg.setSentDate(new Date());
			msg.setSubject(title);
			msg.setContent(content, "text/html;charset=utf8");
			Transport tran = session.getTransport("smtp");
			tran.connect("mail.XXX.com", "XXX@XXX.com", "XXXXXX");
			tran.sendMessage(msg, msg.getAllRecipients());
			tran.isConnected();
			isSend = true;
		} catch (Exception e) {
			isSend = false;
		}
		return isSend;
	}
[/quote] 将收件人地址设置成InternetAddress[] 具体操作为: InternetAddress[] tos= new InternetAddress[address.length]; for (int i = 0; i < address.length; i++) { if(!address[i].trim().matches("^\\w+([-+.]\\w+)*@\\w+([-.]\\w+)+$")){ System.exit(-1); } tos[i] = new InternetAddress(address[i].trim()); } mimeMsg.setRecipients(MimeMessage.RecipientType.TO,tos);//设置收件人,抄送 这样可以跳过不存在的地址。 实例地址 http://download.csdn.net/detail/wenxinhanmei/5397705 java邮件发送程序,在配置文件中配置配置邮件内容,收件人信息。
zaz770977934 2013-06-28
  • 打赏
  • 举报
回复
for(){try {发送}catch{}}
Android_ 2013-06-27
  • 打赏
  • 举报
回复
引用 9 楼 a1006570862 的回复:
把代码贴出来吧亲,这才有点底
public static boolean sendEmails(String content, String title, String[] address) {
		if (title.length() > 30) {
			title = title.substring(0, 30) + "...";
		}
		String receivers = "";
		boolean isSend = false;
		try {
			Address[] tos = null;
			if (address != null && address.length != 0) {
				tos = new InternetAddress[address.length];
				for (int i = 0; i < address.length; i++) {
					String s = address[i];
					tos[i] = new InternetAddress(s);
					receivers += s + ",";
				}
			}
			
			Properties p = new Properties();
			p.put("mail.smtp.auth", "true");
			p.put("mail.transport.protocol", "smtp");
			p.put("mail.smtp.host", "mail.XXX.com");
			p.put("mail.smtp.port", "25");
			Session session = Session.getInstance(p);
			Message msg = new MimeMessage(session);

			msg.setContent(content, "text/html;charset=utf8");
			msg.setFrom(new InternetAddress("XXX@XXX.com"));
			msg.setRecipients(Message.RecipientType.TO, tos);
			msg.setSentDate(new Date());
			msg.setSubject(title);
			msg.setContent(content, "text/html;charset=utf8");
			Transport tran = session.getTransport("smtp");
			tran.connect("mail.XXX.com", "XXX@XXX.com", "XXXXXX");
			tran.sendMessage(msg, msg.getAllRecipients());
			tran.isConnected();
			isSend = true;
		} catch (Exception e) {
			isSend = false;
		}
		return isSend;
	}
加载更多回复(9)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧