Javamail 问题 关于 javax.mail.SendFailedException: Invalid Addresses

Blue55 2008-02-22 04:46:41
通过javamail实现发送邮件的程序。

通过下面的方法添加目标邮件地址:
String addressTo = dd01@sina.com.cn;aa02@yahoo.com.cn;bb03@163.com;test@test.com
Message msg = new MimeMessage(session);
if(addressTo!=null&&!addressTo.equals(""))
{
msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(addressTo));
}
通过下面的方法最终发送邮件。
Transport.send(msg);

如果目标邮件地址中有一些不被邮件服务器认可的邮件地址如上面的 test@test.com
"String addressTo = dd01@sina.com.cn;aa02@yahoo.com.cn;bb03@163.com;test@test.com"
会导致邮件整体发送失败,也不会向其他正确的邮件地址发送邮件。会报以下exception:
javax.mail.SendFailedException: Invalid Addresses com.sun.mail.smtp.SMTPAddressFailedException: 550 5.7.1 Unable to relay for test@test.com

但是把这样的邮件目标列表复制到Out Look中向相同的邮件服务器发送测试如下
dd01@sina.com.cn;aa02@yahoo.com.cn;bb03@163.com;test@test.com
除了test@test.com以外都是正确合法的邮件地址。
得到的结果是正确的地址都能收到邮件,不存在的地址会被邮件服务器返回一封不能送达邮件的提醒信息。

请教javamail是不是有其他实现方式或者发送方法能够避免这种整体发送失败的情况出现,得到像Out Look中的测试结果呢?
是不是方法调用Transport.send(msg);的不正确?
备注:如果目标邮件地址都是正确存在的邮件地址可以发送成功String addressTo = dd01@sina.com.cn;aa02@yahoo.com.cn;bb03@163.com;test@test.com

希望有经验的朋友给点提示 谢谢。
...全文
11041 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
johnnynie 2012-07-04
  • 打赏
  • 举报
回复
今天遇到同样的问题,在网上寻找解决办法居然没找到.
没办法,问题还是要解决,于是打开java EE api,终于找到了解决办法.
下面把解决办法记录下来,说不定还填补了一下网络上解决此问题的空白.


API中有一个javax.mail.SendFailedException的异常类.
此类具有以下三个实用方法:
1、getInvalidAddresses()
返回无法向其发送此消息的地址。
返回消息发送失败的地址,或者返回 null;
2、getValidSentAddresses()
返回此消息成功发送到的地址。
返回成功将消息发送到的地址,或者返回 null
3、getValidUnsentAddresses()
返回未向其发送此消息的有效地址。
返回有效但未能成功将消息发送到的地址,或者返回 null

因此程序中可如下实现:

public static void sendMail(String toMailAddress) {
try {
//此处是发邮件的实现代码
}catch(SendFailedException e){//捕获SendFailedException异常
Address[] a = e.getValidUnsentAddresses(); //得到有效但未能成功将消息发送到的地址
if(null!=a){
String validAddress = "";
for(int i=0;i<a.length;i++){//重新组成真实存在的地址
validAddress += a[i] + ",";
}
validAddress = validAddress.substring(0,validAddress.length()-1);
sendMailWhenException(validAddress);//再次发送给真实存在的地址,此处不再调用sendMail方法,防止死循环(重新定义一个sendMailWhenException方法,此方法异常捕获中不要再尝试发送,以防止死循环)
}else{
e.printStackTrace();
}
}

原来缘来 2011-09-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 johnson_hong 的回复:]
可以自己实现一个方法,输入邮件的字符串,然后通过分隔符将它们放到数组,循环数组对邮件逐一进行发送,捕捉到异常的返回失败信息
[/Quote]

我也是这么想的
zdq274155366 2011-09-21
  • 打赏
  • 举报
回复
gchfghfghfg
水瘦山寒 2008-05-23
  • 打赏
  • 举报
回复
if (props == null)
props = System.getProperties();
if (need) {
props.put("mail.smtp.auth", "true");
} else {
props.put("mail.smtp.auth", "false");
}
// smtp是否需要认证
设置为不需要验证试一下
wojiushicai 2008-05-23
  • 打赏
  • 举报
回复
路过了
signal_001 2008-05-18
  • 打赏
  • 举报
回复
你好,我看见你说的那个JAVAMAIL那个异常的错误,我这几天做也遇到了, 当要发送的地址不存在时就报错,而且同时密送的都发送失败。想问你解决了没有?我qq50513757,希望能联系我,谢谢
fengfengjava 2008-05-07
  • 打赏
  • 举报
回复
求那为高手解决
fengfengjava 2008-05-07
  • 打赏
  • 举报
回复
String from = request.getParameter("from");
String to = request.getParameter("to");
String subject = request.getParameter("subject");
String context = request.getParameter("context");
// 确定要发送的邮件服务器的地址
String mailserver = "pop.sina.com";
// 设置邮件的传输协议
try {
Properties prop = System.getProperties();
prop.put("mail.smtp.host", mailserver);
// 建立邮件发送的连接
Session session = Session.getDefaultInstance(prop, null);
// 创建发送的信息的载体
Message msg = new MimeMessage(session);
// 设置相关的邮件属性
msg.setFrom(new InternetAddress(from));
// 点到点的发送
msg.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
/*
* //群发 msg.setRecipients(Message.RecipientType.TO, new
* InternetAddress[]{new InternetAddress(to),new
* InternetAddress(to)}); //借助循环的标准发送
*/
msg.setSubject(subject);
msg.setSentDate(new Date());
msg.setText(context);
// 发送
Transport.send(msg);
} catch (Exception e) {
e.printStackTrace();

}

out.print("send ok");

