রেলের জন্য ইমেল বৈধতায় শিল্পের কী অবস্থা?


95

আপনি ব্যবহারকারীদের ইমেল ঠিকানা যাচাই করতে ব্যবহার করছেন এবং কেন?

আমি ব্যবহার করছিলাম validates_email_veracity_ofযা আসলে এমএক্স সার্ভারগুলিকে জিজ্ঞাসা করে। তবে এটি বেশিরভাগ ক্ষেত্রে নেটওয়ার্ক ট্র্যাফিক এবং নির্ভরযোগ্যতার সাথে সম্পর্কিত বিভিন্ন কারণে ব্যর্থতায় পূর্ণ।

আমি চারপাশে তাকিয়ে দেখলাম এবং এমন কোনও স্পষ্ট কিছুই খুঁজে পেলাম না যে প্রচুর লোক ইমেল ঠিকানায় স্যানিটি পরীক্ষা করতে ব্যবহার করে। এর জন্য কি কোনও রক্ষণাবেক্ষণ, যুক্তিসঙ্গতভাবে সঠিক প্লাগইন বা রত্ন রয়েছে?

পিএস: দয়া করে আমাকে ইমেলটি কাজ করে কিনা তা দেখার জন্য একটি লিঙ্ক সহ ইমেল পাঠাতে বলবেন না। আমি একটি "বন্ধুর কাছে প্রেরণ করুন" বৈশিষ্ট্যটি বিকাশ করছি, সুতরাং এটি ব্যবহারিক নয়।



এমএক্স সার্ভারের অনুসন্ধান কেন ব্যর্থ হয়েছে তার আরও বিশদ কারণ আপনি দিতে পারেন? আমি জানতে চাই তাই আমি দেখতে পারি যে এগুলি স্থিরযোগ্য।
lulalala

উত্তর:


67

রেল 3.0.০ সহ আপনি মেল রত্ন ব্যবহার করে রেগ এক্সপ্যাক ছাড়াই একটি ইমেল বৈধতা ব্যবহার করতে পারেন ।

এখানে আমার বাস্তবায়ন ( রত্ন হিসাবে প্যাকেজড )।


ভাল লাগল, আমি তোমার রত্ন ব্যবহার করছি ধন্যবাদ
জেসনক্রাফোর্ড

দেখে মনে হচ্ছে ###@domain.comবৈধতা দেবে?
cwd

4
বলছি আমি এই রত্নটিকে পুনরুদ্ধার করতে চাই, এটি বজায় রাখার মতো সময় আমার ছিল না। তবে মনে হয় লোকেরা এখনও এটি ব্যবহার করে এবং উন্নতির সন্ধান করে। আপনি যদি আগ্রহী হন তবে দয়া করে আমাকে গিথুব প্রকল্পে লিখুন: হাল্লালুজা / বৈধ_মিল
হাল্লেলুজাহ

106

এটি যতটা প্রয়োজন তত বেশি শক্ত করবেন না। আপনার বৈশিষ্ট্যটি অ-সমালোচিত; টাইপগুলি ধরার জন্য বৈধতা কেবলমাত্র একটি বেসামরিক পদক্ষেপ। আমি এটি একটি সাধারণ রেজেেক্স দিয়ে করব, এবং খুব জটিল কিছুতে সিপিইউ চক্র নষ্ট করব না:

/\A[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]+\z/

এটি http://www.regular-expressions.info/email.html - এর থেকে রূপান্তরিত হয়েছিল - যা আপনি যদি সত্যই সমস্ত ট্রেডফক্স জানতে চান তবে আপনাকে পড়া উচিত। আপনি যদি আরও সঠিক এবং আরও জটিলভাবে সম্পূর্ণরূপে আরএফসি 822- অনুবর্তী রেইজেক্স চান তবে এটিও সেই পৃষ্ঠায়। তবে জিনিসটি হ'ল: আপনাকে এটি পুরোপুরি সঠিকভাবে পেতে হবে না।

যদি ঠিকানাটি বৈধতা পাস করে তবে আপনি একটি ইমেল প্রেরণ করতে যাচ্ছেন। যদি ইমেল ব্যর্থ হয়, আপনি একটি ত্রুটি বার্তা পেতে চলেছেন। কোন মুহুর্তে আপনি ব্যবহারকারীকে বলতে পারেন "দুঃখিত, আপনার বন্ধুটি এটি পায় নি, আপনি কি আবার চেষ্টা করতে চান?" বা ম্যানুয়াল পর্যালোচনার জন্য এটি পতাকাঙ্কিত করুন, বা কেবল এটিকে উপেক্ষা করুন বা যা কিছু হোক।

