Module: FreeEmailDomains

Defined in:
app/lib/free_email_domains.rb

Overview

Shared list of free/consumer email domains.
Used to identify personal email addresses vs business email addresses.

Examples:

Check if a domain is a free email provider

FreeEmailDomains.include?('gmail.com')  # => true
FreeEmailDomains.include?('acme.com')   # => false

Get the full list

FreeEmailDomains.list  # => ['gmail.com', 'yahoo.com', ...]

Constant Summary collapse

DOMAINS_FILE =

Domains file.

Rails.root.join("data/free_email_domains.yml").freeze

Class Method Summary collapse

Class Method Details

.domain_from_email(email) ⇒ String?

Extract domain from an email address

Parameters:

  • email (String)

    Email address

Returns:

  • (String, nil)

    Domain or nil if invalid



45
46
47
48
49
50
# File 'app/lib/free_email_domains.rb', line 45

def domain_from_email(email)
  return nil if email.blank?

  parts = email.to_s.strip.downcase.split('@')
  parts.length == 2 ? parts.last : nil
end

.free_email?(email) ⇒ Boolean

Check if an email is from a free email provider

Parameters:

  • email (String)

    Email address

Returns:

  • (Boolean)


55
56
57
58
# File 'app/lib/free_email_domains.rb', line 55

def free_email?(email)
  domain = domain_from_email(email)
  domain.present? && include?(domain)
end

.include?(domain) ⇒ Boolean Also known as: free?, consumer?

Check if a domain is a known free email provider

Parameters:

  • domain (String)

    Domain to check (e.g., 'gmail.com')

Returns:

  • (Boolean)


21
22
23
24
25
# File 'app/lib/free_email_domains.rb', line 21

def include?(domain)
  return false if domain.blank?

  list.include?(domain.to_s.downcase.strip)
end

.listArray<String>

Get the full list of free email domains

Returns:

  • (Array<String>)


32
33
34
# File 'app/lib/free_email_domains.rb', line 32

def list
  @list ||= load_domains
end

.reload!Object

Force reload the list (useful for testing)



37
38
39
40
# File 'app/lib/free_email_domains.rb', line 37

def reload!
  @list = nil
  list
end