sourcecode

PHP에서 이메일 주소를 확인하는 방법

copyscript 2022. 9. 19. 23:28
반응형

PHP에서 이메일 주소를 확인하는 방법

이메일 주소의 유효성을 확인하는 기능은 다음과 같습니다.

function validateEMAIL($EMAIL) {
    $v = "/[a-zA-Z0-9_-.+]+@[a-zA-Z0-9-]+.[a-zA-Z]+/";

    return (bool)preg_match($v, $EMAIL);
}

이메일 주소가 유효한지 확인해도 될까요?

전자 메일 주소가 올바른 형식인지 확인하는 가장 쉽고 안전한 방법은 다음 기능을 사용하는 것입니다.

if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
    // invalid emailaddress
}

도메인이 정의되어 할 수 .MX★★★★

if (!checkdnsrr($domain, 'MX')) {
    // domain is not valid
}

그러나 이것은 여전히 메일이 존재함을 보장하지는 않습니다.그것을 알 수 있는 유일한 방법은 확인 메일을 보내는 것입니다.


이제 간단한 답변을 받으셨으니, 알고 싶으시면 이메일 주소 확인에 대해 읽어보시기 바랍니다. 그렇지 않으면 빠른 답변을 사용하여 다음 단계로 넘어가시기 바랍니다.기분 나빠하지 마세요.

regex를 사용하여 전자 메일 주소의 유효성을 검사하는 것은 "불가능한" 작업입니다.당신이 만든 정규식은 쓸모없다고까지 말하고 싶습니다.이메일 주소 및 잘못된 이메일 주소를 잡기 위한 정규식 작성에 관한 3가지 RFC가 있으며, 동시에 false positive를 가지지 않는 것은 필멸적인 일이 아닙니다. 목록에서 PHP에 의해 사용되는 정규식의 테스트(실패 및 성공)를 확인합니다.filter_var()★★★★★★ 。

내장된 PHP 기능, 이메일 클라이언트 또는 서버도 제대로 작동하지 않습니다. 의 경우filter_var최적의 옵션입니다.

PHP(현재)가 이메일 주소를 검증하기 위해 사용하는 regex 패턴을 알고 싶다면 PHP 소스를 참조하십시오.

이메일 주소에 대해 자세히 알고 싶다면 스펙을 읽어보시길 권합니다만, 아무리 읽어도 쉽게 읽을 수 있는 것은 아닙니다.

여기에는 filter_var를 사용할 수 있습니다.

<?php
   function validateEmail($email) {
      return filter_var($email, FILTER_VALIDATE_EMAIL);
   }
?>

경험으로는 제제 in in in in in in in in inregex "false positive"가 너무 많다.filter_var()(특히 새로운 모든 TLD에서) 잘못된 음이 검출되었습니다.

대신 주소에 이메일 주소의 필요한 부분(사용자, "@" 기호 및 도메인)이 모두 포함되어 있는지 확인한 다음 도메인 자체가 존재하는지 확인하는 것이 좋습니다.

외부 도메인에 대한 전자 메일 사용자가 존재하는지(서버 측) 확인할 수 없습니다.

유틸리티 클래스에서 작성한 메서드는 다음과 같습니다.

public static function validateEmail(string $email): bool {

    // SET INITIAL RETURN VARIABLE
    // ENSURE -> EMAIL ISN'T EMPTY | AN @ SYMBOL IS PRESENT 

        $emailIsValid = FALSE;

        if (
            !empty($email) &&
            strpos($email, '@') !== FALSE
        ) {

            // GET EMAIL PARTS

                $email  = explode('@', $email);
                $user   = $email[0];
                $domain = $email[1];

            // VALIDATE EMAIL ADDRESS

                if (
                    count($email) === 2 &&
                    !empty($user) &&
                    !empty($domain) &&
                    checkdnsrr($domain)
                ) {
                    $emailIsValid = TRUE;
                }
        }

    // RETURN RESULT

        return $emailIsValid;
}

이 경우에는 PHP의 내장 필터를 사용하는 것이 좋을 것 같습니다.

true 또는 false를 할 수 .FILTER_VALIDATE_EMAILPARAM.

이렇게 하면 이메일의 유효성이 확인될 뿐만 아니라 예기치 않은 문자에 대해서도 삭제됩니다.

$email  = $_POST['email'];
$emailB = filter_var($email, FILTER_SANITIZE_EMAIL);

if (filter_var($emailB, FILTER_VALIDATE_EMAIL) === false ||
    $emailB != $email
) {
    echo "This email adress isn't valid!";
    exit(0);
}

여기서 답을 읽은 후, 저는 다음과 같이 결론을 내렸습니다.