এই একই অপশন আপনার সাথে ঠিকানা যদি মোকাবেলা করতে হবে চাই করেনি বৈধতা পাস। কারণ যদি আপনার বৈধতা নিখুঁত হয় এবং আপনি ঠিকানাটি উপস্থিত থাকার নিখুঁত প্রমাণ অর্জন করেন তবে প্রেরণ এখনও ব্যর্থ হতে পারে।

বৈধতার উপর কোনও মিথ্যা পজিটিভের দাম কম। আরও ভাল বৈধতার সুবিধাও কম। উদারতার সাথে বৈধতা দিন, এবং ত্রুটিগুলি হওয়ার পরে তাদের সম্পর্কে চিন্তা করুন।


36
এর, মি। মিউজিয়াম এবং নতুন আন্তর্জাতিক টিএলডিগুলিতে কি বাধা আসবে না? এই রেজেক্স অনেকগুলি বৈধ ইমেল ঠিকানাগুলি আটকাতে পারে।
এলিয়াহ

4
এলিয়াহর সাথে একমত, এটি একটি খারাপ প্রস্তাব। অতিরিক্তভাবে, আমি নিশ্চিত না আপনি কীভাবে ভাবছেন যে আপনি ব্যবহারকারীকে বলতে পারেন যে তার বন্ধু ইমেলটি গ্রহণ করেনি কারণ ইমেলটি ব্যাট থেকে ঠিক সফল হয়েছে কিনা তা বলার উপায় নেই।
জেরিল

8
মিউসিয়াম এবং এর মতো ভাল বিষয় - আমি যখন ২০০৯ সালে প্রথম উত্তরটি পোস্ট করি তখন এটি কোনও সমস্যা ছিল না। আমি রেজেক্স পরিবর্তন করেছি। আপনার যদি আরও উন্নতি হয় তবে আপনি এটি সম্পাদনা করতেও পারেন, বা এটি একটি সম্প্রদায় উইকি পোস্ট করতে পারেন।
এসএফলে

5
এফওয়াইআই, এটি এখনও কিছু বৈধ ইমেল ঠিকানা মিস করবে। অনেক না, তবে কয়েকটি। উদাহরণস্বরূপ, প্রযুক্তিগতভাবে # Skype@foo.com হ'ল একটি বৈধ ইমেল ঠিকানা, যেমন "হেই আমি স্পেস পেতে পারি যদি সেগুলি উদ্ধৃত হয়" @ foo.com। আমি @ এর আগে যে কোনও কিছু উপেক্ষা করা এবং কেবলমাত্র ডোমেন অংশটি বৈধতা দেওয়া সবচেয়ে সহজ বলে মনে করি।
Nerdmaster

6
আমি এই অনুপ্রেরণার সাথে একমত যে আপনাকে কিছু ভুল ঠিকানা দিয়ে দেওয়ার বিষয়ে চিন্তা করা উচিত নয়। দুর্ভাগ্যক্রমে এই রেজেক্স কিছু সঠিক ঠিকানা বর্জন করবে, যা আমি অগ্রহণযোগ্য হিসাবে দেখি। এর চেয়ে ভাল কিছু হতে পারে? /.++..+\..+/
জোফ্রেএক্স

12

আমি রেল 3 এ ইমেল বৈধতার জন্য একটি রত্ন তৈরি করেছি I'm

http://github.com/balexand/email_ediaator


8
এটি মূলত রেজেক্সের চারপাশে একটি মোড়ক।
রব ডসন

আপনি কীভাবে এটি কোনও বিবৃতি ifবা unlessবিবৃতি দিয়ে ব্যবহার করবেন তার একটি উদাহরণ দিতে পারেন ? ডকুমেন্টেশন অপ্রয়োজনীয় বলে মনে হচ্ছে।
cwd

