seawolf2357 commited on
Commit
2ab666f
Β·
verified Β·
1 Parent(s): 800e08b

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +87 -17
app.py CHANGED
@@ -2,23 +2,80 @@ import gradio as gr
2
  import re
3
  import dns.resolver
4
  from typing import Tuple
 
5
 
6
  def check_syntax(mail_address: str) -> Tuple[bool, str]:
7
  """이메일 μ£Όμ†Œ ꡬ문 검사"""
8
- # 더 μ •ν™•ν•œ 이메일 μ •κ·œμ‹ νŒ¨ν„΄
9
  pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
10
- match = re.match(pattern, mail_address)
11
- if match:
12
- return True, "βœ… 이메일 μ£Όμ†Œ ν˜•μ‹μ΄ μ˜¬λ°”λ¦…λ‹ˆλ‹€."
13
- return False, "❌ 이메일 μ£Όμ†Œ ν˜•μ‹μ΄ μ˜¬λ°”λ₯΄μ§€ μ•ŠμŠ΅λ‹ˆλ‹€."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
14
 
15
  def check_dns(domain: str) -> Tuple[bool, str]:
16
  """DNS MX λ ˆμ½”λ“œ 검사"""
17
  try:
18
- records = dns.resolver.resolve(domain, 'MX') # query λŒ€μ‹  resolve μ‚¬μš©
19
- if records:
20
- return True, "βœ… λ„λ©”μΈμ˜ 메일 μ„œλ²„κ°€ μ‘΄μž¬ν•©λ‹ˆλ‹€."
21
- return False, "❌ λ„λ©”μΈμ˜ 메일 μ„œλ²„λ₯Ό 찾을 수 μ—†μŠ΅λ‹ˆλ‹€."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
22
  except Exception as e:
23
  return False, f"❌ DNS 확인 쀑 였λ₯˜ λ°œμƒ: {str(e)}"
24
 
@@ -26,13 +83,21 @@ def validate_email(mail_address: str) -> str:
26
  """이메일 μ£Όμ†Œ μ’…ν•© 검증"""
27
  results = []
28
 
29
- # 1. ꡬ문 검사
 
 
 
 
 
 
 
 
30
  syntax_valid, syntax_msg = check_syntax(mail_address)
31
  results.append(syntax_msg)
32
  if not syntax_valid:
33
  return "\n".join(results)
34
 
35
- # 2. 도메인 μΆ”μΆœ 및 DNS 검사
36
  try:
37
  domain = mail_address.split('@')[1]
38
  dns_valid, dns_msg = check_dns(domain)
@@ -40,7 +105,7 @@ def validate_email(mail_address: str) -> str:
40
  if not dns_valid:
41
  return "\n".join(results)
42
 
43
- # 검증 성곡
44
  results.append("βœ… 이메일 μ£Όμ†Œκ°€ μœ νš¨ν•©λ‹ˆλ‹€.")
45
 
46
  except Exception as e:
@@ -59,16 +124,21 @@ iface = gr.Interface(
59
  title="이메일 μ£Όμ†Œ 검증 도ꡬ",
60
  description="""
61
  이 λ„κ΅¬λŠ” λ‹€μŒ 사항듀을 κ²€μ¦ν•©λ‹ˆλ‹€:
62
- 1. 이메일 μ£Όμ†Œ ν˜•μ‹ 검사
63
  2. λ„λ©”μΈμ˜ 메일 μ„œλ²„(MX λ ˆμ½”λ“œ) 쑴재 μ—¬λΆ€ 확인
 
 
64
  """,
65
  examples=[
66
- ["test@gmail.com"],
67
- ["user@yahoo.com"],
68
  ["invalid@nonexistent.domain"],
69
- ["malformed@@email.com"]
 
 
 
70
  ],
71
- theme=gr.themes.Soft() # λΆ€λ“œλŸ¬μš΄ ν…Œλ§ˆ 적용
72
  )
73
 
74
  # μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹€ν–‰
 
2
  import re
3
  import dns.resolver
4
  from typing import Tuple
5
+ from dns.exception import DNSException
6
 