public static function isValidEmail(string $email) : bool
{
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        return false;
    }

    //Get host name from email and check if it is valid
    $email_host = array_slice(explode("@", $email), -1)[0];

    // Check if valid IP (v4 or v6). If it is we can't do a DNS lookup
    if (!filter_var($email_host,FILTER_VALIDATE_IP, [
        'flags' => FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE,
    ])) {
        //Add a dot to the end of the host name to make a fully qualified domain name
        // and get last array element because an escaped @ is allowed in the local part (RFC 5322)
        // Then convert to ascii (http://us.php.net/manual/en/function.idn-to-ascii.php)
        $email_host = idn_to_ascii($email_host.'.');

        //Check for MX pointers in DNS (if there are no MX pointers the domain cannot receive emails)
        if (!checkdnsrr($email_host, "MX")) {
            return false;
        }
    }

    return true;
}

다음 코드 사용:

// Variable to check
$email = "john.doe@example.com";

// Remove all illegal characters from email
$email = filter_var($email, FILTER_SANITIZE_EMAIL);


// Validate e-mail
if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
  echo("Email is a valid email address");
}

e-메일 검증에 관한 '주요 질문'에서 이 질문에 답변했습니다.https://stackoverflow.com/a/41129750/1848217

이메일을 확인하는 올바른 방법은 다음과 같습니다.

  1. 하는지, 그 에는 @가 아닌 기호가 확인합니다. @는 @는 @는 @는 @는 @는 @는 @는 @는 @는 @가 아니다./^[^@]+@[^@]+$/
  2. 「액티베이션 코드」를 포함한 전자 메일을 이 주소로 송신해 주세요.
  3. 사용자가 이메일 주소를 "활성화"하면 모든 것이 올바른지 확인합니다.

물론 사용자가 "이상한" 이메일을 입력할 때 경고나 툴팁을 프런트 엔드에 표시하여 도메인 부분에 점이 없거나 따옴표가 없는 이름에 공백이 있는 등의 일반적인 실수를 방지할 수 있습니다.단, 사용자가 진정으로 원하는 경우 주소 "hello@world"를 수락해야 합니다.

또한 이메일 주소의 표준이 이전과 같았으며, 따라서 "standard-valid" regexp를 영원히 입력할 수는 없습니다.또, 일부의 구체적인 인터넷 서버는, 공통 표준의 몇개의 상세한 것에 실패하는 일이 있어, 실제로는 독자적인 「수정된 표준」으로 동작하는 경우가 있습니다.

따라서 @를 체크하고 프런트 엔드에서 사용자를 힌트하고 지정된 주소로 확인 이메일을 보냅니다.

이메일 주소에서 제공된 도메인이 유효한지 여부를 확인하려면 다음과 같이 하십시오.

/*
* Check for valid MX record for given email domain
*/
if(!function_exists('check_email_domain')){
    function check_email_domain($email) {
        //Get host name from email and check if it is valid
        $email_host = explode("@", $email);     
        //Add a dot to the end of the host name to make a fully qualified domain name and get last array element because an escaped @ is allowed in the local part (RFC 5322)
        $host = end($email_host) . "."; 
        //Convert to ascii (http://us.php.net/manual/en/function.idn-to-ascii.php)
        return checkdnsrr(idn_to_ascii($host), "MX"); //(bool)       
    }
}

유효한 전자 메일 형식이 유효한 전자 메일을 의미하지 않기 때문에 이 방법은 많은 잘못된 전자 메일 주소를 독립 전자 메일 확인과 함께 필터링하는 데 유용합니다.

:idn_to_ascii() 그의 기능)idn_to_utf8()PHP 설치에서는 기능을 사용할 수 없습니다.PECL intl > = 1.0.2 및 PECL idn > = 0.1 확장자가 필요합니다.

전자 또는 IPv6 가 되는 것에 해 주세요(를 들면, IPv4 의 IPv6 의 E-R-Manager E-Manager E-Manager E-Manager E-Manager E-Manager E-Manager E-Manager E-Manager( 「IPv6」).user@[IPv6:2001:db8::1])는 검증할 수 없습니다.이름 있는 호스트만 검증할 수 있습니다.

자세한 것은 이쪽.

점, 등을 수 있는 볼 수 있습니다.[a-zA-z0-9.-]+\@[a-zA-z0-9.-]+.[a-zA-Z]+그렇게 하면 꽤 멍청해 보이는 이메일이 가능해진다.tom_anderson.1-neo@my-mail_matrix.com검증할 필요가 있습니다.

/(?![[:alnum:]]|@|-|_|\.)./

과 HTML5 폼을 하고 있는 type=email브라우저 엔진에 자체 검증기가 있기 때문에 이미 80%까지 안전합니다.하기 위해서 이 를 regex에 합니다.preg_match_all()그것을 부정합니다.

