邮件服务为James用javamail连接James邮件服务器给一个外部的邮件,比如说163,gmail等邮件服务器发送一封邮件,如果收件人根本就没在163,gmail上注册过,那么javamail处理邮件时候如何处理?也就是说,程序中有没有可能在发送邮件的过程中就知道了收件人地址错误??

解决方案 »

  1.   

    楼上的兄弟可以说的仔细些吗我用javamail连接的是我自己的服务器,也就是开源的james邮件服务器,接收方是外部的,比如说gmail.我就是想知道怎么实现在发送邮件时就做判断。看SMTP协议上是有讲到:两个邮件服务器通讯时,如果接收方的地址不在对方服务中会返回553,但用javamail来发送邮件时没有这样的返回消息.
      

  2.   

    再说,发送失败会抛出SendFailedException,通过SendFailedException的三个方法可以查询具体信息 Address[]  getInvalidAddresses()
              Return the addresses to which this message could not be sent.
     Address[]  getValidSentAddresses()
              Return the addresses to which this message was sent succesfully.
     Address[]  getValidUnsentAddresses()
              Return the addresses that are valid but to which this message was not sent.
      

  3.   

    我不需要他们提供明确的接口呀SMTP协议中提到了交互的问题:
    VRFY 
    EXPN以上两个命令就是检查接收方邮箱是否合法的方法,是不是说外部的邮件出于安全的考滤会屏敝此判断??
      

  4.   

    我明白了,用javamail貌似是没办法直接交互的,用socket来做是可以的
    Socket socket=new Socket("smtp.xxx.com",25);
    BufferedWriter out=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
    out.write("RCPT TO:[email protected]");
    out.flush();
    BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
    String line=in.readLine();
    int result=Integer.parseInt(line);
    if(result!=250)
       System.out.println("收件人地址有错误");
      

  5.   

    实现邮件的发送一般都是用的javamail,socket与javamail有何区别??
      

  6.   

    不是区别的问题,实现邮件接收发送我也是用javamail,我想了下你的需求,似乎也只有通过socket与邮件服务器进行交互来实现,也许javamail有与smtp进行交互的方法,我不大清楚了
      

  7.   

    我的需求是这样的,我有个程序会通过自已的James邮件服务器给外部的邮件服务器发送邮件
    并且我要及时知道邮件的投递情况:
    如果收件人正常收到了发送的邮件,我需要给发件人一个状态信息,告诉他,邮件已经成功发送给对方了。如果接收人的邮件地址是错误的,那我要及时给发件人一个状态消息,告诉他,由于邮件的地址错误,所以无法邮件投递失败。但用javamail来发送邮件时,无法及时的知道james邮件服务器与外部邮箱的一个交互过程,导致没有办法及时的监控邮件的状态。James邮件服务是我们自己配置的,如果收件人是内部的邮件地址,很好处理,但如果是外部的地址就没办法处理了,不知道这种情况是不是可以用socket来处理
      

  8.   

    Javamail貌似是没办法处理你所要求的对外部地址的验证的,我们现在的这个系统也根本没有去验证外部地址,也只是在发送失败抛出异常的时候告诉用户,可以在捕捉MessagingException前捕捉异常SendFailedException,然后判断哪些发送成功,哪些发送失败。
      

  9.   

    与smtp交互,我猜测采用socket是可以的,不过这样额外的开销是否值的应该权衡下。
      

  10.   

    再说一般服务器的VRFY都是禁掉的,我认为没有多大意义。
      

  11.   

    http://blog.csdn.net/CrazyGou/archive/2007/06/13/1649828.aspx
    http://blog.csdn.net/CrazyGou/archive/2007/06/13/1649834.aspx
      

  12.   

    要判断邮箱是否有效的话 可以发一封html格式的邮件 邮件里有个连接 传个值到服务器端的某个程序 如果得到的结果和服务器端保持的结果一样的话就说明有效
      

  13.   

    回复人:killme2008(为了生态平衡,请保护蛤蟆) ( 一星(中级)) 信誉:96  2007-6-12 15:25:28  得分:0
    ?  我明白了,用javamail貌似是没办法直接交互的,用socket来做是可以的
    Socket socket=new Socket("smtp.xxx.com",25);
    BufferedWriter out=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
    out.write("RCPT TO:[email protected]");
    out.flush();
    BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream()));
    String line=in.readLine();
    int result=Integer.parseInt(line);
    if(result!=250)
    System.out.println("收件人地址有错误");
    ---------------------------------------------------------
    这样做是不行的
    必须获取主机的MX(Mail Exchange)记录,然后与其邮件交换服务器交互,而不是smtp.xxx.com。
    再就是命令必须按照次序写入,先HELO再MAIL FROM再RCPT TO,否则服务器可能拒绝。还有,RCPT TO后返回的一般不会仅是一个数字,可能如250-ok,不能parseInt按照我提供的方法(http://blog.csdn.net/CrazyGou/archive/2007/06/13/1649834.aspx)验证是有效率&资源问题,但也只能这么做。是否必要不是绝对的,需要自己权衡
    如果只是偶尔有发送邮件的需求,可以不用James做邮件服务器,用JavaMail直接发信(http://blog.csdn.net/CrazyGou/archive/2007/06/13/1649828.aspx),send方法返回false表示发送失败。可根据JavaMail异常判断发送失败原因
      

  14.   

    要判断邮箱是否有效的话 可以发一封html格式的邮件 邮件里有个连接 传个值到服务器端的某个程序 如果得到的结果和服务器端保持的结果一样的话就说明有效
    ----------------------------------------------------------
    请问可否说详细点??