이메일 주소에는 어떤 문자가 허용됩니까?


641

완전한 이메일 유효성 검사를 요구하지 않습니다.

전자 메일 주소의 문자 user-nameserver일부에 허용되는 문자를 알고 싶습니다 . 이메일 주소가 다른 형식을 취할 수 있지만 지나치게 신경 쓰지 않을 수도 있습니다. 이 간단한 형식 user-name@server(예 : wild.wezyr@best-server-ever.com)과 두 부분 모두에서 허용되는 문자 만 묻습니다 .


185
+허용됩니다. 내 웹 사이트에 이메일이 포함 +되어 있고 너무 많은 사이트에서 허용하지 않기 때문에 웹 사이트 에서 허용하지 않으면 문제가 발생합니다.
Dan Herbert

42
사양을 제대로 이해하려면 사양에 대한 링크를 제공하는 것이 중요하다고 생각합니다. 사양을 읽고 이해하기에 너무 게으른 경우 전자 메일 주소에서 허용되는 문자를 확인하십시오. 그 stuf를 걱정하는 사람들에게.
jhwist

9
동일한 자료를 다루는 이전 질문 : stackoverflow.com/questions/760150/ . 슬픈 것은, 그 질문이이 질문보다 거의 8 개월 더 오래되었지만, 더 오래된 질문은 훨씬 더 나은 답을 가지고 있다는 것입니다. 아래의 거의 모든 답변은 원래 게시되었을 때 이미 오래되었습니다. Wikipedia 항목을 참조하십시오 (걱정하지 마십시오 . 관련 공식 참조가 있습니다 ).
John Y

10
여러 답변과 달리 , 인용 된 경우 이메일 주소의 로컬 부분에 공백 허용됩니다. "hello world"@example.com유효합니다.
user253751

3
@LaraRuffleColes-Gmail의 경우 이메일 계정을 만들 때 "+"기호가 포함 된 주소를 만들 수 없습니다. "+"기호 ( "플러스 주소")를 사용하면 Gmail 주소를 가진 모든 사용자가 "+"기호와 "문자열"을 사용자 이름 끝에 추가하여 "대체"( "별칭") 전자 메일 주소를 만들 수 있습니다. 그들의 계정에 사용합니다. 예 : "example@gmail.com", "example+tag@gmail.com" 일반적으로 "기본"으로 사용하면 계정에 대한 별칭 전자 메일 주소를 만들어받는 전자 메일 메시지를 이론적으로 발신자가 필터링하여 필터링하고 필터링 할 수 있습니다.
Kevin Fegan

답변:


797

참조 RFC 5322 : 인터넷 메시지 형식을 조금 적게하고, RFC 5321 : 단순 메일 전송 프로토콜 .

RFC 822 는 또한 이메일 주소를 다루지 만 대부분 다음과 같은 구조를 처리합니다.

 addr-spec   =  local-part "@" domain        ; global address     
 local-part  =  word *("." word)             ; uninterpreted
                                             ; case-preserved

 domain      =  sub-domain *("." sub-domain)     
 sub-domain  =  domain-ref / domain-literal     
 domain-ref  =  atom                         ; symbolic reference

그리고 평소와 같이 Wikipedia에는 이메일 주소에 관한 기사가 있습니다 .

이메일 주소의 로컬 부분은 다음 ASCII 문자를 사용할 수 있습니다.

  • 대문자와 라틴 문자를 소문자 AZ하고 a을을 z;
  • 숫자 09;
  • 특수 문자 !#$%&'*+-/=?^_`{|}~;
  • .따옴표가없는 한 첫 번째 또는 마지막 문자가 아니며 따옴표 John..Doe@example.com가없는 한 연속적으로 나타나지 않는 경우 (예 : 허용되지 않지만 "John..Doe"@example.com허용됨) dot .
  • 공백과 "(),:;<>@[\]문자는 제한이 허용됩니다 (아래 단락에 설명 된대로 따옴표로 묶은 문자열 내에서만 허용되며 또한 백 슬래시 또는 큰 따옴표 앞에 백 슬래시가 와야합니다).
  • 주석은 로컬 부분의 양쪽 끝에 괄호와 함께 사용할 수 있습니다. 예를 들어, john.smith(comment)@example.com(comment)john.smith@example.com에 모두 동일합니다 john.smith@example.com.

ASCII 문자 외에도 2012 년 현재 RFC 6532 사양Wikipedia에 설명 된대로 UTF-8로 인코딩 된 위의 국제 문자를 사용할 수 있습니다 . 2019 년 기준으로 이러한 표준은 여전히 ​​제안으로 표시되어 있지만 천천히 출시되고 있습니다. 이 사양의 변화는 본질적으로 같은 허용 및 제한 특수 문자의 규칙에 영향을주지 않고 유효 숫자 (atext)와 같은 국제 문자를 추가 하고을 .U+007F!#@:

유효성 검증 은 정규식을 사용하여 이메일 주소 유효성 검증을 참조하십시오 .

domain부분은 정의 다음과 같이 :

프로토콜에 대한 인터넷 표준 (댓글에 대한 요청) 구성 요소 호스트 이름 라벨 만 ASCII 문자를 포함 할 수 있다는 것을 의무화 a를 통해을 z(대소 문자를 구분 방식으로) 숫자 0를 통해를 9, 그리고 하이픈 ( -). RFC 952 에서 호스트 이름의 원래 사양은 레이블이 숫자 나 하이픈으로 시작할 수 없으며 하이픈으로 끝나서는 안된다고 규정했습니다. 그러나 후속 스펙 ( RFC 1123 )은 호스트 이름 레이블을 숫자로 시작하도록 허용했습니다. 다른 기호, 문장 부호 또는 공백은 허용되지 않습니다.


