diff --git a/README.md b/README.md index 8ee92e5..2a5a973 100644 --- a/README.md +++ b/README.md @@ -128,6 +128,12 @@ address.valid_strict_mx? => true address.subaddressed? => false ``` +If you want to allow multibyte characters, set it explicitly. + +```ruby +ValidEmail2::Address.permitted_multibyte_characters_regex = /[ÆæØøÅåÄäÖöÞþÐð]/ +``` + ### Test environment If you are validating `mx` then your specs will fail without an internet connection. diff --git a/lib/valid_email2/address.rb b/lib/valid_email2/address.rb index 36facb3..aa9348c 100644 --- a/lib/valid_email2/address.rb +++ b/lib/valid_email2/address.rb @@ -3,7 +3,6 @@ require "valid_email2" require "resolv" require "mail" -require "unicode/emoji" require "valid_email2/dns_records_cache" module ValidEmail2 @@ -22,6 +21,14 @@ def self.prohibited_domain_characters_regex=(val) @prohibited_domain_characters_regex = val end + def self.permitted_multibyte_characters_regex + @permitted_multibyte_characters_regex + end + + def self.permitted_multibyte_characters_regex=(val) + @permitted_multibyte_characters_regex = val + end + def initialize(address, dns_timeout = 5, dns_nameserver = nil) @parse_error = false @raw_address = address @@ -34,7 +41,7 @@ def initialize(address, dns_timeout = 5, dns_nameserver = nil) @parse_error = true end - @parse_error ||= address_contain_emoticons? + @parse_error ||= address_contain_multibyte_characters? end def valid? @@ -130,10 +137,12 @@ def mx_server_is_in?(domain_list) } end - def address_contain_emoticons? + def address_contain_multibyte_characters? return false if @raw_address.nil? - @raw_address.scan(Unicode::Emoji::REGEX).length >= 1 + return false if @raw_address.ascii_only? + + @raw_address.each_char.any? { |char| char.bytesize > 1 && char !~ self.class.permitted_multibyte_characters_regex } end def resolv_config diff --git a/spec/address_spec.rb b/spec/address_spec.rb index 0861857..7b713a0 100644 --- a/spec/address_spec.rb +++ b/spec/address_spec.rb @@ -34,9 +34,25 @@ expect(address.valid?).to be false end - it "is valid if it contains special scandinavian characters" do + it "is invalid if it contains Japanese characters" do + address = described_class.new("あいうえお@example.com") + expect(address.valid?).to be false + end + + it "is invalid if it contains special scandinavian characters" do address = described_class.new("jørgen@email.dk") - expect(address.valid?).to eq true + expect(address.valid?).to eq false + end + + context "permitted_multibyte_characters_regex is set" do + before do + described_class.permitted_multibyte_characters_regex = /[ÆæØøÅåÄäÖöÞþÐð]/ + end + + it "is valid if it contains special scandinavian characters" do + address = described_class.new("jørgen@email.dk") + expect(address.valid?).to eq true + end end end diff --git a/valid_email2.gemspec b/valid_email2.gemspec index a8df0bc..b9e67a7 100644 --- a/valid_email2.gemspec +++ b/valid_email2.gemspec @@ -28,5 +28,4 @@ Gem::Specification.new do |spec| spec.add_development_dependency "pry" spec.add_runtime_dependency "mail", "~> 2.5" spec.add_runtime_dependency "activemodel", ">= 6.0" - spec.add_runtime_dependency "unicode-emoji", "~> 3.7.0" end