7
  def check_syntax(mail_address: str) -> Tuple[bool, str]:
8
  """이메일 μ£Όμ†Œ ꡬ문 검사"""
9
+ # RFC 5322 ν‘œμ€€μ„ 기반으둜 ν•œ 더 μ—„κ²©ν•œ 이메일 μ •κ·œμ‹ νŒ¨ν„΄
10
  pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$'
11
+
12
+ # κΈ°λ³Έ νŒ¨ν„΄ 검사
13
+ if not re.match(pattern, mail_address):
14
+ return False, "❌ 이메일 μ£Όμ†Œ ν˜•μ‹μ΄ μ˜¬λ°”λ₯΄μ§€ μ•ŠμŠ΅λ‹ˆλ‹€."
15
+
16
+ # μΆ”κ°€ μœ νš¨μ„± 검사
17
+ local_part, domain = mail_address.split('@')
18
+
19
+ # 둜컬 파트 검사
20
+ if len(local_part) > 64:
21
+ return False, "❌ 이메일 μ£Όμ†Œμ˜ @ μ•žλΆ€λΆ„μ΄ λ„ˆλ¬΄ κΉλ‹ˆλ‹€."
22
+ if local_part.startswith('.') or local_part.endswith('.'):
23
+ return False, "❌ 이메일 μ£Όμ†Œμ˜ @ μ•žλΆ€λΆ„μ΄ 점(.)으둜 μ‹œμž‘ν•˜κ±°λ‚˜ 끝날 수 μ—†μŠ΅λ‹ˆλ‹€."
24
+ if '..' in local_part:
25
+ return False, "❌ 이메일 μ£Όμ†Œμ˜ @ μ•žλΆ€λΆ„μ— μ—°μ†λœ 점(..)이 μžˆμ„ 수 μ—†μŠ΅λ‹ˆλ‹€."
26
+
27
+ # 도메인 파트 검사
28
+ if len(domain) > 255:
29
+ return False, "❌ 도메인이 λ„ˆλ¬΄ κΉλ‹ˆλ‹€."
30
+ if domain.startswith('-') or domain.endswith('-'):
31
+ return False, "❌ 도메인은 ν•˜μ΄ν”ˆ(-)으둜 μ‹œμž‘ν•˜κ±°λ‚˜ 끝날 수 μ—†μŠ΅λ‹ˆλ‹€."
32
+ if not all(part.isalnum() or '-' in part for part in domain.split('.')):
33
+ return False, "❌ 도메인에 ν—ˆμš©λ˜μ§€ μ•ŠλŠ” λ¬Έμžκ°€ ν¬ν•¨λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€."
34
+
35
+ return True, "βœ… 이메일 μ£Όμ†Œ ν˜•μ‹μ΄ μ˜¬λ°”λ¦…λ‹ˆλ‹€."
36
+
37
+ def is_disposable_domain(domain: str) -> bool:
38
+ """μž„μ‹œ 이메일 도메인 체크"""
39
+ disposable_domains = {
40
+ 'tempmail.com', 'throwawaymail.com', 'mailinator.com',
41
+ 'temp-mail.org', 'fake-email.com', 'temporary-mail.net'
42
+ }
43
+ return domain.lower() in disposable_domains
44
 
45
  def check_dns(domain: str) -> Tuple[bool, str]:
46
  """DNS MX λ ˆμ½”λ“œ 검사"""
47
  try:
48
+ # μž„μ‹œ 이메일 도메인 체크
49
+ if is_disposable_domain(domain):
50
+ return False, "❌ μž„μ‹œ 이메일 도메인은 μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€."
51
+
52
+ # DNS MX λ ˆμ½”λ“œ 확인
53
+ records = dns.resolver.resolve(domain, 'MX')
54
+ if not records:
55
+ return False, "❌ λ„λ©”μΈμ˜ 메일 μ„œλ²„λ₯Ό 찾을 수 μ—†μŠ΅λ‹ˆλ‹€."
56
+
57
+ # μ‹€μ œ MX λ ˆμ½”λ“œ λ‚΄μš© 확인
58
+ mx_records = [str(r.exchange).rstrip('.') for r in records]
59
+ if not mx_records:
60
+ return False, "❌ μœ νš¨ν•œ 메일 μ„œλ²„ 정보가 μ—†μŠ΅λ‹ˆλ‹€."
61
+
62
+ # A λ ˆμ½”λ“œλ„ 확인
63
+ try:
64
+ dns.resolver.resolve(domain, 'A')
65
+ except DNSException:
66
+ try:
67
+ dns.resolver.resolve(domain, 'AAAA')
68
+ except DNSException:
69
+ return False, "❌ 도메인이 μ‹€μ œλ‘œ μ‘΄μž¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€."
70
+
71
+ return True, "βœ… λ„λ©”μΈμ˜ 메일 μ„œλ²„κ°€ μ‘΄μž¬ν•©λ‹ˆλ‹€."
72
+
73
+ except dns.resolver.NXDOMAIN:
74
+ return False, "❌ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” λ„λ©”μΈμž…λ‹ˆλ‹€."
75
+ except dns.resolver.NoAnswer:
76
+ return False, "❌ 도메인에 메일 μ„œλ²„ 정보가 μ—†μŠ΅λ‹ˆλ‹€."
77
+ except dns.resolver.NoNameservers:
78
+ return False, "❌ DNS μ„œλ²„μ— μ—°κ²°ν•  수 μ—†μŠ΅λ‹ˆλ‹€."
79
  except Exception as e:
80
  return False, f"❌ DNS 확인 쀑 였λ₯˜ λ°œμƒ: {str(e)}"
81
 
 
83
  """이메일 μ£Όμ†Œ μ’…ν•© 검증"""
84
  results = []
85
 
86
+ # 1. κΈ°λ³Έ μž…λ ₯κ°’ 검사
87
+ if not mail_address or not isinstance(mail_address, str):
88
+ return "❌ μœ νš¨ν•˜μ§€ μ•Šμ€ μž…λ ₯μž…λ‹ˆλ‹€."
89
+
90
+ mail_address = mail_address.strip()
91
+ if not mail_address:
92
+ return "❌ 이메일 μ£Όμ†Œλ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”."
93
+
94
+ # 2. ꡬ문 검사
95
  syntax_valid, syntax_msg = check_syntax(mail_address)
96
  results.append(syntax_msg)
97
  if not syntax_valid:
98
  return "\n".join(results)
99
 
100
+ # 3. 도메인 μΆ”μΆœ 및 DNS 검사
101
  try:
102
  domain = mail_address.split('@')[1]
103
  dns_valid, dns_msg = check_dns(domain)
 
105
  if not dns_valid:
106
  return "\n".join(results)
107
 
108
+ # λͺ¨λ“  검증 톡과
109
  results.append("βœ… 이메일 μ£Όμ†Œκ°€ μœ νš¨ν•©λ‹ˆλ‹€.")
110
 
111
  except Exception as e:
 
124
  title="이메일 μ£Όμ†Œ 검증 도ꡬ",
125
  description="""
126
  이 λ„κ΅¬λŠ” λ‹€μŒ 사항듀을 κ²€μ¦ν•©λ‹ˆλ‹€:
127
+ 1. 이메일 μ£Όμ†Œ ν˜•μ‹ 검사 (RFC 5322 ν‘œμ€€ μ€€μˆ˜)
128
  2. λ„λ©”μΈμ˜ 메일 μ„œλ²„(MX λ ˆμ½”λ“œ) 쑴재 μ—¬λΆ€ 확인
129
+ 3. λ„λ©”μΈμ˜ μ‹€μ œ 쑴재 μ—¬λΆ€ 확인
130
+ 4. μž„μ‹œ 이메일 도메인 필터링
131
  """,
132
  examples=[
133
+ ["user@gmail.com"],
134
+ ["test@yahoo.com"],
135
  ["invalid@nonexistent.domain"],
136
+ ["malformed@@email.com"],
137
+ ["user@tempmail.com"],
138
+ ["test@domain"],
139
+ ["user.name@subdomain.example.com"]
140
  ],
141
+ theme=gr.themes.Soft()
142
  )
143
 
144
  # μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹€ν–‰