@ cwd আমার মনে হয় ডকুমেন্টেশনটি সম্পূর্ণ হয়েছে। আপনি যদি রেল 3+ বৈধতার সাথে পরিচিত না হন, তবে এই রেলকাস্টগুলি ( রেলস্কেস্ট / পেপিডস
২১১-


7

রেলগুলি থেকে 4 টি ডক্স :

class EmailValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    unless value =~ /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i
      record.errors[attribute] << (options[:message] || "is not an email")
    end
  end
end

class Person < ActiveRecord::Base
  validates :email, presence: true, email: true
end

5

4 রেলগুলিতে আপনার মডেলটিতে কেবল validates :email, email:true(আপনার ক্ষেত্রটি বলা হয় email) ধরে রাখুন এবং তারপরে EmailValidatorআপনার প্রয়োজন অনুসারে একটি সাধারণ (বা জটিল †) লিখুন ।

যেমন: - আপনার মডেল:

class TestUser
  include Mongoid::Document
  field :email,     type: String
  validates :email, email: true
end

আপনার বৈধকরণকারী (ভিতরে যায় app/validators/email_validator.rb)

class EmailValidator < ActiveModel::EachValidator
  EMAIL_ADDRESS_QTEXT           = Regexp.new '[^\\x0d\\x22\\x5c\\x80-\\xff]', nil, 'n'
  EMAIL_ADDRESS_DTEXT           = Regexp.new '[^\\x0d\\x5b-\\x5d\\x80-\\xff]', nil, 'n'
  EMAIL_ADDRESS_ATOM            = Regexp.new '[^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+', nil, 'n'
  EMAIL_ADDRESS_QUOTED_PAIR     = Regexp.new '\\x5c[\\x00-\\x7f]', nil, 'n'
  EMAIL_ADDRESS_DOMAIN_LITERAL  = Regexp.new "\\x5b(?:#{EMAIL_ADDRESS_DTEXT}|#{EMAIL_ADDRESS_QUOTED_PAIR})*\\x5d", nil, 'n'
  EMAIL_ADDRESS_QUOTED_STRING   = Regexp.new "\\x22(?:#{EMAIL_ADDRESS_QTEXT}|#{EMAIL_ADDRESS_QUOTED_PAIR})*\\x22", nil, 'n'
  EMAIL_ADDRESS_DOMAIN_REF      = EMAIL_ADDRESS_ATOM
  EMAIL_ADDRESS_SUB_DOMAIN      = "(?:#{EMAIL_ADDRESS_DOMAIN_REF}|#{EMAIL_ADDRESS_DOMAIN_LITERAL})"
  EMAIL_ADDRESS_WORD            = "(?:#{EMAIL_ADDRESS_ATOM}|#{EMAIL_ADDRESS_QUOTED_STRING})"
  EMAIL_ADDRESS_DOMAIN          = "#{EMAIL_ADDRESS_SUB_DOMAIN}(?:\\x2e#{EMAIL_ADDRESS_SUB_DOMAIN})*"
  EMAIL_ADDRESS_LOCAL_PART      = "#{EMAIL_ADDRESS_WORD}(?:\\x2e#{EMAIL_ADDRESS_WORD})*"
  EMAIL_ADDRESS_SPEC            = "#{EMAIL_ADDRESS_LOCAL_PART}\\x40#{EMAIL_ADDRESS_DOMAIN}"
  EMAIL_ADDRESS_PATTERN         = Regexp.new "#{EMAIL_ADDRESS_SPEC}", nil, 'n'
  EMAIL_ADDRESS_EXACT_PATTERN   = Regexp.new "\\A#{EMAIL_ADDRESS_SPEC}\\z", nil, 'n'

  def validate_each(record, attribute, value)
    unless value =~ EMAIL_ADDRESS_EXACT_PATTERN
      record.errors[attribute] << (options[:message] || 'is not a valid email')
    end
  end
end

এটি "test+no_really@test.tes" ইত্যাদির মতো ট্যাগযুক্ত ইমেল সহ সকল প্রকার বৈধ ইমেলগুলিকে মঞ্জুরি দেবে ।

rspecআপনার সাথে এটি পরীক্ষাspec/validators/email_validator_spec.rb

require 'spec_helper'

describe "EmailValidator" do
  let(:validator) { EmailValidator.new({attributes: [:email]}) }
  let(:model) { double('model') }

  before :each do
    model.stub("errors").and_return([])
    model.errors.stub('[]').and_return({})  
    model.errors[].stub('<<')
  end

  context "given an invalid email address" do
    let(:invalid_email) { 'test test tes' }
    it "is rejected as invalid" do
      model.errors[].should_receive('<<')
      validator.validate_each(model, "email", invalid_email)
    end  
  end

  context "given a simple valid address" do
    let(:valid_simple_email) { 'test@test.tes' }
    it "is accepted as valid" do
      model.errors[].should_not_receive('<<')    
      validator.validate_each(model, "email", valid_simple_email)
    end
  end

  context "given a valid tagged address" do
    let(:valid_tagged_email) { 'test+thingo@test.tes' }
    it "is accepted as valid" do
      model.errors[].should_not_receive('<<')    
      validator.validate_each(model, "email", valid_tagged_email)
    end
  end
end

যাইহোক আমি এটি এভাবেই করেছি। ওয়াইএমএমভি

Ular নিয়মিত প্রকাশগুলি হিংসার মতো; যদি তারা কাজ না করে তবে আপনি তাদের যথেষ্ট পরিমাণে ব্যবহার করছেন না।


4
আমি আপনার বৈধতা ব্যবহার করার জন্য প্রলুব্ধ, তবে আপনি এটি কোথা থেকে পেয়েছেন বা কীভাবে তৈরি করেছেন তা আমার কোনও ধারণা নেই। আপনি কি আমাদের বলতে পারেন?
মৌরিসিও মোরেস

আমি একটি গুগল অনুসন্ধান থেকে নিয়মিত অভিব্যক্তি পেয়েছি এবং নিজের সম্পর্কে র‍্যাপার কোড এবং বিশদ পরীক্ষা লিখেছি।
ডেভ সাগ 21

4
এটি দুর্দান্ত যে আপনি পরীক্ষাগুলিও পোস্ট করেছেন! কিন্তু সত্যিই আমাকে কী পেয়েছিল সেখানে শক্তি-উদ্ধৃতি! :)
মরিসিও মোরেস 20

