代码如下:
request.setCharacterEncoding("GB2312");
    MultipartRequest multi=new MultipartRequest(request,".",5*1024*1024,"GB2312"); //使用cos 组件
    String from=multi.getParameter("from");
    String to=multi.getParameter("to");
    String subject=multi.getParameter("subject");
    String content=multi.getParameter("content"); //附件
    String fileName=multi.getFilesystemName("attachment"); //取得系统文件名
    try
    {
     Properties pro=System.getProperties();
     pro.put("mail.host","smtp.163.com");
     pro.put("mail.smtp.auth","true");
     Session sess=Session.getInstance(pro,new Authenticator()
     {
      public PasswordAuthentication getPasswordAuthentication()
      {
       return new PasswordAuthentication("用户名","密码");
      }
     });
     Message message=new MimeMessage(sess);
     message.setFrom(new InternetAddress(from));
     message.setRecipient(Message.RecipientType.TO,new InternetAddress(to));
     message.setSubject(subject);
        if(fileName!=null)   //判断文件是否存在
     {
      File fil=new File(fileName); //创建File对象
      MimeBodyPart mbp1=new MimeBodyPart();   //mbp1代表mime类型(这里为邮件内容)的对象
      mbp1.setContent(content,"text/plain;charset=gb2312"); //将邮件内容加到mbp1对象      MimeBodyPart mbp2=new MimeBodyPart(); //mbp2代表mime类型(这里为邮件附件)的对象
      FileDataSource fds=new FileDataSource(fil); //创建文件数据源对象(JAF)
      mbp2.setDataHandler(new DataHandler(fds));//设置数据处理类
      mbp2.setFileName(MimeUtility.encodeText(fds.getName(),"gb2312","B"));
      Multipart mp=new MimeMultipart(); //相当于容器,容纳BodyPart对象
      mp.addBodyPart(mbp1); 
      mp.addBodyPart(mbp2); //将mbp1和mbp2对象加入容器中
      message.setContent(mp); //设置邮件消息的内容
     }
     else
     {
       message.setContent(content,"text/plain;charset=gb2312");//如果没有附件,直接处理
     }
     Transport trans=sess.getTransport("smtp");
     trans.send(message);
     out.println("it is successful!");    }
    catch(MessagingException e)
    {
     out.println(e.toString());
    }
邮件服务器为server2003 outlook下可以给内外网发邮件,也可以接收邮件,此程序可以给内网发邮件,如果给163或者qq发邮件时会出现Invalid Addresses; nested exception is: class javax.mail.SendFailedException: 550 5.7.1 Unable to relay for [email protected] 这种错误,我不知道是程序出问题了,还是邮件服务器的配置有问题,希望大家能够帮忙解决一下,非常感谢!

