通过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]希望有经验的朋友给点提示 谢谢。

解决方案 »

  1.   

    一个一个的发,异常catch在里面。
      

  2.   

    这样也考虑过 只是效率会比较低下
    如果目标邮件地址数量多了的话就不好处理了 可能不能打到应用要求。
    就想知道能不能用javamail的API整体提交给Mail Server 能够像Out Look的效果呢?
      

  3.   

    msg.setRecipients(Message.RecipientType.TO,   InternetAddress.parse(addressTo)); 
    这个操作中的这个方法  InternetAddress.parse(addressTo) 就是把 String 邮件目标地址 转换成
    InternetAddress[] 数组的。
      

  4.   

    当然是可以用多线程解决这个问题的。 我是想确定一下javamail api 没有这种忽略其中一个错误保证其他地址发送成功的方法。
    另外javamail 没有用多线程处理这种一组邮件的发送。
    感谢 老紫竹的鼎力协助 呵呵。
      

  5.   

    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 <[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
      

  6.   

    你好,我看见你说的那个JAVAMAIL那个异常的错误,我这几天做也遇到了, 当要发送的地址不存在时就报错,而且同时密送的都发送失败。想问你解决了没有?我qq50513757,希望能联系我,谢谢
      

  7.   

    if (props == null)
    props = System.getProperties();
    if (need) {
    props.put("mail.smtp.auth", "true");
    } else {
    props.put("mail.smtp.auth", "false");
    }
    // smtp是否需要认证
    设置为不需要验证试一下
      

  8.   

    gchfghfghfg
      

  9.   

    今天遇到同样的问题,在网上寻找解决办法居然没找到.
    没办法,问题还是要解决,于是打开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();
    }