判断邮件地址是否是真实地址

import java.io.*;
import java.net.*;
import java.util.*;
import javax.naming.*;
import javax.naming.directory.*;

public class SMTPMXLookup {
   private static int hear( BufferedReader in ) throws IOException {
     String line = null;
     int res = 0;

     while ( (line = in.readLine()) != null ) {
         String pfx = line.substring( 0, 3 );
         try {
            res = Integer.parseInt( pfx );
         }
         catch (Exception ex) {
            res = -1;
         }
         if ( line.charAt( 3 ) != ‘-‘ ) break;
     }

     return res;
     }

   private static void say( BufferedWriter wr, String text )
      throws IOException {
     wr.write( text + "\r\n" );
     wr.flush();

     return;
     }
     private static ArrayList getMX( String hostName )
         throws NamingException {
     // Perform a DNS lookup for MX records in the domain
     Hashtable env = new Hashtable();
     env.put("java.naming.factory.initial",
             "com.sun.jndi.dns.DnsContextFactory");
     DirContext ictx = new InitialDirContext( env );
     Attributes attrs = ictx.getAttributes
                           ( hostName, new String[] { "MX" });
     Attribute attr = attrs.get( "MX" );

     // if we don‘t have an MX record, try the machine itself
     if (( attr == null ) || ( attr.size() == 0 )) {
       attrs = ictx.getAttributes( hostName, new String[] { "A" });
       attr = attrs.get( "A" );
       if( attr == null )
            throw new NamingException
                     ( "No match for name ‘" + hostName + "‘" );
     }
         // Huzzah! we have machines to try. Return them as an array list
     // NOTE: We SHOULD take the preference into account to be absolutely
     //   correct. This is left as an exercise for anyone who cares.
     ArrayList res = new ArrayList();
     NamingEnumeration en = attr.getAll();

     while ( en.hasMore() ) {
        String mailhost;
        String x = (String) en.next();
        String f[] = x.split( " " );
        //  THE fix *************
        if (f.length == 1)
            mailhost = f[0];
        else if ( f[1].endsWith( "." ) )
            mailhost = f[1].substring( 0, (f[1].length() - 1));
        else
            mailhost = f[1];
        //  THE fix *************
        res.add( mailhost );
     }
     return res;
     }

   public static boolean isAddressValid( String address ) {
     // Find the separator for the domain name
     int pos = address.indexOf( ‘@‘ );

     // If the address does not contain an ‘@‘, it‘s not valid
     if ( pos == -1 ) return false;

     // Isolate the domain/machine name and get a list of mail exchangers
     String domain = address.substring( ++pos );
     ArrayList mxList = null;
     try {
        mxList = getMX( domain );
     }
     catch (NamingException ex) {
        return false;
     }

     // Just because we can send mail to the domain, doesn‘t mean that the
     // address is valid, but if we can‘t, it‘s a sure sign that it isn‘t
     if ( mxList.size() == 0 ) return false;

     // Now, do the SMTP validation, try each mail exchanger until we get
     // a positive acceptance. It *MAY* be possible for one MX to allow
     // a message [store and forwarder for example] and another [like
     // the actual mail server] to reject it. This is why we REALLY ought
     // to take the preference into account.
     for ( int mx = 0 ; mx < mxList.size() ; mx++ ) {
         boolean valid = false;
         try {
             int res;
             //
             Socket skt = new Socket( (String) mxList.get( mx ), 25 );
             BufferedReader rdr = new BufferedReader
                ( new InputStreamReader( skt.getInputStream() ) );
             BufferedWriter wtr = new BufferedWriter
                ( new OutputStreamWriter( skt.getOutputStream() ) );

             res = hear( rdr );
             if ( res != 220 ) throw new Exception( "Invalid header" );
             say( wtr, "EHLO rgagnon.com" );

             res = hear( rdr );
             if ( res != 250 ) throw new Exception( "Not ESMTP" );

             // validate the sender address
             say( wtr, "MAIL FROM: <[email protected]>" );
             res = hear( rdr );
             if ( res != 250 ) throw new Exception( "Sender rejected" );

             say( wtr, "RCPT TO: <" + address + ">" );
             res = hear( rdr );

             // be polite
             say( wtr, "RSET" ); hear( rdr );
             say( wtr, "QUIT" ); hear( rdr );
             if ( res != 250 )
                throw new Exception( "Address is not valid!" );

             valid = true;
             rdr.close();
             wtr.close();
             skt.close();
         }
         catch (Exception ex) {
           // Do nothing but try next host
           ex.printStackTrace();
         }
         finally {
           if ( valid ) return true;
         }
     }
     return false;
     }

   public static void main( String args[] ) {
     String testData[] = {
         "[email protected]",
         "[email protected]",
         "[email protected]", // Invalid domain name
         "[email protected]", // Invalid address
         "[email protected]" // Failure of this method
         };

     for ( int ctr = 0 ; ctr < testData.length ; ctr++ ) {
        System.out.println( testData[ ctr ] + " is valid? " +
              isAddressValid( testData[ ctr ] ) );
     }
     return;
     }
} 
时间: 2024-10-07 07:36:53

判断邮件地址是否是真实地址的相关文章

vc 获取函数名称真实地址