报下面的错误
javax.mail.SendFailedException: Invalid Addresses;
nested exception is:
com.sun.mail.smtp.SMTPAddressFailedException: 554 5.7.1 <liuzhifeng0214@sina.com>: Sender address rejected: Please see http://www.openspf.org/why.html?sender=liuzhifeng0214@sina.com&ip=221.220.150.173&receiver=sina.com

at com.sun.mail.smtp.SMTPTransport.rcptTo(SMTPTransport.java:1196)
at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:584)
at javax.mail.Transport.send0(Transport.java:169)
at javax.mail.Transport.send(Transport.java:98)
at com.servlet.SEND.doPost(SEND.java:58)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:228)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:216)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:634)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:445)
at java.lang.Thread.run(Thread.java:595)
Caused by: com.sun.mail.smtp.SMTPAddressFailedException: 554 5.7.1 <liuzhifeng0214@sina.com>: Sender address rejected: Please see http://www.openspf.org/why.html?sender=liuzhifeng0214@sina.com&ip=221.220.150.173&receiver=sina.com

at com.sun.mail.smtp.SMTPTransport.rcptTo(SMTPTransport.java:1094)
... 18 more
javax.mail.SendFailedException: Invalid Addresses;
nested exception is:
com.sun.mail.smtp.SMTPAddressFailedException: 554 5.7.1 <liuzhifeng@sina.com>: Sender address rejected: Please see http://www.openspf.org/why.html?sender=liuzhifeng@sina.com&ip=221.220.150.173&receiver=sina.com

at com.sun.mail.smtp.SMTPTransport.rcptTo(SMTPTransport.java:1196)
at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:584)
at javax.mail.Transport.send0(Transport.java:169)
at javax.mail.Transport.send(Transport.java:98)
at com.servlet.SEND.doPost(SEND.java:58)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:228)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:216)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:634)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:445)
at java.lang.Thread.run(Thread.java:595)
Caused by: com.sun.mail.smtp.SMTPAddressFailedException: 554 5.7.1 <liuzhifeng@sina.com>: Sender address rejected: Please see http://www.openspf.org/why.html?sender=liuzhifeng@sina.com&ip=221.220.150.173&receiver=sina.com

at com.sun.mail.smtp.SMTPTransport.rcptTo(SMTPTransport.java:1094)
... 18 more
Blue55 2008-02-22
  • 打赏
  • 举报
回复
当然是可以用多线程解决这个问题的。 我是想确定一下javamail api 没有这种忽略其中一个错误保证其他地址发送成功的方法。
另外javamail 没有用多线程处理这种一组邮件的发送。
感谢 老紫竹的鼎力协助 呵呵。
老紫竹 2008-02-22
  • 打赏
  • 举报
回复
你不会多线程吗??
Blue55 2008-02-22
  • 打赏
  • 举报
回复
msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(addressTo));
这个操作中的这个方法 InternetAddress.parse(addressTo) 就是把 String 邮件目标地址 转换成
InternetAddress[] 数组的。

Blue55 2008-02-22
  • 打赏
  • 举报
回复
这样也考虑过 只是效率会比较低下
如果目标邮件地址数量多了的话就不好处理了 可能不能打到应用要求。
就想知道能不能用javamail的API整体提交给Mail Server 能够像Out Look的效果呢?
老紫竹 2008-02-22
  • 打赏
  • 举报
回复
一个一个的发,异常catch在里面。
Johnson_Hong 2008-02-22
  • 打赏
  • 举报
回复
可以自己实现一个方法,输入邮件的字符串,然后通过分隔符将它们放到数组,循环数组对邮件逐一进行发送,捕捉到异常的返回失败信息
熟悉项目开发过程中SSM框架、JSP、Mysql使用,知道各技术之间的如何衔接; 该课程主要涉及到的技术有:  项目涉及的技术:  1、前端:jsp、css、javascript、jQuery(js框架)、bootstrap框架 2、后台:Spring MVC、Spring、Mybatis框架、javaMail进行邮件发送、jstl 、jstl自定义分页标签、代码生成器等 3、数据库:Mysql 4、服务器:Tomcat项目开发涉及的功能: 1、项目以及数据库搭建2、用户登录、退出3、用户注册、邮件发送4、首页商品信息页面搭建以及查询功能实现5、商品明细查看,商品修改,商品下架7、商品类型管理8、订单管理9、代码机器人使用等等其他实战项目:java项目实战之电商系统全套(前台和后台)(java毕业设计ssm框架项目)https://edu.csdn.net/course/detail/25771 java项目之oa办公管理系统(java毕业设计)https://edu.csdn.net/course/detail/23008 java项目之hrm人事管理项目(java毕业设计)https://edu.csdn.net/course/detail/23007 JavaWeb项目实战之点餐系统前台https://edu.csdn.net/course/detail/20543 JavaWeb项目实战之点餐系统后台https://edu.csdn.net/course/detail/19572 JavaWeb项目实战之宿舍管理系统(Java毕业设计含源码)https://edu.csdn.net/course/detail/26721 JavaWeb项目实战之点餐系统全套(前台和后台)https://edu.csdn.net/course/detail/20610 java项目实战之电子商城后台(java毕业设计SSM框架项目)https://edu.csdn.net/course/detail/25770 java美妆商城项目|在线购书系统(java毕业设计项目ssm版)https://edu.csdn.net/course/detail/23989 系统学习课程:JavaSE基础全套视频(环境搭建 面向对象 正则表达式 IO流 多线程 网络编程 java10https://edu.csdn.net/course/detail/26941 Java Web从入门到电商项目实战挑战万元高薪(javaweb教程)https://edu.csdn.net/course/detail/25976其他素材版(毕业设计或课程设计)项目:点击老师头像进行相关课程学习

67,515

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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