Код IT Загрузка примера кода…

Go main.go
package main

import (
	"regexp"
	"strings"
	"time"
)

var emailRegex = regexp.MustCompile(`^[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}$`)

// Result — результат проверки одного адреса.
type Result struct {
	Email  string
	Valid  bool   // синтаксис корректен
	Exists *bool  // nil — не удалось проверить через SMTP
	Domain string
	MXHost string
	Detail string
	Error  error
}

// Verifier проверяет email через DNS (MX) и SMTP (RCPT TO).
type Verifier struct {
	Timeout time.Duration
}

func NewVerifier(timeout time.Duration) *Verifier {
	return &Verifier{Timeout: timeout}
}

func (v *Verifier) Verify(email string) Result {
	email = strings.TrimSpace(strings.ToLower(email))
	result := Result{Email: email}

	if !emailRegex.MatchString(email) {
		result.Detail = "некорректный формат email"
		return result
	}
	result.Valid = true

	parts := strings.SplitN(email, "@", 2)
	result.Domain = parts[1]
	result.Detail = "синтаксис OK (DNS/SMTP — на следующих этапах)"
	return result
}
package main

import (
	"regexp"
	"strings"
	"time"
)

var emailRegex = regexp.MustCompile(`^[a-zA-Z0-9._%+\-]+@[a-zA-Z0-9.\-]+\.[a-zA-Z]{2,}$`)

// Result — результат проверки одного адреса.
type Result struct {
	Email  string
	Valid  bool   // синтаксис корректен
	Exists *bool  // nil — не удалось проверить через SMTP
	Domain string
	MXHost string
	Detail string
	Error  error
}

// Verifier проверяет email через DNS (MX) и SMTP (RCPT TO).
type Verifier struct {
	Timeout time.Duration
}

func NewVerifier(timeout time.Duration) *Verifier {
	return &Verifier{Timeout: timeout}
}

func (v *Verifier) Verify(email string) Result {
	email = strings.TrimSpace(strings.ToLower(email))
	result := Result{Email: email}

	if !emailRegex.MatchString(email) {
		result.Detail = "некорректный формат email"
		return result
	}
	result.Valid = true

	parts := strings.SplitN(email, "@", 2)
	result.Domain = parts[1]
	result.Detail = "синтаксис OK (DNS/SMTP — на следующих этапах)"
	return result
}