首先写一个很简单的main函数: int main(){ printf("main的地址(?):%08x",main); } 单步调试,可得知 main函数的真实入口地址是:00be91a0 然而我们控制台输出的值是 为什么会出现这样的差别呢?院子里有一篇大牛写的有关注入的文章:http://www.cnblogs.com/fanzhidongyzby/archive/2012/08/30/2664287.html,里面就提到了这个问题. 其中提到一个解析真实地址的算法: //将函数地

判断邮件地址是否存在的方法

公司邮箱目前使用的是Zimbra,该邮件服务器目前不甚稳定,经常出现重发.漏发问题.经测试,每100封邮件仅可成功发送98封左右,以下是测试数据: 测试用例1:100封,总用时约:16min:实收97封,失败3次,3次错误信息均为:javax.mail.MessagingException: Could not connect to SMTP host 测试用例2:100封,总用时约:16min:实收100封,失败2次,错误同上.加失败重发机制,失败后等待10s重发,最多重发3次: 测试用例3:

SMTP判断邮箱是否存在 检查email地址是否真实存在

SMTP判断邮箱是否存在,检查email地址是否真实存在 判断一个Email是否存在的类 作者:mlemos 来源:www.fastboard.org <? /* *  email_validation.php * * */ class  email_validation_class { //var  $email_regular_expression="^([a-z0-9_]  |//-  |//.)[email protected](([a-z0-9_]  |//-)+//.)+[a-

php 获取优酷视频的真实地址(2014.6月新算法)

上个礼拜发现优酷改版了,各种过滤优酷广告的插件都失效了,于是我百度了一下(谷歌也不能用了)发现优酷改算法了,在ckplayer论坛发现有人在6月25号发了个php 的优酷代理文件,下载下来发现,能用但只能获取mp4格式的视频地址,而且php还加密了,没办法查看源码,后来通过微盾解密发现其中的源码,结合以前自己写的一个优酷视频解析类.... 感谢    3shi大大 具体分析请见 3shi大大的文章  优酷视频真实地址解析  (当然现在不能用了,主要看分析) ps.  新算法是从别人那里解密出来的

抓腾讯视频真实地址总结

抓腾讯视频裸源总结 腾讯视频必然是国内最全面,最复杂的视频网站之一了,因此研究他的网页结构很有代表性. 首先,腾讯理所当然不会把视频资源暴露在网页源代码里,所以F12查看他的元素以获得重要信息你会无功而返. 所以,凄凉地研究一段时间后断然放弃... 有一个流传已久的经验, 大概是: 攻克一个网页,最好从移动端入手,至于为什么, 大概因为移动端源代码要稍简单一点, 或者说一些加密算法还不成熟. 所以,get一个小技能, 以为只有我知道, 搜寻了半天居然发现是多数浏览器都支持了n久的... 只是以前

ASA8.4的Inside区域同时访问DMZ公网地址和真实地址测试

一.测试拓扑 R1---Outside----ASA842----Inside-----R2 | DMZ | R3 二.测试思路 利用ASA的twice nat实现访问DMZ的公网地址时转向DMZ的真实地址. 三.基本配置 A.R1: interface FastEthernet0/0 ip address 202.100.1.1 255.255.255.0 no shut B.R2: interface FastEthernet0/0 ip address 10.1.1.1 255.255.2

U-Mail邮件群发如何过滤无效地址?

U-Mail邮件群发平台可以自动过滤掉无效和重复地址,过滤效果如下图 U-Mail邮件群发平台会将客户已经确认好是无效地址的加入无效地址库,下次再导入改无效地址就直接拒绝.邮件格式不正确的也会直接过滤掉.其他的就需要先查询邮件Mx记录,和投递邮件时服务器反馈的信息来判断. 实现原理图如下: 如需要使用U-Mail邮件群发平台请咨询我们的客服QQ:4008181568 U-Mail邮件群发如何过滤无效地址?

PHP转换IP地址到真实地址的方法详解

本篇文章是对PHP转换IP地址到真实地址的方法进行了详细的分析介绍,需要的朋友参考下 想要把IPv4地址转为真实的地址,肯定要参考IP数据库,商业的IP数据库存储在关系型数据库中,查询和使用都非常方便,但是成本不是个人和小公 司愿意承受的,所以简单应用的思路就是利用一些免费的IP数据库或者一些大网站提供的查询API,他们的数据量足够我们使用了.1. 利用纯真IP数据库利用本地的QQWry.Dat文件,优点是查询速度非常快,缺点是数据库文件要放在自己的空间内并且要偶尔更新数据库.时间关系废话不多说

优酷的视频真实地址(下载地址)

首先,我们需要这款名叫“点量视频解析嗅探组件”的软件,主要用于解析各大视频网站在线观看视频的真实地址,获得视频的源址. 目前,该软件可解析的视频网站包括: 乐视网.新浪视频.搜狐视频.风行网.PPTV.华数.PPS.CCTV中国网络电视.56网.酷6网.激动网.六间房.凤凰视频.网易视频.优米网.M1905电影网,以及youtube等等众多视频网站 今天,我们进以优酷网为例吧~ 假如你在优酷网上看到一个视频,在线播放的网址为:http://v.youku.com/v_show/id_XMjUxN