解决方案 »

  1.   

    参考
    http://forums.sun.com/thread.jspa?threadID=5321251
      

  2.   

    Invalid Addresses; nested exception is: class javax.mail.SendFailedException: 550 5.7.1 Unable to relay for [email protected] 
    由于被反域名解析验证 验证出你所发的邮件域名解析错误,也就是没你那个域名登记,去用花生壳弄个域名再试试,或者找个安全系数低点的邮箱去发
      

  3.   

    不好意思,没看到你用的163服务器,那么就是你163服务器没有设置SMTP服务,所以不允许你发送,你先登录163,然后点设置,把SMTP服务给启动了,就应该可以了
      

  4.   

    pro.put("mail.host","smtp.163.com");你使用了smtp.163.com,那么你的from地址必须是@163.com结尾的。否则163会拒绝的。
      

  5.   

    内网就是我的server2003邮件服务器上的用户,外网就是如163或者qq上的用户
      

  6.   

    不好意思,我重新补充一下,我们的server2003邮件服务器在电信托管,用outlook配置的客户端给server2003邮件服务器上的用户发邮件或者接收邮件都没问题,给163或者qq发和收也没问题,就是利用javamail程序,给163或者qq之类的邮箱发就出现Invalid Addresses; nested exception is: class javax.mail.SendFailedException: 550 5.7.1 Unable to relay for [email protected]这种错误,我也把发邮件的用户在163或QQ中设置了白名单,不知道是程序出问题了还是配置邮件服务器出问题?
      

  7.   

    不好意思,上面的我是用163做测试,163都好用,而我们的server2003邮件服务器给163或者qq发邮件就会出现上面的问题,用javamail收邮件没有问题,是不是邮件服务器配置有问题呀!
      

  8.   

    请问下,那你用server2003邮件服务器配置的邮件名是什么?这样的话,或者是反域名解析没通过了,前段时间我也是因为这个反域名解析问题搞了一个星期,如果你使用的域名是网上没注册的(就是你本机虚拟出来)也会出现那样的现象,建议可以试试拿花生壳申请个免费域名试试。没用过server2003来配置邮件服务器,我之前用的james配置的,就是域名出了问题。
      

  9.   

    我就说说我用james做服务器想与外网交互成功的配置吧,看看能不能对你有所帮助;
    第一:服务器域名必须能通过反域名解析(就是说这个域名是实实在在存在的,而且你的服务器也是放到这个域名指向的IP的计算机上,关于这个再次建议可以在网关把25,110端口指向你的机子,然后你的机子下个花生壳,再用花生壳申请个免费域名,运行就OK了)
    第二:james的配置里面有个DNS server配置的,就是配置 服务器域名 和 外网IP地址(不知道你那个有没有啦)
    其实我还是觉得是你服务器域名的问题......请问下,你的服务器域名是什么?就是
    pro.put("mail.host","smtp.163.com"); 这句,你把“smtp.163.com"换成了哪个?
      

  10.   

    额.....之前睡着了- -现在才看清楚你说的,你这个问题有点复杂,就是说用outlook收发163的没问题,用你自己那个程序来收发163的就出问题这样吧.....这个之前还真没遇到过.....想想,想想,可能是身份验证问题,但我记得以前我身份验证的时候报的错是什么SSL什么什么的.....
      

  11.   

    不是这个问题。因为你的from邮件地址应该是设置为[email protected]是不允许接收这样的信件,它要求from地址必须是@163.com
    否则它不是白白帮你转发邮件!大部分的SMTP服务器都是禁止这样的邮件的所以如果你的from地址是@qq.com,则你应该由smtp.qq.com发送,又或者你修改from为[email protected]更深入一点,作为一套邮件服务器实际是分开两部分的
    一台是SMTP功能,允许接收from地址是属于自己域名的邮件,并按该邮件的目的地址列表发送到其它MX邮件服务器一台是MX(实际上协议也是SMTP,不过地址不是smtp.163.com,而是nslookup中type=MX的163.com的地址),这台服务器只允许接收目的地址中包含自己域名的邮件
    上面MX一般我们不会直接使用到,所以你可以不理会。
      

  12.   

    应该说的不是这个吧,他说outlook可以正常收发哦,如果按照你说的,那当然是不能发啦,那163的服务器发QQ的邮件,而且别人也说了,用163服务器测试的时候可以收发....
    整理下问题:
    第一:是否用163服务器+你那个代码可以正常收发
    第二:你换回你自己服务器的时候,from地址有改回过来吗?就是说,你的邮件服务器域名要是xx.com那么你form也应该写成 [email protected]这样哦·
    第三:你的邮件服务器用outlook测试也是能正常收发?
      

  13.   

    lz的错误异常一直说是Unable to relay for [email protected] 吧,那么应该就是from地址不正确造成的
      

  14.   

    我现在把debug信息贴出来,大伙看看:
    DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]
    DEBUG SMTP: useEhlo true, useAuth trueDEBUG: SMTPTransport trying to connect to host "mail.huahonghitech.com", port 25DEBUG SMTP RCVD: 220 huahonghitech.com Microsoft ESMTP MAIL Service, Version: 6.0.3790.3959 ready at  Tue, 26 Jan 2010 13:22:32 +0800 DEBUG: SMTPTransport connected to host "mail.huahonghitech.com", port: 25DEBUG SMTP SENT: EHLO sy
    DEBUG SMTP RCVD: 250-huahonghitech.com Hello [119.118.238.199]
    250-AUTH GSSAPI NTLM
    250-TURN
    250-SIZE 2097152
    250-ETRN
    250-PIPELINING
    250-DSN
    250-ENHANCEDSTATUSCODES
    250-8bitmime
    250-BINARYMIME
    250-CHUNKING
    250-VRFY
    250 OKDEBUG SMTP Found extension "AUTH", arg "GSSAPI NTLM"
    DEBUG SMTP Found extension "TURN", arg ""
    DEBUG SMTP Found extension "SIZE", arg "2097152"
    DEBUG SMTP Found extension "ETRN", arg ""
    DEBUG SMTP Found extension "PIPELINING", arg ""
    DEBUG SMTP Found extension "DSN", arg ""
    DEBUG SMTP Found extension "ENHANCEDSTATUSCODES", arg ""
    DEBUG SMTP Found extension "8bitmime", arg ""
    DEBUG SMTP Found extension "BINARYMIME", arg ""
    DEBUG SMTP Found extension "CHUNKING", arg ""
    DEBUG SMTP Found extension "VRFY", arg ""
    DEBUG SMTP Found extension "OK", arg ""
    DEBUG SMTP: Attempt to authenticate
    DEBUG SMTP: use8bit false
    DEBUG SMTP SENT: MAIL FROM:<[email protected]>
    DEBUG SMTP RCVD: 250 2.1.0 [email protected] OKDEBUG SMTP SENT: RCPT TO:<[email protected]>
    DEBUG SMTP RCVD: 550 5.7.1 Unable to relay for [email protected] Addresses
      [email protected]
    DEBUG SMTPTransport: Sending failed because of invalid destination addresses
    DEBUG SMTP SENT: RSET
    DEBUG SMTP RCVD: 250 2.0.0 Resetting
      

  15.   

    同学,其实15楼已经说的很清楚了,你用的服务器是mail.huahonghitech.com,但是你要的邮件地址却是[email protected]
    你见过在www.qq.com里面申请的免费邮件是不用[email protected]这样的形式的吗?
    同样道理,你既然用mail.huahonghitech.com作为你的邮件服务器地址,那么你的邮件地址也应该是[email protected]这样的形式;也就是说你把from改成[email protected]这样来试试
      

  16.   

    你的理解很正确,我换回自己服务器时,把所有需要改的地方都改过来了,我也在域名管理的地方添加Mx记录了,可还是不能给163或者qq发邮件,下面的是发邮件时debug信息:
    DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc] 
    DEBUG SMTP: useEhlo true, useAuth true DEBUG: SMTPTransport trying to connect to host "mail.huahonghitech.com", port 25 DEBUG SMTP RCVD: 220 huahonghitech.com Microsoft ESMTP MAIL Service, Version: 6.0.3790.3959 ready at  Tue, 26 Jan 2010 13:22:32 +0800 DEBUG: SMTPTransport connected to host "mail.huahonghitech.com", port: 25 DEBUG SMTP SENT: EHLO sy 
    DEBUG SMTP RCVD: 250-huahonghitech.com Hello [119.118.238.199] 
    250-AUTH GSSAPI NTLM 
    250-TURN 
    250-SIZE 2097152 
    250-ETRN 
    250-PIPELINING 
    250-DSN 
    250-ENHANCEDSTATUSCODES 
    250-8bitmime 
    250-BINARYMIME 
    250-CHUNKING 
    250-VRFY 
    250 OK DEBUG SMTP Found extension "AUTH", arg "GSSAPI NTLM" 
    DEBUG SMTP Found extension "TURN", arg "" 
    DEBUG SMTP Found extension "SIZE", arg "2097152" 
    DEBUG SMTP Found extension "ETRN", arg "" 
    DEBUG SMTP Found extension "PIPELINING", arg "" 
    DEBUG SMTP Found extension "DSN", arg "" 
    DEBUG SMTP Found extension "ENHANCEDSTATUSCODES", arg "" 
    DEBUG SMTP Found extension "8bitmime", arg "" 
    DEBUG SMTP Found extension "BINARYMIME", arg "" 
    DEBUG SMTP Found extension "CHUNKING", arg "" 
    DEBUG SMTP Found extension "VRFY", arg "" 
    DEBUG SMTP Found extension "OK", arg "" 
    DEBUG SMTP: Attempt to authenticate 
    DEBUG SMTP: use8bit false 
    DEBUG SMTP SENT: MAIL FROM: <[email protected]
    DEBUG SMTP RCVD: 250 2.1.0 [email protected] OK DEBUG SMTP SENT: RCPT TO: <[email protected]
    DEBUG SMTP RCVD: 550 5.7.1 Unable to relay for [email protected] Invalid Addresses 
      [email protected] 
    DEBUG SMTPTransport: Sending failed because of invalid destination addresses 
    DEBUG SMTP SENT: RSET 
    DEBUG SMTP RCVD: 250 2.0.0 Resetting
      

  17.   

    把from 上的地址改为[email protected]
    ......而不是[email protected]
    因为你的smtp服务器写的地址是mail.huahonghitech.com
      

  18.   

    或者是把你的host那里的mail.huahonghitech.com 
    改成huahonghitech.com ......
      

  19.   

    我和你的情况一样:
    props.put("mail.smtp.host", "xxx.oicp.net");
    props.put("mail.auth.user", "user_name");
    props.put("mail.auth.passwd", "password");
    props.put("mail.smtp.localhost", "xxx.oicp.net");
    我用的是花生壳+winmailDEBUG: setDebug: JavaMail version 1.3.3
    DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]
    DEBUG SMTP: useEhlo true, useAuth true
    DEBUG SMTP: useEhlo true, useAuth true
    DEBUG SMTP: trying to connect to host "192.168.0.101", port 25, isSSL false
    220 ESMTP on WinWebMail [3.7.7.3] ready.  http://www.winwebmail.com
    DEBUG SMTP: connected to host "192.168.0.101", port: 25EHLO xxx.oicp.net
    250-SIZE
    250 AUTH LOGIN
    DEBUG SMTP: Found extension "AUTH", arg "LOGIN"
    DEBUG SMTP: Attempt to authenticate
    AUTH LOGIN
    334 VXNlcm5hbWU6
    bWFya2V0aW5n
    334 UGFzc3dvcmQ6
    enhjMTIz
    235 Authentication successful.
    DEBUG SMTP: use8bit false
    MAIL FROM:<[email protected]>
    250 OK
    RCPT TO:<[email protected]>
    250 OK, recipient accepted
    RCPT TO:<>
    504 input error.
    RCPT TO:<>
    504 input error.
    DEBUG SMTP: Valid Unsent Addresses
    DEBUG SMTP:   marshall <[email protected]>
    DEBUG SMTP: Invalid Addresses
    DEBUG SMTP:   
    DEBUG SMTP:   
    DEBUG SMTP: Sending failed because of invalid destination addresses
    RSET
    220 OK
    QUIT
    javax.mail.SendFailedException: Invalid Addresses;
      nested exception is:
    class com.sun.mail.smtp.SMTPAddressFailedException: 504 input error.
    ;
      nested exception is:
    class com.sun.mail.smtp.SMTPAddressFailedException: 504 input error. at com.sun.mail.smtp.SMTPTransport.rcptTo(SMTPTransport.java:1141)
    at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:536)
    at javax.mail.Transport.send0(Transport.java:151)
    at javax.mail.Transport.send(Transport.java:80)
    at com.transys.app.email.ZMail.sendHtmlMail(ZMail.java:1168)
    at com.transys.app.email.EmailMarketing.epSendMail(EmailMarketing.java:318)
    at com.transys.app.email.EmailMarketing.epEmailMarketing(EmailMarketing.java:227)
    at com.transys.app.email.EmailMarketing.main(EmailMarketing.java:66)
    javax.mail.SendFailedException: Invalid Addresses;
      nested exception is:
    class com.sun.mail.smtp.SMTPAddressFailedException: 504 input error.
    ;
      nested exception is:
    class com.sun.mail.smtp.SMTPAddressFailedException: 504 input error. at com.sun.mail.smtp.SMTPTransport.rcptTo(SMTPTransport.java:1141)
    at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:536)
    at javax.mail.Transport.send0(Transport.java:151)
    at javax.mail.Transport.send(Transport.java:80)
    at com.transys.app.email.ZMail.sendHtmlMail(ZMail.java:1168)
    at com.transys.app.email.EmailMarketing.epSendMail(EmailMarketing.java:318)
    at com.transys.app.email.EmailMarketing.epEmailMarketing(EmailMarketing.java:227)
    at com.transys.app.email.EmailMarketing.main(EmailMarketing.java:66) 请高手指点,为什么系统提示目的地址会有错误?