4

হাল্লুজা পরামর্শ হিসাবে আমার মনে হয় মেল রত্ন ব্যবহার করা একটি ভাল পদ্ধতির। তবে আমি সেখানকার কয়েকটি হুপ অপছন্দ করি।

আমি ব্যবহার করি:

def self.is_valid?(email) 

  parser = Mail::RFC2822Parser.new
  parser.root = :addr_spec
  result = parser.parse(email)

  # Don't allow for a TLD by itself list (sam@localhost)
  # The Grammar is: (local_part "@" domain) / local_part ... discard latter
  result && 
     result.respond_to?(:domain) && 
     result.domain.dot_atom_text.elements.size > 1
end

আপনি দাবিতে যে TLDs এ (শীর্ষ লেভেল ডোমেইন) এ দ্বারা কঠোর হতে পারে এই তালিকায় অবশ্য আপনি যে তালিকা আপডেট করার নতুন TLDs এ পপ আপ (2012 উপরন্তু মত বাধ্য করা হবে .mobiএবং .tel)

সরাসরি পার্সারকে হুক করার সুবিধাটি হ'ল মেল ব্যাকরণের নিয়মগুলি মেল রত্নটি যে অংশগুলি ব্যবহার করে সেগুলির জন্য মোটামুটি বিস্তৃত, এটি user<user@example.com>এসএমটিপি-র জন্য সাধারণ এমন কোনও ঠিকানাকে বিশ্লেষণের জন্য ডিজাইন করা হয়েছে । এটি থেকে গ্রাস করে Mail::Addressআপনি অতিরিক্ত চেকগুলি একগুচ্ছ করতে বাধ্য হন।

মেল মণি সংক্রান্ত আরেকটি নোট, যদিও বর্গ RFC2822 বলা হয়, ব্যাকরণ কিছু উপাদান রয়েছে RFC5322 , উদাহরণস্বরূপ এই পরীক্ষাটি


4
এই স্নিপেটের জন্য ধন্যবাদ, স্যাম। আমি একটু অবাক হলাম মেল রত্ন দ্বারা সরবরাহ করা জেনেরিক "বেশিরভাগ সময় যথেষ্ট ভাল" বৈধতা নেই।
জেডি।

4

রেলস 3 এ পুনরায় ব্যবহারযোগ্য বৈধকারক লেখা সম্ভব , কারণ এই দুর্দান্ত পোস্টটি ব্যাখ্যা করেছে:

http://archives.ryandaigle.com/articles/2009/8/11/hat-s-new-in-edge-rails-ind dependend-model-uthorators

class EmailValidator < ActiveRecord::Validator   
  def validate()
    record.errors[:email] << "is not valid" unless
    record.email =~ /^([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})$/i   
  end
end