if (!preg_match_all("/(?![[:alnum:]]|@|-|_|\.)./",$email)) { .. }

HTML5 양식에 의해 검증에 사용되는 regex를 찾습니다.
https://regex101.com/r/mPEKmy/1

filter_VALIDATE_EMAIL에 내장된 regex가 더 좋지만 regex가 있으면 결과가 나빠질 수 있습니다.

예를 들어...

// "not an email" is invalid so its false.
php > var_export(filter_var("not an email", FILTER_VALIDATE_EMAIL));
false
// "foo@a.com" looks like an email, so it passes even though its not real.
php > var_export(filter_var("foo@a.com", FILTER_VALIDATE_EMAIL));
'foo@a.com'
// "foo@gmail.com" passes, gmail is a valid email server,
//  but gmail require more than 3 letters for the address.
var_export(filter_var("foo@gmail.com", FILTER_VALIDATE_EMAIL));
'foo@gmail.com'

이메일이 실제인지 확인하기 위해 메일함 검사를 상세하게 수행할 수 있는 Real Email과 같은 API를 사용하는 것을 고려해 보는 것이 좋습니다.

약간...

$email = "foo@bar.com";
$api_key = ???;

$request_context = stream_context_create(array(
    'http' => array(
        'header'  => "Authorization: Bearer " . $api_key
    )
));

$result_json = file_get_contents("https://isitarealemail.com/api/email/validate?email=" . $email, false, $request_context);

if (json_decode($result_json, true)['status'] == "valid") {
    echo("email is valid");
} else if (json_decode($result_json, true)['status'] == "invalid") {
    echo("email is invalid");
} else {
  echo("email was unknown");
}

"인터넷 메시지 형식"의 토대를 마련하는 3개의 RFC가 있습니다.

  1. RFC 822
  2. RFC 2822 (RFC 822 대체)
  3. RFC 5322 (RFC 2822 대체)

다만, RFC 5322 에서는, 전자 메일 ID 와 그 명명 구조를 가장 기술적인 방법으로 정의하고 있습니다.그것은 모든 사용 사례를 아직 허용할 수 있을 만큼 자유롭고 형식주의로 구속할 수 있을 만큼 보수적인 인터넷 표준을 마련하는 것이 더 적합하다.

단, 소프트웨어 개발자 커뮤니티로부터의 이메일 검증 요건은 다음과 같습니다.

  • 불필요한 스팸 발송자를 방지하다
  • 사용자가 실수로 실수를 하지 않도록 하기 위해
  • 전자 메일 ID가 입력된 실제 사용자의 것인지 확인합니다.

E-메일 ID의 모든 형식(포트 ID 및 모든 형식 포함)을 허용하는 기술적으로 포괄적인 정의를 구현하는 데는 그다지 관심이 없습니다.고객의 사용 사례에 적합한 솔루션은 모든 합법적인 전자 메일 소유자가 통과할 수 있도록 보장하는 것만을 필요로 합니다."합법적"의 정의는 기술적 관점(RFC 5322 방식)과 가용성 관점(이 솔루션)에 따라 크게 다릅니다.검증의 유용성 측면에서는 검증 메커니즘에 의해 검증되는 모든 전자 메일 ID가 실제 사용자의 것이며, 이를 통신 목적으로 사용하는 것을 목적으로 합니다.이것에 의해, 검증 프로세스에 다른 각도가 도입되어 실제의 「사용중의」이메일 ID가 확보됩니다.이러한 요건은 RFC-5322의 정의로는 불충분합니다.

따라서 실제 요구사항은 다음과 같이 요약된다.

  1. 몇 가지 매우 기본적인 유효성 검사를 위해
  2. 입력된 전자 메일이 사용 중인지 확인하려면

두 번째 요건은 일반적으로 입력된 전자 메일 ID에 대한 표준 응답 검색 전자 메일을 전송하고 응답 메커니즘에 기술된 액션에 따라 사용자를 인증하는 것입니다.이것은, 「사용중의」 전자 메일 ID 를 검증하는 2번째 요건을 확실히 하기 위해서 가장 널리 사용되는 메카니즘입니다.이것은 백엔드 서버의 실장으로부터의 라운드 트립을 수반하는 것으로, 간단한 싱글 스크린 실장은 아닙니다.다만, 이것을 없앨 수는 없습니다.

첫 번째 요구사항은 개발자가 완전히 "이메일 같지 않은" 문자열이 전자메일로 전달되는 것을 원하지 않기 때문입니다.여기에는 일반적으로 공백, "@" 기호 또는 도메인 이름이 없는 문자열이 포함됩니다.도메인 이름의 punycode 표현에 따라 도메인 검증을 활성화해야 할 경우 유효한 도메인 이름을 보장하는 본격적인 구현에 참여해야 합니다.따라서, 이 점에 관한 요건의 기본적인 성질을 고려할 때, "<something>@<something>"을 검증합니다.<something>"만이 요건을 충족하는 적절한 방법입니다.

