通过javamail实现发送邮件的程序。通过下面的方法添加目标邮件地址:
String addressTo = [email protected];[email protected];[email protected];[email protected]
Message msg = new MimeMessage(session);
if(addressTo!=null&&!addressTo.equals(""))
{
msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(addressTo));
}
通过下面的方法最终发送邮件。
Transport.send(msg);如果目标邮件地址中有一些不被邮件服务器认可的邮件地址如上面的 [email protected]
"String addressTo = [email protected];[email protected];[email protected];[email protected]"
会导致邮件整体发送失败,也不会向其他正确的邮件地址发送邮件。会报以下exception:
javax.mail.SendFailedException: Invalid Addresses com.sun.mail.smtp.SMTPAddressFailedException: 550 5.7.1 Unable to relay for [email protected]但是把这样的邮件目标列表复制到Out Look中向相同的邮件服务器发送测试如下
[email protected];[email protected];[email protected];[email protected]
除了[email protected]以外都是正确合法的邮件地址。
得到的结果是正确的地址都能收到邮件,不存在的地址会被邮件服务器返回一封不能送达邮件的提醒信息。请教javamail是不是有其他实现方式或者发送方法能够避免这种整体发送失败的情况出现,得到像Out Look中的测试结果呢?
是不是方法调用Transport.send(msg);的不正确?
备注:如果目标邮件地址都是正确存在的邮件地址可以发送成功String addressTo = [email protected];[email protected];[email protected];[email protected]希望有经验的朋友给点提示 谢谢。
String addressTo = [email protected];[email protected];[email protected];[email protected]
Message msg = new MimeMessage(session);
if(addressTo!=null&&!addressTo.equals(""))
{
msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(addressTo));
}
通过下面的方法最终发送邮件。
Transport.send(msg);如果目标邮件地址中有一些不被邮件服务器认可的邮件地址如上面的 [email protected]
"String addressTo = [email protected];[email protected];[email protected];[email protected]"
会导致邮件整体发送失败,也不会向其他正确的邮件地址发送邮件。会报以下exception:
javax.mail.SendFailedException: Invalid Addresses com.sun.mail.smtp.SMTPAddressFailedException: 550 5.7.1 Unable to relay for [email protected]但是把这样的邮件目标列表复制到Out Look中向相同的邮件服务器发送测试如下
[email protected];[email protected];[email protected];[email protected]
除了[email protected]以外都是正确合法的邮件地址。
得到的结果是正确的地址都能收到邮件,不存在的地址会被邮件服务器返回一封不能送达邮件的提醒信息。请教javamail是不是有其他实现方式或者发送方法能够避免这种整体发送失败的情况出现,得到像Out Look中的测试结果呢?
是不是方法调用Transport.send(msg);的不正确?
备注:如果目标邮件地址都是正确存在的邮件地址可以发送成功String addressTo = [email protected];[email protected];[email protected];[email protected]希望有经验的朋友给点提示 谢谢。
解决方案 »
- ejb和hadoop区别
- JAVA 水晶报表 服务器
- 关于SPRING注入的bean等于null的问题,高手帮忙了
- Java 字符编码问题
- struts中标签库位置问题
- userStr=userStr==null?"":userStr.trim()这句java代码什意思
- 直接从控制台启动weblogic后配置成功的数据库连接池,在由jbuilder启动的weblogic下就变成UNAVAILABLE了?
- 谁知道有struts的好书吗,电子版也行
- 如何实例化参数calss 得到属性get set 方法?
- JButton的监听 怎么让点击一个JButton弹出一个新的窗体
- struts 1.3.8 api 帮助文档 chm格式 下载
- 初学ibatis的问题:Document root element "sqlMap", must match DOCTYPE root "sqlMapConfig"
如果目标邮件地址数量多了的话就不好处理了 可能不能打到应用要求。
就想知道能不能用javamail的API整体提交给Mail Server 能够像Out Look的效果呢?
这个操作中的这个方法 InternetAddress.parse(addressTo) 就是把 String 邮件目标地址 转换成
InternetAddress[] 数组的。
另外javamail 没有用多线程处理这种一组邮件的发送。
感谢 老紫竹的鼎力协助 呵呵。
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 <[email protected]>: Sender address rejected: Please see http://www.openspf.org/[email protected]&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 <[email protected]>: Sender address rejected: Please see http://www.openspf.org/[email protected]&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 <[email protected]>: Sender address rejected: Please see http://www.openspf.org/[email protected]&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 <[email protected]>: Sender address rejected: Please see http://www.openspf.org/[email protected]&ip=221.220.150.173&receiver=sina.com at com.sun.mail.smtp.SMTPTransport.rcptTo(SMTPTransport.java:1094)
... 18 more
props = System.getProperties();
if (need) {
props.put("mail.smtp.auth", "true");
} else {
props.put("mail.smtp.auth", "false");
}
// smtp是否需要认证
设置为不需要验证试一下
没办法,问题还是要解决,于是打开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();
}
}