এবং এটি দিয়ে ব্যবহার করুন validates_with:

class User < ActiveRecord::Base   
  validates_with EmailValidator
end

3

অন্যান্য উত্তরগুলি লক্ষ্য করে, এখনও প্রশ্নটি রয়ে গেছে - কেন এটি সম্পর্কে চতুর হওয়া উচিত?

প্রান্তের প্রকৃত পরিমাণের পরিমাণ যা অনেক রেজেক্স অস্বীকার করতে বা মিস করতে পারে তা সমস্যাযুক্ত বলে মনে হয়।

আমি মনে করি যে প্রশ্নটি 'আমি কী অর্জন করতে চাইছি?', আপনি ইমেল ঠিকানাটি 'বৈধতা' দিলেও, আপনি বাস্তবে এটি বৈধ ইমেল ঠিকানা যাচাই করছেন না।

আপনি যদি রেজিপ্সে যান, কেবল ক্লায়েন্টের পক্ষে @ এর উপস্থিতি যাচাই করুন।

ভুল ইমেল দৃশ্যের হিসাবে, আপনার কোডটিতে একটি 'বার্তা প্রেরণে ব্যর্থ হয়েছে' have


1

মূলত 3 টি সর্বাধিক সাধারণ বিকল্প রয়েছে:

  1. রেজিএক্সপ্যাক্স (সমস্ত ই-মেইল ঠিকানা রিজেক্সেপ-এর জন্য কোনও কাজ নেই, তাই আপনার নিজের রোল করুন)
  2. এমএক্স কোয়েরি (এটি আপনি ব্যবহার করেন)
  3. একটি অ্যাক্টিভেশন টোকেন তৈরি করা এবং এটি মেইল ​​করা (বিশ্রাম_অথেন্টিফিকেশন উপায়)

আপনি যদি যাচাই_ইমেল_সামগ্রী_ ও টোকেন প্রজন্ম উভয়ই ব্যবহার করতে না চান, তবে আমি পুরানো স্কুল পুনর্নির্মাণ চেকিংয়ের সাথে যাব।


1

মেল রত্নটিতে অ্যাড্রেস পার্সার রয়েছে।

begin
  Mail::Address.new(email)
  #valid
rescue Mail::Field::ParseError => e
  #invalid
end

R.১ রেলগুলিতে আমার পক্ষে কাজ করছে বলে মনে হচ্ছে না। মেল :: ঠিকানা.নিউ ("জন") খুশি আমাকে একটি নতুন মেইল ​​:: অ্যাড্রেস অবজেক্টটি ব্যতিক্রম না বাড়িয়ে ফিরিয়ে দেয়।
জেসনক্রাফোর্ড

ঠিক আছে, এটি কিছু ক্ষেত্রে ব্যতিক্রম ছুঁড়ে ফেলবে, তবে সব কিছু নয়। @ হাল্লুজাহের লিঙ্কটি এখানে ভাল পন্থা বলে মনে হচ্ছে।
জেসনক্রাফোর্ড 20'12

1

এই সমাধানটি @ এসএফএলে এবং @ আলেসান্দ্রো ডিএস-এর একটি রিফ্যাক্টর সহ এবং ব্যবহারের ব্যাখ্যা সহ উত্তরের উপর ভিত্তি করে।

আপনি আপনার মডেলটিতে এই ভ্যালিডেটার শ্রেণিটি এর মতো ব্যবহার করতে পারেন:

class MyModel < ActiveRecord::Base
  # ...
  validates :colum, :email => { :allow_nil => true, :message => 'O hai Mark!' }
  # ...
end

আপনার app/validatorsফোল্ডারে নিম্নলিখিতটি দেওয়া রয়েছে (রেল 3):

class EmailValidator < ActiveModel::EachValidator

  def validate_each(record, attribute, value)
    return options[:allow_nil] == true if value.nil?

    unless matches?(value)
      record.errors[attribute] << (options[:message] || 'must be a valid email address')
    end
  end

  def matches?(value)
    return false unless value

    if /\A[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]+\z/.match(value).nil?
      false
    else
      true
    end

  end
end

1

জন্য মেলিং তালিকাগুলি ভ্যালিডেশন । (আমি 4.1.6 কিল ব্যবহার করি)

আমি আমার regexp পেয়েছিলাম এখানে । এটি একটি সম্পূর্ণ সম্পূর্ণ বলে মনে হচ্ছে, এবং এটি প্রচুর সংমিশ্রণের বিরুদ্ধে পরীক্ষা করা হয়েছে। আপনি এই পৃষ্ঠায় ফলাফল দেখতে পারেন।

