mikel / mail

A Really Ruby Mail Library
MIT License
3.61k stars 936 forks source link

Validate Email Address #1414

Open yoshie902a opened 4 years ago

yoshie902a commented 4 years ago

I am looking for a RFC5322 compliant way to validate email addresses. Can this gem do it? If so how and what is the regex it uses?

rafbm commented 4 years ago

This gem parses emails using Ragel grammars: https://github.com/mikel/mail/tree/master/lib/mail/parsers

Ragel offers a language to defines grammars and it generates parser code (in Ruby or other languages) based on these grammars.

Here is the grammar for addresses: https://github.com/mikel/mail/blob/master/lib/mail/parsers/address_lists_parser.rl

To leverage the Mail gem’s parser for validating email addresses, you can do something along those lines:

  def valid_email_address?(address)
    # This may raise if passed an invalid address
    mail_address = Mail::Address.new.tap { |a| a.address = address }

    # If the above did not raise, it’s still possible that something like
    # "this" was passed (no domain), so do some simple checks.
    !mail_address.local.nil? && !mail_address.local.empty? &&
      !mail_address.domain.nil? && !mail_address.domain.empty?
  rescue Mail::Field::FieldError
    false
  end
tom-lord commented 3 years ago

Slightly simpler version (using ActiveSupport, so this is basically rails-only):

  def valid_email_address(address)
    mail_address = Mail::Address.new(address)
    mail_address.local.present? && mail_address.domain.present?
  rescue Mail::Field::FieldError
    false
  end