15
@WildWzyr, 그렇게 간단하지 않습니다. 이메일 주소에는 허용되는 규칙이 많이 있습니다. 스펙을 모두 언급하는 것보다 스펙을 ​​참조하는 것이 더 간단합니다. 완전한 정규식을 원한다면 여기를 확인하여 왜 그렇게 간단하지 않은지 알 수 있습니다. regular-expressions.info/email.html
Dan Herbert

6
단순한 목록이 없습니다. 단순한 것을 원한다고해서 그렇게 될 수는 없습니다. 일부 문자는 특정 위치에만있을 수 있고 다른 위치에는있을 수 없습니다. 당신은 항상 당신이 원하는 것을 가질 수 없습니다.

15
@WildWezyr 글쎄, 완전 정지 문자는 로컬 부분에서 허용됩니다. 그러나 시작이나 끝이 아닙니다. 또는 또 다른 완전 정지와 함께. 따라서 대답은 허용되는 문자 목록만큼 간단 .ann..other.@example.com하지 않으며 해당 문자를 사용하는 방법에 대한 규칙이 있습니다 . 유효한 전자 메일 주소 ann.other@example.com는 아니지만 둘 다 동일한 문자를 사용하더라도 마찬가지입니다.
Mark Pim

14
또한 국제화 된 도메인 이름이 들어 오면 허용되는 문자 목록이 폭발합니다.
친 마이 칸치

50
국제화 된 주소로 인해 더 이상 유효한 답변이 아닙니다. Mason의 답변을 참조하십시오.
ZacharyP

329

조심해! 이 스레드에는 많은 지식 부패가 있습니다 (이전에는 사실 이었지만 지금은 그렇지 않습니다).

현재와 ​​미래의 세계 및 전세계 어디에서나 실제 전자 메일 주소의 오탐 (false positive) 거부를 방지하려면 최소한 RFC 3490 , "IDNA (Internationalizing Domain Names in Applications)"의 고급 개념을 알아야 합니다. 나는 미국과 A의 사람들이 종종 이것에 의존하지 않는다는 것을 알고 있지만, 이미 전 세계적 으로 널리 사용되고 있으며 (주로 영어가 아닌 부분).

요점은 이제 mason @ 日本 .com 및 wildwezyr@fahrvergnügen.net과 같은 주소를 사용할 수 있다는 것입니다. 아니요. 이것은 아직 많은 것들과 호환되지 않습니다 (많은 사람들이 위에서 애도했듯이 간단한 큐메일 스타일 + 신분 주소조차도 종종 잘못 거부됩니다). 그러나 RFC가 있고 사양이 있으며 이제는 IETF와 ICANN의 지원을 받고 있으며 더 중요한 것은 현재 서비스중인 이러한 개선을 지원하는 구현이 점점 더 많아지고 있다는 것입니다.

일본으로 돌아가서 hei @ や る .ca와 같은 이메일 주소와 다음과 같은 Amazon URL을보기 시작할 때까지이 개발에 대해 많이 알지 못했습니다.

http://www.amazon.co.jp/ 에레 크 토로 니크 스-데지 타르 카메라-포타 부로 오디오 / b / ref = topnav_storetab_e? ie = UTF8 & node = 3210981

사양에 대한 링크를 원하지 않지만 인터넷 포럼의 해커에 대한 오래된 지식에만 의존하는 경우 전자 메일 유효성 검사기는 영어를 사용하지 않는 사용자가 점점 더 많이 사용할 것으로 예상되는 전자 메일 주소를 거부하게됩니다. 이러한 사용자에게는 이러한 유효성 검사가 우리 모두가 싫어하는 평범한 뇌사 형태, + 또는 3 부분으로 된 도메인 이름을 처리 할 수없는 것과 같은 성가신 것입니다.

그래서 그것은 번거롭지 않다고 말하지는 않지만 "일부 / 어떤 / 아무 조건에서도 허용되는"문자의 전체 목록은 (거의) 모든 언어의 모든 문자입니다. "모든 유효한 전자 메일 주소를 수락하고 많은 전자 메일 주소를 수락하려면" 국제화 전자 메일 주소Punycode 먼저 변환 하지 않는 한 기본적으로 문자 기반 접근 방식을 쓸모 없게 만드는 것이 좋습니다 (죄송합니다). .

그런 다음 위의 조언을 대부분 따를 수 있습니다.


