6

PHP でサイトをコーディングしていて、現在お問い合わせページを開いているのですが、メール アドレスを検証する最善の方法は何だろうと考えていました。

  1. 電子メールに検証リンクを送信することによって?
  2. 正規表現
  3. 他の方法はありますか?

また、その理由と、それを達成するためのガイドを教えていただけますか? 誰かにコードをやってもらいたくないので、それは私にとって面白くなく、学ぶことはありませんが、上記の方法を達成するために使用される手法に関するいくつかのガイダンスです。

また、これらのメソッドを使用して、Web ページに購読ボタンを実装します。これはこれを行うための最良の方法ですか?私が考慮すべき他の方法はありますか?

4

10 に答える 10

16

私は通常、これらの手順を実行します

  1. 正規表現
  2. メールにアクティベーション コードを送信する

最初のステップが失敗すると、2 番目のステップには到達しません。メールが存在しないためにメールの送信に失敗した場合は、アカウントを削除するか、他のことを行います

- 編集

3 - 何らかの理由でアクティベーション メールが送信されず、メールが削除されず、承認されずに 7 日間 (またはユーザーが設定したとおりに) 放置された場合、それらの日数が経過すると、2 ~ 3 時間ごとにメールの再送信が試行されます。成功しない場合、電子メールは削除されます

4 - 電子メールが正常に送信されたが有効化されていない場合、未承認のままですが、新しい有効化コードを生成することでいつでも再有効化できます

于 2010-07-15T07:57:19.913 に答える
11

3.と1.の組み合わせがベストだと思います。

初期段階では、電子メールの構文を検証します (タイプミスをキャッチするため)。

filter_var($email, FILTER_VALIDATE_EMAIL)

そして 2 番目のメールでは、確認アドレスを記載した電子メールを送信します (エラーと故意に間違った情報をキャッチするため)。

于 2010-07-15T07:58:12.353 に答える
4

これを行う最善の方法は、検証リンクを含む電子メールを送信することです。少なくとも、アクティベーション メールが不要な場合は、メール アドレスを確認してください。最高の電子メール検証機能は、Dominic Sayers による RFC 準拠の電子メール アドレス バリデータです。

プロジェクトに php ファイルを含めて、次のように使用するだけです。

if (is_email($email, $checkDNS, $diagnose)) //$checkDNS and $diagnose are false by default
    echo 'Email valid';
else
    echo 'Email invalid';
  • $checkDNS が true に設定されている場合、ドメインが存在することが検証されます。ドメインが存在しない場合、電子メールが有効であっても関数は false を返します。
  • $diagnose が true に設定されている場合、関数はブール値の代わりにコードを返し、電子メールが無効である理由 (または有効な場合は 0) を通知します。
于 2010-07-15T14:03:01.797 に答える
3

電子メールが有効かどうかを本当に知る唯一の方法は、電子メールを送信することです。本当に必要な場合は、これらのいずれかを使用してください。技術的には、ローカル ドメインの @ の後にピリオドを付ける必要さえありません。必要なのは、@ の後にドメインが続くことだけです。

于 2010-07-15T08:07:13.190 に答える
3

これは、ユーザーが実際に応答を受け取りたいかどうかによって異なります。

ユーザーが質問をした場合、彼は応答を求め、おそらく有効な電子メール アドレスを提供します。この場合、非常に緩い正規表現チェックを使用して、タイプミスやアドレスの欠落を検出します。(のようなもの.+@.+。)

ユーザーが連絡を取りたくないが、アドレスを知りたい場合は、検証リンクを使用する必要があります。電子メール アドレスが有効で、ユーザーのものであることを確認する方法は他にありません。

于 2010-07-15T07:57:58.750 に答える
2

検証メールを送信する前にcheckdnsrr()、ドメインが存在し、MX レコードが設定されていることを確認するために使用することもできます。これにより、偽のドメイン (user@idontexist.com など) を使用する電子メールが検出されます。

function validateEmail($email, $field, $msg = '')
{
    if (!filter_var($email, FILTER_VALIDATE_EMAIL))
    {
        return false;
    }
    list($user, $domain) = explode('@', $email);
    if (function_exists('checkdnsrr') && !checkdnsrr($domain, 'MX'))
    {
        return false;
    }
    return true;
}