이 요건을 충족할 수 있는 일반적인 regex는 다음과 같습니다.^ [ @ \ s ] +@[^@\s.]+.[^@\s.]+$ 위의 regex는 표준 Perl 정규 표현 표준을 따르며 대부분의 프로그래밍 언어에 널리 적용됩니다.검증 스테이트먼트는 다음과 같습니다.< 공백과 "@" sign >@< 공백과 "@" sign >를 제외한 모든 것.<화이트 스페이스를 제외한 임의의 @ 기호와 도트>

보다 관련성이 높은 실장에 대해 한 걸음 더 깊이 이해하고 싶은 고객은 다음과 같은 검증 방법을 따를 수 있습니다.<이메일 로컬 파트>@<도메인명>

<이메일 로컬 파트> - "Universal Acceptance Steering Group" - UASG-026 의 가이드라인에 따릅니다.<도메인명> 의 경우는, 사용하는 프로그래밍 언어에 따라서, 표준 라이브러리를 사용해 임의의 도메인 검증 방법을 따를 수 있습니다.이 주제에 대한 최근 연구는 UASG-018A 문서를 참조하십시오.

Internationalized Email Solution 구현 중에 발생할 수 있는 프로세스, 과제 및 문제에 대해 알고 싶은 고객은 다음 RFC를 참조할 수도 있습니다.

RFC 6530(국제화 전자 메일의 개요와 프레임워크) RFC 6531(국제화 전자 메일의 SMTP 확장) RFC 6532(국제화 전자 메일 헤더) RFC 6533(국제화 전달 상태와 폐기 통지) RFC 6855(IMAP 지원 UTF-8856 RFC 6856)국제화 전자 메일메시지 전송 메시지 다운그레이드) RFC 6858(국제화 전자 메일의 간이 POP 및 IMAP 다운그레이드).

질문 제목은 상당히 일반적이지만 질문 본문은 PHP 기반 솔루션에 대한 것임을 나타냅니다.둘 다 해결하도록 노력하겠습니다.

일반적으로 모든 프로그래밍 언어에 대해:통상, 전자 메일 주소를 「레지엑스로 검증」하는 것은, 인터넷 베이스의 서비스 프로바이더라면, 일절 피해야 할 것입니다.도메인 이름이나 이메일 주소의 종류나 검증의 시도 등, 매우 다양해지기 때문에, 유효한 유저가 시스템에 들어갈 수 없게 되는 경우가 있습니다.이를 피하기 위해 사용자에게 전자 메일을 보내고 수신 여부를 확인하는 것이 가장 좋은 방법 중 하나입니다.Universal Acceptance Steering Group」의 담당자는, 국제화 도메인명과 국제화 전자 메일 주소의 검증에 관련하는 다양한 파라메타에 준거/부적합하고 있는 것으로 판명된 라이브러리의 언어별 리스트를 작성했습니다.여기와 여기 그 서류에 대한 링크를 찾아주세요.

특히 PHP에 대해 말하자면, PHP에는 사용할 수 있는 좋은 라이브러리가 1개 있습니다.Email Validator.DNS 검증과 같은 다양한 검증 방법을 포함하는 전자 메일 주소 검증기입니다.특별히 권장되는 검증자는 RFCValidator라고 불리며 여러 RFC에 대해 전자 메일주소를 검증합니다.IDN 및 국제화 이메일 주소를 포함하면 컴플라이언스도 양호합니다.

Python과 PHP의 실장에서는, 임의의 E-메일 주소를 올바르게 검증하고 있습니다.이 주소는, 메일 서버로부터 실제의 도메인으로 확인되고 있습니다.

GPL-3.0 lisence에 따라 출시됩니다.

여기 있습니다.

https://lja.fi/index.php/github-stuff/

--lja

메일의 유효성을 체크하는 기능을 준비했습니다.

function isValidEmail($email)
{
    $re = '/([\w\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)/m';
    preg_match_all($re, $email, $matches, PREG_SET_ORDER, 0);
    if(count($matches) > 0) return $matches[0][0] === $email;
    return false;
}

FILTER_VALIDATE_EMAIL유효하지 않은 이메일도 유효한 것으로 간주한다는 것입니다.

다음은 예를 제시하겠습니다.

if(isValidEmail("foo@gmail.com")) echo "valid";
if(!isValidEmail("fo^o@gmail.com")) echo "invalid";

언급URL : https://stackoverflow.com/questions/12026842/how-to-validate-an-email-address-in-php

반응형