17
권리; 배후에서 도메인 이름은 여전히 ​​ASCII입니다. 그러나 웹 앱 또는 양식이 사용자가 입력 한 입력을 허용하는 경우 사용자가 IDN 호스트 이름을 입력 할 때 웹 브라우저 또는 메일 클라이언트가 수행하는 것과 동일한 작업을 수행해야합니다. 사용자 입력을 DNS 호환 양식으로 변환합니다. 그런 다음 확인하십시오. 그렇지 않으면이 국제화 된 전자 메일 주소가 유효성 검사를 통과하지 못합니다. (내가 링크 한 것과 같은 변환기는 제공된 비 ASCII 문자 만 수정하므로 국제화되지 않은 전자 메일 주소에서 사용하는 것이 안전합니다 (그들은 수정되지 않은 상태로 반환됩니다).
Mason

2
Javascript 개발자의 경우 이제이 작업을 수행하는 방법을 연구 중이며 Punycode.js 가 가장 완벽하고 세련된 솔루션 인 것 같습니다.
wwaawaw

5
국제화 이메일 (현재 정의 된대로) 퓨니 코드 또는 이와 유사한 것을 사용하여 비 ASCII 주소를 변환 하지 않고 대신 SMTP 프로토콜 자체의 많은 부분을 UTF8을 사용하도록 확장합니다.
IMSoP

2
내가 누락되었거나 질문에 대답하지 못합니까? 나는 '다른 대답이 잘못되어 더 많은 문자를 받아 들여야합니다.'를 읽었지만 어떤 추가 문자를 언급하지 못합니다. 또한 RFC에서 모든 유니 코드 코드 포인트를 의미하는지 아니면 BMP 만 의미하는지 (쉽게) 볼 수 없었습니다.
Samuel Harmer

3
이것은 정답이되는 올바른 길에있는 것 같습니다. 예약 및 허용 문자에 대한 세부 정보를 포함하면 훨씬 더 많은 표를 얻습니다.
Sean

59

이메일 주소 형식은 다음과 같습니다 local-part@domain-part(최대 64 @ 255 자, 더 이상 256 자 이하).

local-partdomain-part그것 이상의 규칙이 있기 때문에 허용되는 문자의 다른 세트를 가질 수 있지만,이 모두가 아니다.

일반적으로 로컬 부분은 다음 ASCII 문자를 가질 수 있습니다.

  • 소문자 라틴 문자 : abcdefghijklmnopqrstuvwxyz,
  • 대문자 라틴 문자 : ABCDEFGHIJKLMNOPQRSTUVWXYZ ,
  • 숫자 : 0123456789 ,
  • 특수 문자: !#$%&'*+-/=?^_`{|}~ ,
  • 점: . (첫 번째 또는 마지막 문자가 아니거나 인용하지 않는 한 반복되지 않음),
  • 다음과 같은 공백 구두점 : "(),:;<>@[\] (일부 제한 사항이 있음),
  • 의견 : ()(예 : 괄호 안에 허용 (comment)john.smith@example.com)

도메인 부분 :

  • 소문자 라틴 문자 : abcdefghijklmnopqrstuvwxyz,
  • 대문자 라틴 문자 : ABCDEFGHIJKLMNOPQRSTUVWXYZ ,
  • 숫자 : 0123456789 ,
  • 하이픈 : - (첫번째 또는 마지막 문자가 아님),
  • 대괄호로 묶인 IP 주소를 포함 할 수 있습니다 : jsmith@[192.168.2.1]또는 jsmith@[IPv6:2001:db8::1].

이 이메일 주소는 유효합니다 :

  • prettyandsimple@example.com
  • very.common@example.com
  • disposable.style.email.with+symbol@example.com
  • other.email-with-dash@example.com
  • x@example.com (한글자 로컬 부분)
  • "much.more unusual"@example.com
  • "very.unusual.@.unusual.com"@example.com
  • "very.(),:;<>[]\".VERY.\"very@\ \"very\".unusual"@strange.example.com
  • example-indeed@strange-example.com
  • admin@mailserver1 (최상위 도메인이없는 로컬 도메인 이름)
  • #!$%&'*+-/=?^_`{}|~@example.org
  • "()<>[]:,;@\\"!#$%&'-/=?^_`{}| ~.a"@example.org
  • " "@example.org (따옴표 사이의 공백)
  • example@localhost (localhost에서 보냄)
  • example@s.solutions( 인터넷 최상위 도메인 목록 참조 )
  • user@com
  • user@localserver
  • user@[IPv6:2001:db8::1]

그리고이 잘못된 예 :

  • Abc.example.com( @문자 없음 )
  • A@b@c@example.com( @따옴표 밖에 하나만 허용됨)
  • a"b(c)d,e:f;gi[j\k]l@example.com (이 지역 부분의 특수 문자는 따옴표 밖에 허용되지 않습니다)
  • just"not"right@example.com (따옴표로 묶은 문자열은 점으로 구분되거나 로컬 부분을 구성하는 유일한 요소 여야합니다)
  • this is"not\allowed@example.com (공백, 따옴표 및 백 슬래시는 따옴표로 묶인 문자열 내에 있고 백 슬래시가 앞에있을 때만 존재할 수 있습니다)
  • this\ still\"not\allowed@example.com (이스케이프 처리 된 경우에도 백 슬래시로 시작), 공백, 따옴표 및 백 슬래시는 여전히 따옴표로 묶어야합니다.
  • john..doe@example.com(앞에 이중 점 @); (주의 사항 : Gmail은 이것을 통해 가능합니다)
  • john.doe@example..com(뒤에 두 개의 점 @)
  • 선행 공백이있는 유효한 주소
  • 후행 공백이있는 유효한 주소

출처 : Wikipedia의 이메일 주소


이메일 확인을위한 Perl의 RFC2822 정규식 :

(?:(?:\r\n)?[ \t])*(?:(?:(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t]
)+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:
\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(
?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ 
\t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\0
31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\
](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+
(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:
(?:\r\n)?[ \t])*))*|(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z
|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)
?[ \t])*)*\<(?:(?:\r\n)?[ \t])*(?:@(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\
r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[
 \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)
?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t]
)*))*(?:,@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[
 \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*
)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t]
)+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*)
*:(?:(?:\r\n)?[ \t])*)?(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+
|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r
\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:
\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t
]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031
]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](
?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?
:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?
:\r\n)?[ \t])*))*\>(?:(?:\r\n)?[ \t])*)|(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?
:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?
[ \t]))*"(?:(?:\r\n)?[ \t])*)*:(?:(?:\r\n)?[ \t])*(?:(?:(?:[^()<>@,;:\\".\[\] 
\000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|
\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>
@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"
(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t]
)*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\
".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?
:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[
\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*|(?:[^()<>@,;:\\".\[\] \000-
\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(
?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)*\<(?:(?:\r\n)?[ \t])*(?:@(?:[^()<>@,;
:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([
^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\"
.\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\
]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*(?:,@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\
[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\
r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] 
\000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]
|\\.)*\](?:(?:\r\n)?[ \t])*))*)*:(?:(?:\r\n)?[ \t])*)?(?:[^()<>@,;:\\".\[\] \0
00-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\
.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,
;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?
:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*
(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".
\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[
^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]
]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*\>(?:(?:\r\n)?[ \t])*)(?:,\s*(
?:(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\
".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(
?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[
\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t
])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t
])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?
:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|
\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*|(?:
[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\
]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)*\<(?:(?:\r\n)
?[ \t])*(?:@(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["
()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)
?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>
@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*(?:,@(?:(?:\r\n)?[
 \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,
;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t]
)*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\
".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*)*:(?:(?:\r\n)?[ \t])*)?
(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".
\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:
\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\[
"()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])
*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])
+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\
.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z
|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*\>(?:(
?:\r\n)?[ \t])*))*)?;\s*)

RFC2822 주소에 대한 전체 정규식은 3.7k에 불과했습니다.

PHP의 RFC 822 Email Address Parser 도 참조하십시오 .


이메일 주소의 공식적인 정의는 다음과 같습니다.

  • RFC 5322 (섹션 3.2.3 및 3.4.1, 폐기 RFC 2822), RFC 5321, RFC 3696,
  • RFC 6531 (허용되는 문자).

관련 :


5
이 정규식의 구현자가해야 할 추가주의 사항은 다음과 같습니다. 형식이 다음 something@something.something과 같은지 확인 하고 하루에 호출하십시오.
Chris Sobolewski

이와 같은 것을 유지 관리 할 수는 없지만 디코딩하고 실제로 수행하는 작업을 알아내는 것이
좋습니다.

@ChrisSobolewski는 '@'의 양쪽에 여러 가지를 허용합니다
Jasen

나는 check_recipient_access 제한에 따라 pcre access table을 통해 postfix에서 이것을 구현하려고 시도했다. 먼저 링크 된 페이지에서 3 개의 긴 pcres를 각각 한 줄로 바꾸고 토핑과 테일링을 수행한다 : /^[...pcre ..] $ / DUNNO, 마지막 줄 /.*/ REJECT를 추가하지만 여전히 유효하지 않은 이메일 주소를 허용합니다. 접미사 3.3.0; perl 5, 버전 26, 하위 버전 1 (v5.26.1).
scoobydoo

3
광기. 누가 생산에 그것을 사용하겠습니까. 정규식을 더 이상 사용하지 않아야하는 시점이 있습니다. 그것은 그 시점을 훨씬 넘어선 것입니다.
tomuxmon 2018 년

22

Wikipedia는 이것에 관한 좋은 기사를 가지고 있으며 , 공식 사양은 여기에 있습니다 . Wikipdia에서 :

전자 우편 주소의 로컬 부분은 다음 ASCII 문자를 사용할 수 있습니다.

  • 대문자와 소문자 영문 (az, AZ)
  • 숫자 0 ~ 9
  • 캐릭터! # $ % & '* +-/ =? ^ _`{| } ~
  • 캐릭터 . (도트, 마침표, 마침표)는 첫 번째 또는 마지막 문자가 아니며 연속적으로 두 번 이상 나타나지 않는 경우 제공됩니다.

또한 따옴표로 묶은 문자열 (예 : "John Doe"@ example.com)이 허용되므로 달리 금지 된 문자는 허용되지만 일반적인 관례에는 나타나지 않습니다. RFC 5321은 또한 "메일을받을 것으로 예상되는 호스트는 로컬 부분이 인용 문자열 형식을 요구하는 (또는 사용하는) 사서함을 정의하지 않아야한다"고 경고합니다.


@WildWezyr 유효한 호스트 이름. IP 주소, FQN 또는 로컬 네트워크 호스트로 확인할 수있는 이름 일 수 있습니다.
JensenDied

인용구는 관문을 통과하는 데 필수적이었습니다. Banyan Vines를 기억하십니까?
mckenzm

13

구글은 그들의 gmail.com 주소로 흥미로운 일을한다. gmail.com 주소는 문자 (az), 숫자 및 마침표 (무시) ​​만 허용합니다.

예를 들어 pikachu@gmail.com은 pi.kachu@gmail.com과 동일하며 두 전자 메일 주소가 모두 같은 사서함으로 전송됩니다. PIKACHU@gmail.com도 동일한 사서함으로 배달됩니다.

따라서 질문에 대답하기 위해 때로는 구현하려는 RFC 표준의 양에 따라 구현 자에 따라 다릅니다. Google의 gmail.com 주소 스타일은 표준과 호환됩니다. 다른 사람들이 비슷한 이메일 주소를 사용하는 경우 혼동을 피하기 위해 그렇게합니다.

*** gmail.com accepting rules ***
d.oy.smith@gmail.com   (accepted)
d_oy_smith@gmail.com   (bounce and account can never be created)
doysmith@gmail.com     (accepted)
D.Oy'Smith@gmail.com   (bounce and account can never be created)

Wikipedia 링크는 일반적으로 허용되는 이메일 주소에 대한 좋은 참조입니다. http://en.wikipedia.org/wiki/Email_address


2
그러나 이것은 Gmail에서 이메일을 만들 수없는 이유에 대한 훌륭한 답변입니다. 그러나 {john'doe}@my.server문제없이 이메일을 보내고받을 수 있습니다 . hMail 서버에서도 테스트되었습니다.
Piotr Kula

당신은 이메일을 보내서 당신의 클라이언트를 테스트 할 수 있습니다 {piotr'kula}@kula.solutions-그것이 작동하면 당신은 좋은 자동 회신 양식을 얻을 것입니다. 그렇지 않으면 아무 일도 일어나지 않습니다.
Piotr Kula

3
Gmail은 RFC에 따라 허용되는 모든 이메일 주소가 유효하다는 의미에서 RFC 6530을 따릅니다. Gmail은 추가 규칙을 사용하여 허용 가능한 주소 집합을 추가로 제한하고 로컬 부분에 점이있는 유사한 주소를 만들거나 선택적으로 "+"와 영숫자로 동의어를 선택합니다.
Teemu Leisti

Google은 계정 생성 기준을 제한합니다. 메일이 적절한 계정으로 라우팅 될 수 있도록 추가 "구장"및 후행과 앞에 추가 된 별칭 문자열 부호의 수신 이메일 계정 문자열을 삭제한다고 생각합니다. 쉬워요. 그렇게하면 사람들이 효과적으로 이메일 주소를 만들 수 없어서 유효한 주소가 단순하고 가장 복잡한 유효성 검사를 통과 할 수 있습니다.
BradChesney79

그것은 단지 Gmail이 아닙니다. 일부 공급자는 인용 부호가있는 특정 문자열을 거부하는 "릴레이 필터"를 가지고 있으며, 특히 "="를 구분자로 사용합니다. 이는 사용자가 비공개 인용 문자열에 게이트웨이 및 중첩 스팸 주소를 설정하지 못하도록합니다. "@"는 유효하지만 "= @ ="는 유효하지 않습니다.
mckenzm

12

wikipedia article 에서 시작할 수 있습니다 .

  • 대문자와 소문자 영문 (az, AZ)
  • 숫자 0 ~ 9
  • 캐릭터! # $ % & '* +-/ =? ^ _`{| } ~
  • 캐릭터 . (도트, 마침표, 마침표)는 첫 번째 또는 마지막 문자가 아니며 연속적으로 두 번 이상 나타나지 않는 경우 제공됩니다.

11

이름:

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!#$%&'*+-/=?^_`{|}~.

섬기는 사람:

abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-.

4
무엇에 대한 <>그리고 []? 예 : "()<>[]:,;@\\\"!#$%&'-/=?^_{} | ~ .a "@ example.org`?
kenorb

20
출처를 인용하십시오. 출처가 없으면 추측처럼 보입니다 .
Mathieu K.

15
이것은 오래되었으며 정확하지 않을 수 있습니다.
Jason Harrison

9

@ 및를 확인하십시오. 확인을 위해 이메일을 보냅니다.

누군가 이메일 확인을 망쳤거나 새 주소가 유효하기 때문에 인터넷 사이트의 20 %에서 내 .name 이메일 주소를 계속 사용할 수 없습니다.


9
조차. 꼭 필요한 것은 아닙니다. 최상위 도메인 (특히 ua)에서 하나 이상의 이메일 주소 사례에 대해 들었습니다. 주소는 <name> @ua였습니다-점이 없습니다!

이것은 거의 모든 것이 허용되고 무언가가 허용되지 않으면 수신자의 서버가 알려줄 것이기 때문에 검증을 망치지 않는 가장 쉬운 방법입니다.
Avamander

5

짧은 대답은 두 가지 답변이 있다는 것입니다. 해야 할 일에 대한 하나의 표준이 있습니다. 즉 현명하고 문제를 예방할 수있는 행동입니다. 문제를 일으키지 않고 수용해야 할 행동에 대한 또 다른 표준이 있습니다. 이 이중성은 전자 메일을 보내고받는 데 효과적이지만 수명이 길다.

당신이 만든 주소에 대한 좋은 가이드; 참조 : http://www.remote.org/jochen/mail/info/chars.html

유효한 이메일을 필터링하려면 다음 단계를 볼 수있을만한 모든 것을 전달하십시오. 또는 많은 RFC를 읽기 시작하십시오. 여기서는 용입니다.


연결이 끊어졌습니다. 어떤 내용이 있었습니까?
ygoe

5

문제 에 대한 좋은 읽을 거리 .

발췌 :

These are all valid email addresses!

"Abc\@def"@example.com
"Fred Bloggs"@example.com
"Joe\\Blow"@example.com
"Abc@def"@example.com
customer/department=shipping@example.com
\$A12345@example.com
!def!xyz%abc@example.com
_somename@example.com

1
도메인 부분 앞의 '@'에 대해 궁금했습니다. 사용할 수 있습니까?
Saiyaff Farouk

사양에 따라 @SaiyaffFarouk, 예. 그러나 대부분의 메일 제공 업체는 자체 검증의 일부로이를 허용하지 않을 수 있습니다.
Luke Madhanga

그 블로그는 Joe.\\Blow@example.com따옴표없이 나열 합니다. 이것이 실제로 유효합니까? 여기에 대답이 명확하지 않은 것처럼 보이지만 백 슬래시가 포함 된 DNS SoA rname 전자 메일 문자열의 경우 (매우 드문 경우)를 보았 기 때문에 묻습니다.
wesinat0r

5

허용 된 답변은 이메일 주소의 유효한 로컬 부분을 논의 할 때 Wikipedia 기사를 참조하지만 Wikipedia는 이에 대한 권한이 없습니다.

IETF RFC 3696 은이 문제에 대한 권한 이며 섹션 3 에서 참조해야합니다 . 5 페이지의 이메일 주소 제한 :

최신 전자 메일 주소는 "도메인 부분"(완전한 도메인 이름)과 at 기호 ( "@")로 구분 된 "로컬 부분"으로 구성됩니다. 도메인 부분의 구문은 이전 섹션의 구문에 해당합니다. 필터링 및 이름 목록에 대해 해당 섹션에서 식별 된 문제는 전자 메일 컨텍스트에 사용 된 도메인 이름에도 적용됩니다. 도메인 이름은 대괄호 안에있는 IP 주소로 바꿀 수도 있지만 테스트 및 문제 해결 목적을 제외하고는 해당 형식을 사용하지 않는 것이 좋습니다.

로컬 부분은 아래 설명 된 인용 규칙을 사용하여 나타날 수 있습니다. 인용 된 양식은 실제로 거의 사용되지 않지만 일부 합법적 인 목적에는 필요합니다. 따라서 필터링 루틴에서 거부하지 말고 대신 대상 호스트의 평가를 위해 전자 메일 시스템으로 전달해야합니다.

정확한 규칙은 제어 문자를 포함한 모든 ASCII 문자가 인용 부호로 표시되거나 인용 문자열로 표시 될 수 있다는 것입니다. 인용이 필요한 경우, 백 슬래시 문자는 다음 문자를 인용하는 데 사용됩니다. 예를 들어

  Abc\@def@example.com

유효한 이메일 주소 형식입니다. 다음과 같이 빈 공간이 나타날 수도 있습니다.

  Fred\ Bloggs@example.com

백 슬래시 문자는 예를 들어

  Joe.\\Blow@example.com

백 슬래시 문자를 사용한 따옴표 외에도 기존의 큰 따옴표 문자를 사용하여 문자열을 둘러 쌀 수 있습니다. 예를 들어

  "Abc@def"@example.com

  "Fred Bloggs"@example.com

위의 첫 두 예제의 대체 형식입니다. 인용 된 이러한 양식은 거의 권장되지 않으며 실제로는 드물지만 위에서 설명한 것처럼 전자 메일 주소를 처리하는 응용 프로그램에서 지원해야합니다. 특히, 인용 된 형태는 종종 다른 시스템 및 상황으로부터의 전이와 관련된 주소의 상황에서 나타난다; 이러한 전이 요구 사항은 여전히 ​​발생하며 사용자가 제공 한 전자 메일 주소를 수락하는 시스템은 해당 주소가 레거시 시스템과 연결되어 있는지 여부를 "알 수"없으므로 주소 양식을 수락하여 전자 메일 환경으로 전달해야합니다.

따옴표가 없으면 로컬 부분은
알파벳 문자, 숫자 또는 특수 문자의 조합으로 구성 될 수 있습니다

  ! # $ % & ' * + - / = ?  ^ _ ` . { | } ~

마침표 ( ".")도 나타날 수 있지만 로컬 부분을 시작하거나 종료하는 데 사용되지 않거나 연속 된 두 개 이상의 마침표가 표시되지 않을 수 있습니다. 다르게 말하면, 부호 ( "@"), 백 슬래시, 큰 따옴표, 쉼표 또는 대괄호 이외의 ASCII 그래픽 (인쇄) 문자는 인용없이 나타날 수 있습니다. 제외 된 문자 목록이 나타나면 인용해야합니다. 와 같은 형태

  user+mailbox@example.com

  customer/department=shipping@example.com

  $A12345@example.com

  !def!xyz%abc@example.com

  _somename@example.com

유효하고 상당히 규칙적으로 표시되지만 위에 나열된 모든 문자는 허용됩니다.

다른 사람들처럼 전자 메일 주소의 유효성을 검사하기 위해 PHP와 JavaScript 모두에서 작동하는 정규식을 제출합니다.

/^[a-z0-9!'#$%&*+\/=?^_`{|}~-]+(?:\.[a-z0-9!'#$%&*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-zA-Z]{2,}$/i

3

이 Wikipedia 링크 에서 찾을 수 있듯이

이메일 주소의 로컬 부분은 다음 ASCII 문자를 사용할 수 있습니다.

  • 대문자와 라틴 문자를 소문자 AZ하고 a을을 z;

  • 숫자 09;

  • 특수 문자 !#$%&'*+-/=?^_`{|}~;

  • .따옴표가없는 한 첫 번째 또는 마지막 문자가 아니며 따옴표 John..Doe@example.com가없는 한 연속적으로 나타나지 않는 경우 (예 : 허용되지 않지만 "John..Doe"@example.com허용됨) dot .

  • 공백과 "(),:;<>@[\]문자는 제한이 허용됩니다 (아래 단락에 설명 된대로 따옴표로 묶은 문자열 내에서만 허용되며 또한 백 슬래시 또는 큰 따옴표 앞에 백 슬래시가 와야합니다).

  • 주석은 로컬 부분의 양쪽 끝에 괄호와 함께 사용할 수 있습니다. 예를 들어, john.smith(comment)@example.com(comment)john.smith@example.com에 모두 동일합니다 john.smith@example.com.

위의 ASCII 문자 외에도 UTF-8로 인코딩 된 U + 007F 이상의 국제 문자는 RFC 6531 에서 허용 되지만 메일 시스템은 로컬 파트를 지정할 때 사용할 문자를 제한 할 수 있습니다.

따옴표로 묶인 문자열은 local-part 내에서 점으로 구분 된 엔터티로 존재하거나 가장 바깥 쪽 따옴표가 local-part의 가장 바깥 쪽 문자 인 경우에 존재할 수 있습니다 (예 : abc."defghi".xyz@example.com 또는 "abcdefghixyz"@example.com허용. 반대로, abc"defghi"xyz@example.com아니거나 abc\"def\"ghi@example.com). 그러나 인용 된 문자열과 문자는 일반적으로 사용되지 않습니다. RFC 5321 은 또한 "메일을받을 것으로 예상되는 호스트는 로컬 부분이 인용 문자열 형식을 요구하는 (또는 사용하는) 사서함을 정의하지 않아야 한다"고 경고합니다.

로컬 부분 postmaster은 대소 문자를 구분하지 않으므로 특별히 취급되며 도메인 전자 메일 관리자에게 전달해야합니다. 기술적 다른 로컬 파트는 대소 문자를 구분하므로 jsmith@example.comJSmith@example.com다른 사서함 지정; 그러나 많은 조직에서 대문자와 소문자를 동일하게 취급합니다.

기술적으로 유효한 광범위한 특수 문자에도 불구하고; 실제로 조직, 메일 서비스, 메일 서버 및 메일 클라이언트가 모든 것을 허용하지는 않습니다. 예를 들어 Windows Live Hotmail은 영숫자, 점 ( .), 밑줄 ( _) 및 하이픈 ( -)을 사용하여 전자 메일 주소 만 만들 수 있습니다 . 일반적인 조언은 이메일이 거부 될 위험을 피하기 위해 일부 특수 문자를 사용하지 않는 것입니다.


0

답은 (거의) ALL(7 비트 ASCII)입니다.
포함 규칙이 "... 일부 / 어떤 / 아무 조건에서도 허용되는 경우 ..."

RFC 5322 의 "도메인 텍스트"부분에서 허용되는 텍스트에 대한 몇 가지 가능한 포함 규칙 중 하나를 17 페이지 상단에서 살펴보면 다음과 같습니다.

dtext          =   %d33-90 /          ; Printable US-ASCII
                   %d94-126 /         ;  characters not including
                   obs-dtext          ;  "[", "]", or "\"

이 설명에서 누락 된 문자 3 개는 domain-literal []에서 따옴표 쌍 \과 공백 문자 (% d32) 를 형성하는 데 사용됩니다 . 이를 통해 32-126 (10 진수)의 전체 범위가 사용됩니다. 비슷한 요구 사항이 "qtext"및 "ctext"로 나타납니다. 많은 제어 문자도 허용 / 사용됩니다. 이러한 제어 문자 목록 중 하나 는 RFC 5322의 31 페이지 섹션 4.1에 obs-NO-WS-CTL로 나타납니다 .

obs-NO-WS-CTL  =   %d1-8 /            ; US-ASCII control
                   %d11 /             ;  characters that do not
                   %d12 /             ;  include the carriage
                   %d14-31 /          ;  return, line feed, and
                   %d127              ;  white space characters

이 모든 제어 문자는 섹션 3.5의 시작 부분에 명시된대로 허용됩니다.

.... MAY be used, the use of US-ASCII control characters (values
     1 through 8, 11, 12, and 14 through 31) is discouraged ....

따라서 이러한 포함 규칙은 "너무 넓습니다". 또는 다른 의미에서 예상 규칙은 "너무 단순합니다".


0

간단히하기 위해 유효성 검사 전에 큰 따옴표 안의 모든 텍스트와 큰 따옴표로 묶은 관련 텍스트를 제거하여 허용되지 않는 내용에 따라 전자 메일 주소 제출에 kibosh를 배치하여 제출을 삭제합니다. 누군가 John을 가질 수 있다고해서 ". * $ hizzle * Bizzle".. Doe@whatever.com 주소가 시스템에서 허용해야한다는 의미는 아닙니다. 우리는 미래에 살고 있으며 엉덩이를 닦는 데 좋은 일을하는 것보다 무료 이메일 주소를 얻는 데 시간이 덜 걸릴 수 있습니다. 그리고 이메일 기준이 입력과 허용 안함을 나타내는 입력 바로 옆에 표시되지 않는 것처럼 보이지 않습니다.

또한 인용 된 자료를 제거한 후 다양한 RFC에서 허용되지 않는 내용을 삭제합니다. 특별히 허용되지 않는 문자 및 패턴 목록은 테스트하기에 훨씬 짧은 목록 인 것 같습니다.

허용되지 않음 :

    local part starts with a period ( .account@host.com )
    local part ends with a period   ( account.@host.com )
    two or more periods in series   ( lots..of...dots@host.com )
    &’`*|/                          ( some&thing`bad@host.com )
    more than one @                 ( which@one@host.com )
    :%                              ( mo:characters%mo:problems@host.com )

주어진 예에서 :

John.."The*$hizzle*Bizzle"..Doe@whatever.com --> John..Doe@whatever.com

John..Doe@whatever.com --> John.Doe@whatever.com

이메일 주소를 추가하거나 변경하려고 할 때 확인 결과 이메일 메시지를 남은 결과로 전송하면 제출 된 이메일 주소를 코드에서 처리 할 수 ​​있는지 확인할 수 있습니다. 필요에 따라 여러 번 소독 한 후 전자 메일이 유효성 검사를 통과하면 해당 확인을 해제합니다. 요청이 확인 링크에서 돌아 오면 새 이메일을 보류 중 임시 상태 또는 스토리지에서 이동하여 실제 Bonafide 일류 저장 이메일이 될 수 있습니다.

사려 깊다면 이메일 주소 변경 실패 또는 성공 알림을 이전 이메일 주소로 보낼 수 있습니다. 확인되지 않은 계정 설정은 합당한 시간이 지나면 실패한 시도로 시스템에서 벗어날 수 있습니다.

시스템에 악취가 나는 이메일을 허용하지 않습니다. 아마도 돈을 버리는 것일 수도 있습니다. 그러나 시간의 99.9 %가 사람들이 옳은 일을하고 엣지 케이스 호환성 시나리오를 활용하는 벼랑에 적합성 제한을 두지 않는 이메일을 가지고 있습니다. 정규식 DDoS에주의하십시오. 이곳에서 문제가 발생할 수 있습니다. 그리고 이것은 내가하는 세 번째 일과 관련이 있습니다. 나는 하나의 전자 메일을 기꺼이 처리 할 시간을 제한했습니다. 유효성 검사를 위해 컴퓨터 속도를 늦춰야하는 경우 들어오는 데이터 API 엔드 포인트 논리를 벗어나지 않습니다.

편집 :이 대답은 "나쁜"것에 대한 찌그러지고 계속받을 가치가 있습니다. 어쩌면 그것은 여전히 ​​나쁘지 않을 수도 있습니다.


2
나는 이것이 의견이기 때문에이 대답은 하향식이며 실제로 질문에 대답하지 않습니다. 또한 자동으로 이메일 주소를 확인한 사용자는 절대로 이메일을받지 않습니다. 이메일 주소가 허용되지 않는다는 것을 알리는 것이 좋습니다.
vcarel

2
여기에 아이디어가 너무 많기 때문에 다운 보트가 의심됩니다. 허용되지 않는 목록은 유용한 단위 테스트이지만 허용되는 항목이 앞에 나와야합니다. 프로그래밍 방식은 비교적 괜찮은 것처럼 보이지만, 작업중인 사양 등을 나열한 후에 더 적합 할 것입니다. 섹션과 간단한 복사 편집이 도움이 될 것입니다. 내 2 센트 만.
HoldOffHunger

@vcarel-아, 물론입니다. 프런트 엔드 사용자 측 유효성 검사는 어떤 규칙 (툴팁에서 사용 가능)이 위반했는지 알려줍니다. 당신 말이 맞아요. 그것은 전반적인 의견입니다. 그러나 위의 질문은 X에게 Y 질문을 확실히 요구하는 사람으로부터 온 것입니다. 이것은 지침이며 작동합니다 ... 작동 할뿐만 아니라 잘 작동합니다. 나는 내가 결정을 내릴 시스템에서 헛소리 이메일 주소를 허용하지 않습니다.
BradChesney79

@HoldOffHunger 전반적인 아이디어가 가능한 한 일관성있게 표현되지 않았 음을 알 수 있습니다. 다른 날에는 더 잘 표현할 수있는 시간이 더있을 수 있습니다. 통찰력에 감사드립니다.
BradChesney79

-1

내 PHP에서는이 검사를 사용합니다.

<?php
if (preg_match(
'/^(?:[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+\.)*[\w\!\#\$\%\&\'\*\+\-\/\=\?\^\`\{\|\}\~]+@(?:(?:(?:[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!\.)){0,61}[a-zA-Z0-9_-]?\.)+[a-zA-Z0-9_](?:[a-zA-Z0-9_\-](?!$)){0,61}[a-zA-Z0-9_]?)|(?:\[(?:(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(?:[01]?\d{1,2}|2[0-4]\d|25[0-5])\]))$/',
"tim'qqq@gmail.com"        
)){
    echo "legit email";
} else {
    echo "NOT legit email";
}
?>

직접 해보십시오 http://phpfiddle.org/main/code/9av6-d10r


-1

RFC 지침에 따라이 정규식을 만들었습니다.

^[\\w\\.\\!_\\%#\\$\\&\\'=\\?\\*\\+\\-\\/\\^\\`\\{\\|\\}\\~]+@(?:\\w+\\.(?:\\w+\\-?)*)+$

1
이 버전은 도메인 / 하위 도메인의 길이를 확인하여 정규식을 향상시킵니다. 즐겨! ^ [\\ w \\. \\! _ \\ % # \\ $ \\ & \\ '= \\? \ * \\ + \\-\\ / \\ ^ \`\\ {\\ | \\} \\ ~] + @ (? : [\\ w] (? : [\\ w \\-] {0,61} [\\ w])? (? : \\. [\\ w] (? : [\\ w \\-] {0,61} [\\ w])?) *) $
Mau

-2

Gmail은 특수 문자 및 경우에 따라 (.) + 기호 만 허용하지만 다른 특수 문자는 Gmail에서 허용되지 않습니다. RFC에 따르면 특수 문자를 사용할 수 있지만 특수 문자를 사용하여 Gmail로 메일을 보내지 말아야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.