আমি এটিকে সামান্য পরিবর্তিত করে একটি রুবি রিজেক্সেপ এনেছি এবং এটি আমার মধ্যে রেখেছি lib/validators/email_list_validator.rb

কোডটি এখানে:

require 'mail'

class EmailListValidator < ActiveModel::EachValidator

  # Regexp source: https://fightingforalostcause.net/content/misc/2006/compare-email-regex.php
  EMAIL_VALIDATION_REGEXP   = Regexp.new('\A(?!(?:(?:\x22?\x5C[\x00-\x7E]\x22?)|(?:\x22?[^\x5C\x22]\x22?)){255,})(?!(?:(?:\x22?\x5C[\x00-\x7E]\x22?)|(?:\x22?[^\x5C\x22]\x22?)){65,}@)(?:(?:[\x21\x23-\x27\x2A\x2B\x2D\x2F-\x39\x3D\x3F\x5E-\x7E]+)|(?:\x22(?:[\x01-\x08\x0B\x0C\x0E-\x1F\x21\x23-\x5B\x5D-\x7F]|(?:\x5C[\x00-\x7F]))*\x22))(?:\.(?:(?:[\x21\x23-\x27\x2A\x2B\x2D\x2F-\x39\x3D\x3F\x5E-\x7E]+)|(?:\x22(?:[\x01-\x08\x0B\x0C\x0E-\x1F\x21\x23-\x5B\x5D-\x7F]|(?:\x5C[\x00-\x7F]))*\x22)))*@(?:(?:(?!.*[^.]{64,})(?:(?:(?:xn--)?[a-z0-9]+(?:-[a-z0-9]+)*\.){1,126}){1,}(?:(?:[a-z][a-z0-9]*)|(?:(?:xn--)[a-z0-9]+))(?:-[a-z0-9]+)*)|(?:\[(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){7})|(?:(?!(?:.*[a-f0-9][:\]]){7,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?)))|(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){5}:)|(?:(?!(?:.*[a-f0-9]:){5,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3})?::(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3}:)?)))?(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))(?:\.(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(?:[1-9]?[0-9]))){3}))\]))\z', true)

  def validate_each(record, attribute, value)
    begin
      invalid_emails = Mail::AddressList.new(value).addresses.map do |mail_address|
        # check if domain is present and if it passes validation through the regex
        (mail_address.domain.present? && mail_address.address =~ EMAIL_VALIDATION_REGEXP) ? nil : mail_address.address
      end

      invalid_emails.uniq!
      invalid_emails.compact!
      record.errors.add(attribute, :invalid_emails, :emails => invalid_emails.to_sentence) if invalid_emails.present?
    rescue Mail::Field::ParseError => e

      # Parse error on email field.
      # exception attributes are:
      #   e.element : Kind of element that was wrong (in case of invalid addres it is Mail::AddressListParser)
      #   e.value: mail adresses passed to parser (string)
      #   e.reason: Description of the problem. A message that is not very user friendly
      if e.reason.include?('Expected one of')
        record.errors.add(attribute, :invalid_email_list_characters)
      else
        record.errors.add(attribute, :invalid_emails_generic)
      end
    end
  end

end

এবং আমি এটি মডেলটিতে এটি ব্যবহার করি:

validates :emails, :presence => true, :email_list => true

এটি বিভিন্ন বিভাজক এবং সিন্থ্যাক্স সহ এই জাতীয় মেলিং তালিকাকে বৈধতা দেবে:

mail_list = 'John Doe <john@doe.com>, chuck@schuld.dea.th; David G. <david@pink.floyd.division.bell>'

এই রেজিএক্সপ্যাক্স ব্যবহার করার আগে, আমি ব্যবহার করেছি Devise.email_regexp, তবে এটি একটি খুব সাধারণ রেজিপ এক্স এবং আমার প্রয়োজনীয় সমস্ত কেস পাওয়া যায় নি। কিছু ইমেল বিচ্ছিন্ন হয়েছে।

আমি ওয়েব থেকে অন্যান্য রেগেক্সপ চেষ্টা করেছিলাম তবে এখন পর্যন্ত এটি সেরা ফলাফল পেয়েছে। আশা করি এটি আপনার ক্ষেত্রে সহায়তা করবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.