日期:2014-05-20  浏览次数:20598 次

关于Javamail中接收方用户认证的问题
邮件服务为James

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

------解决方案--------------------
这要外部的邮件服务器提供接口才行,基于安全问题,一般的服务器都不提供的,不然不就可以随意发垃圾邮件了?
自己的邮件服务器就可以在发送前判断下了
------解决方案--------------------
验证收件人地址这个需求,我们也仅仅是用正则表达式验证下是否符合规范罢了,至于是否存在恐怕是没办法
------解决方案--------------------
http://blog.csdn.net/CrazyGou/archive/2007/06/13/1649828.aspx
http://blog.csdn.net/CrazyGou/archive/2007/06/13/1649834.aspx
------解决方案--------------------
回复人: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:test@xxx.com ");
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异常判断发送失败原因
------解决方案--------------------
关注一下