Exemplo n.º 1
0
        // If this returns null, it failed.
        public SplitEmailModel SplitEmail(string email = null)
        {
            if (String.IsNullOrEmpty(email))
            {
                return(null);
            }

            email = !String.IsNullOrEmpty(email) ? email.Trim() : null; // trim() not exist in old IE!
            string[] parts = new string[] { };
            parts = email.Split('@');

            if (parts.Length < 2)
            {
                return(null);
            }

            for (var i = 0; i < parts.Length; i++)
            {
                if (parts[i] == "")
                {
                    return(null);
                }
            }

            string username = parts.First();
            string domain   = parts.Last();

            string[] domainParts = domain.Split('.');
            string   sld         = "";
            string   tld         = "";

            if (domainParts.Length == 0)
            {
                // The address does not have a top-level domain
                return(null);
            }
            else if (domainParts.Length == 1)
            {
                // The address has only a top-level domain (valid under RFC)
                tld = domainParts[0];
            }
            else
            {
                // The address has a domain and a top-level domain
                sld = domainParts[0];
                for (var j = 1; j < domainParts.Length; j++)
                {
                    tld += domainParts[j] + '.';
                }
                tld = tld.Substring(0, tld.Length - 1);
            }

            SplitEmailModel result = new SplitEmailModel {
                TopLevelDomain = tld, SecondLevelDomain = sld, Username = username, Domain = domain, Address = String.Join("@", parts)
            };

            return(result);
        }
Exemplo n.º 2
0
        public SplitEmailModel Suggest(string email = null, string[] domains = null, string[] secondLevelDomains = null, string[] topLevelDomains = null, Func <string> distanceFunction = null)
        {
            email = email.ToLower();

            SplitEmailModel emailParts = SplitEmail(email);

            if (emailParts == null)
            {
                return(null);
            }

            if (secondLevelDomains != null && topLevelDomains != null)
            {
                // If the email is a valid 2nd-level + top-level, do not suggest anything.
                if (secondLevelDomains.Contains(emailParts.SecondLevelDomain) && topLevelDomains.Contains(emailParts.TopLevelDomain))
                {
                    return(null);
                }
            }

            string closestDomain = FindClosestDomain(emailParts.Domain, domains, DomainThreshold);

            if (!String.IsNullOrEmpty(closestDomain))
            {
                if (closestDomain == emailParts.Domain)
                {
                    // The email address exactly matches one of the supplied domains; do not return a suggestion.
                    return(null);
                }
                else
                {
                    // The email address closely matches one of the supplied domains; return a suggestion
                    SplitEmailModel result = new SplitEmailModel {
                        Username = emailParts.Username, Domain = closestDomain, Address = emailParts.Username + "@" + closestDomain
                    };

                    return(result);
                }
            }

            // The email address does not closely match one of the supplied domains
            var closestSecondLevelDomain = FindClosestDomain(emailParts.SecondLevelDomain, secondLevelDomains, SecondLevelThreshold);
            var closestTopLevelDomain    = FindClosestDomain(emailParts.TopLevelDomain, topLevelDomains, TopLevelThreshold);

            if (!String.IsNullOrEmpty(emailParts.Domain))
            {
                closestDomain = emailParts.Domain;
                var rtrn = false;

                if (!String.IsNullOrEmpty(closestSecondLevelDomain) && closestSecondLevelDomain != emailParts.SecondLevelDomain)
                {
                    // The email address may have a mispelled second-level domain; return a suggestion
                    closestDomain = closestDomain.Replace(emailParts.SecondLevelDomain, closestSecondLevelDomain);
                    //closestDomain = closestDomain.Replace(new RegExp(emailParts.topLevelDomain + "$"), closestTopLevelDomain);
                    rtrn = true;
                }

                if (!String.IsNullOrEmpty(closestTopLevelDomain) && closestTopLevelDomain != emailParts.TopLevelDomain && emailParts.SecondLevelDomain != "")
                {
                    // The email address may have a mispelled top-level domain; return a suggestion
                    closestDomain = closestDomain.Replace(emailParts.TopLevelDomain, closestTopLevelDomain);
                    rtrn          = true;
                }

                if (rtrn)
                {
                    var result = new SplitEmailModel {
                        Username = emailParts.Address, Domain = closestDomain, Address = emailParts.Username + "@" + closestDomain
                    };
                    return(result);
                }
            }

            /* The email address exactly matches one of the supplied domains, does not closely
             * match any domain and does not appear to simply have a mispelled top-level domain,
             * or is an invalid email address; do not return a suggestion.
             */
            return(null);
        }