メールアドレスの検証

7185 ワード


エーrecent issue Eyayili Githubリポジトリでは、メールアドレスの検証についてもう少し考えさせていただきました.私はそれを見始めたとき、私はそれがそのような複雑な問題であることを学ぶことに少し驚きました.誰が電子メールアドレスとして明らかに単純なような何かがそのような複雑さとリンクされる可能性があると思いましたか?
2つの問題があります.
  • メールアドレスは有効ですか?仕事ですか.
  • メールアドレスは構文的に正しいですか?規則に従うか
  • 我々は第2の問題に集中するつもりです.しかし、それを掘る前に、ロードしましょう{emayili} .
    library(emayili)
    

    仕事ですか。


    If you want to validate an email address, send it an email. Problem solved.There’s only ONE way to validate an email address


    この質問に答える最も効果的な手段はテストメッセージをアドレスに送り、潜在的に応答を要求することです.いくつかの可能な結果があります.
  • テストメッセージがバウンス.これは、サーバーが拒否され、メールボックスが存在しないのですか?
  • テストメッセージは配送されるようですが、応答はありません.メールボックスが存在するかもしれませんが、使用されていません.
  • テストメッセージが配送され、応答があります.現存!🚀
  • それは構文的に正しいですか?


    驚くべきことではないが、どのような構文的に正しいメールアドレスを構成するかを規定する規則がある.ルールを考える前に、メールアドレスの部分について話しましょう.

    電子メールアドレスは2つの部分から成ります:ローカル部分とドメイン.例えば、[email protected] . オプションのディスプレイ名は電子メールアドレスの前にあるかもしれません.その場合、電子メールアドレスは角括弧で囲まれます.例えば、Alice Jones <[email protected]> .
    があるvarious rules これはローカル部分とドメインに適用されます.注:これは高レベルの要約であり、いくつかのニュアンスを無視します.

    規則:地方


    メールアドレスのローカル部分のルール
  • は最大64文字までの長さがあります.
  • 引用符"alice" ) または引用符alice ).
  • クォートされていない場合は、以下のASCII文字で構成されます.
  • 下と大文字のラテン文字a to z and A to Z )
  • 数字0 to 9 )
  • 様々な印刷可能な句読点と
  • ドット. ) しかし、開始または終了または1つ以上の連続しない.
  • 引用されるならば、規則は大いにより自由です.
  • はコメント(括弧で囲まれている)を含みます.
  • ルール:ドメイン


    メールアドレスのドメインのルール
  • は最大255文字までの長さがあります.
  • ホスト名またはIPアドレスの要件を満たす必要があります(この場合、角括弧で囲まなければなりません).
  • はコメント(括弧で囲まれている)を含みます.
  • アドレスクラス


    address クラスが追加されましたemayili .
    alice <- address("[email protected]")
    (bob <- address(email = "[email protected]", display = "Robert Brown"))
    
    [1] "Robert Brown <[email protected]>"
    
    構築することができますaddress ローカル名とドメインからのオブジェクト.
    address(local = "alice", domain = "example.com")
    
    [1] "[email protected]"
    
    これはvectorisedとリサイクルを行うので、このようなこともできます.
    address(local = c("bob", "erin"), domain = "yahoo.co.uk")
    
    [1] "[email protected]" "[email protected]"
    
    これもパイプラインでうまく動作します.まず始めましょうtibble いくつかのメールアカウントの詳細.
    recipients <- tibble(
      email = c(NA, NA, NA, "[email protected]"),
      local = c("alice", "erin", "bob", NA),
      domain = c("example.com", "yahoo.co.uk", "yahoo.co.uk", NA),
      display = c(NA, NA, "Robert Brown", NA)
    )
    recipients
    
    # A tibble: 4 × 4
      email local domain display     
      <chr> <chr> <chr> <chr>       
    1 <NA> alice example.com <NA>        
    2 <NA> erin yahoo.co.uk <NA>        
    3 <NA> bob yahoo.co.uk Robert Brown
    4 [email protected] <NA> <NA> <NA>        
    
    今すぐ使用invoke() 呼ぶaddress() レコードごとに.
    library(purrr)
    
    recipients <- recipients %>%
      invoke(address, .)
    
    [1] "[email protected]" "[email protected]"              
    [3] "Robert Brown <[email protected]>" "[email protected]"             
    
    💡 これは、do.call() .
    電子メールアドレスも強制的にaddress オブジェクト使用as.address() .
    as.address("Robert <[email protected]>")
    
    [1] "Robert <[email protected]>"
    

    方法


    電子メールアドレスと表示名を抽出する方法があります.
    raw(bob)
    
    [1] "[email protected]"
    
    display(bob)
    
    [1] "Robert Brown"
    
    また、ローカルの部分とドメインを取得することができます.
    local(bob)
    
    [1] "bob"
    
    domain(bob)
    
    [1] "yahoo.co.uk"
    

    政党


    新しい機能もあります.parties() , メールに関連するアドレスを抽出するために.
    email <- envelope() %>%
      from("[email protected]") %>%
      to("[email protected]", "Robert <[email protected]>") %>%
      cc("[email protected]") %>%
      bcc("[email protected]")
    
    parties(email)
    
    # A tibble: 5 × 6
      type address display raw local domain     
      <chr> <vctrs_dd> <chr> <chr> <chr> <chr>      
    1 From [email protected] <NA> [email protected] alice example.com
    2 To [email protected] <NA> [email protected] erin yahoo.co.uk
    3 To Robert <[email protected]> Robert [email protected] bob yahoo.co.uk
    4 Cc [email protected] <NA> [email protected] oscar windmill.nl
    5 Bcc [email protected] <NA> [email protected] olivia hotmail.com
    
    メールのすべてのアドレスの詳細は、素敵なけちな形式で分解.

    正規化


    時にはメールアドレスのデータを汚すことができるのでaddress クラスは内容をサニテーションする.
    as.address(" Robert < bob @ yahoo.co.uk >")
    
    [1] "Robert <[email protected]>"
    
    これは非常に簡単ですが、私はより多くの機能を追加する予定です.

    コンプライアンス


    最後に、電子メールアドレスが構文規則に従うかどうかのテスト.
    最初にいくつかの良いアドレス.
    compliant(c(
      "[email protected]",
      "Robert <[email protected]>",
      "[email protected]"
    ))
    
    [1] TRUE TRUE TRUE
    
    今いくつかの悪のアドレス.
    compliant(c(
      "alice?example.com",
      "Robert [email protected]",
      "olivia@hot_mail.com"
    ))
    
    [1] FALSE FALSE FALSE
    
    の実装compliant() 正規表現を使用します.見るthis StackOverflow thread 電子メールをチェックするためのregexの使用に関する長い議論のために.それは完璧ではないが、それは機能的です.もし失敗した場合は、私に知らせてください、私はロジックを改善します.

    結論


    ほとんどの場合、これらのチェックを心配する必要はありません.彼らはすべてのときに一緒にメールを入れバックグラウンドで発生します.しかし、あなたの電子メールアドレスの1つが問題であるならば、あなたが電子メールを送る前に、あなたは少なくともそれについて知っていなければなりません.
    これらのアップデートは{emayili} -0.4.16 .