PHP 5.3 より前の Windows では使用できなかったため、使用できるfunction_exists()ことを確認するために使用する必要があります。checkdnsrr()

于 2010-07-15T13:44:56.843 に答える
2

正規表現は、電子メール アドレスの構文の有効性を判断するのにはあまり適していません。FILTER_VALIDATE_EMAILまた、関数のオプションfilter_varもかなり信頼できません。EmailAddressValidator クラスを使用して、電子メール アドレスの構文をテストします。

filter_var(PHP バージョン 5.3.2-1ubuntu4.2)によって返される誤った結果の例をいくつかまとめました。おそらくもっとあります。一部は確かに少し極端ですが、それでも注目に値します。

RFC 1035 2.3.1。優先名の構文
http://tools.ietf.org/search/rfc1035
要約: ドメインは、ドット区切り記号で区切られたラベルで構成されます (ただし、ローカル ドメインには必ずしも当てはまりません)。

echo filter_var('name@example', FILTER_VALIDATE_EMAIL);
// name@example

RFC 1035 2.3.1。優先名の構文
ラベルは、ARPANET ホスト名の規則に従う必要があります。文字で始まり、文字または数字で始まり、内部文字として文字、数字、およびハイフンのみを持つ必要があります。

echo filter_var('name@1example.com', FILTER_VALIDATE_EMAIL);
// name@1example

RFC 2822 3.2.5。引用符で囲まれた文字列
https://www.rfc-editor.org/rfc/rfc2822#section-3.2.5
これは有効です (ただし、多くのメール サーバーで拒否されています)。

echo filter_var('name"quoted"string@example', FILTER_VALIDATE_EMAIL);
// FALSE

RFC 5321 4.5.3.1.1。ローカル部分
https://www.rfc-editor.org/rfc/rfc5321#section-4.5.3.1.1
ユーザー名またはその他のローカル部分の最大合計長は 64 オクテットです。
70 文字でテストします。

echo filter_var('AbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghij@example.com', FILTER_VALIDATE_EMAIL);
// AbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghij@example.com

RFC 5321 4.5.3.1.2。ドメイン
https://www.rfc-editor.org/rfc/rfc5321#section-4.5.3.1.2
ドメイン名または番号の最大合計長は 255 オクテットです。
260 文字でテストします。

echo filter_var('name@AbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghij.com', FILTER_VALIDATE_EMAIL);
// name@AbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghijAbcdefghij.com

詳細については、正しい方法である PHP を使用して電子メール アドレスを検証するをご覧ください。

于 2010-07-15T08:46:10.747 に答える
1

目的によって異なります。有効でアクティブな電子メールが必要な場合は、受信確認を必要とする電子メールを送信する必要があります。この場合、ユーザーの利便性を除いて、正規表現の検証は必要ありません。

ただし、ユーザーの煩わしさを最小限に抑えながら、ユーザーがタイプミスを回避できるようにしたい場合は、正規表現で検証してください。

于 2010-07-15T08:16:02.847 に答える
0

ここにいくつかの良い答えがあります。正規表現ビットを除いて、選択したものに同意します。他の人が指摘しているように、RFC 5321 のすべての癖を完全に実装する正規表現を見つけることは、不可能ではないにしても困難です。

私の無料の PHP 関数を使用してis_email()アドレスを検証してください。こちらから入手できます。

アドレスが RFC 5321 に完全に準拠していることを確認します。オプションで、ドメインが実際に存在するかどうかを確認することもできます。

ユーザーの電子メール アドレスが実際に存在するかどうかを確認するために、バリデーターに頼るべきではありません。一部の ISP は、特にラテン アルファベットを使用していない国で、準拠していないアドレスをユーザーに提供しています。電子メールの検証に関する私のエッセイの詳細はこちら: http://isemail.info/about .

于 2011-03-15T11:22:13.193 に答える
-1
 function checkEmail($email) {
  if(preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])
  ↪*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/",
               $email)){
    list($username,$domain)=split('@',$email);
    if(!checkdnsrr($domain,'MX')) {
      return false;
    }
    return true;
  }
  return false;
于 2010-07-15T07:58:18.803 に答える