Módulo para validação de endereços de e-mail com suporte a regras rigorosas de RFC 5321/5322 e feedback detalhado sobre erros de validação.
O módulo email fornece validação abrangente de endereços de e-mail, com suporte a:
Principais capacidades:
Um endereço de e-mail válido segue a estrutura:
usuario@dominio.extensao
Componentes:
@ (mín. 1, máx. 64 caracteres)Regras:
@is-valid?Valida se um valor é um endereço de e-mail bem formado.
Assinatura:
(is-valid? email)
Argumentos:
email - Valor a validar como endereço de e-mailRetorna: Boolean - true se for um e-mail válido, false caso contrário
Exemplos:
(is-valid? "user@example.com") ; => true
(is-valid? "john.doe@company.co.uk") ; => true
(is-valid? "alice+tag@domain.org") ; => true
(is-valid? "") ; => false
(is-valid? nil) ; => false
(is-valid? "invalid.email") ; => false (sem @)
(is-valid? "user@@example.com") ; => false (@ duplicado)
(is-valid? "user@.com") ; => false (sem domínio)
(is-valid? "user@example") ; => false (sem TLD)
validation-errorsValida um e-mail e retorna informações detalhadas sobre erros.
Assinatura:
(validation-errors email)
Argumentos:
email - Valor a validar como endereço de e-mailRetorna: Vetor de strings com mensagens de erro (vazio se válido)
Exemplos:
(validation-errors "user@example.com")
; => []
(validation-errors "")
; => ["Email cannot be blank"]
(validation-errors nil)
; => ["should be a string"]
(validation-errors "user@@example.com")
; => ["Email should have only one @"]
(validation-errors "userexample.com")
; => ["Email should have an @"]
(validation-errors "user@.com")
; => ["Email domain is invalid"]
(validation-errors "user@example")
; => ["Email domain must have an extension"]
O módulo fornece feedback detalhado sobre problemas:
;; E-mail vazio
(validation-errors "")
; => ["Email cannot be blank"]
;; Tipo incorreto
(validation-errors 123)
; => ["should be a string"]
;; Sem @ ou @ duplicado
(validation-errors "userexample.com")
; => ["Email should have an @"]
(validation-errors "user@@example.com")
; => ["Email should have only one @"]
;; Domínio inválido
(validation-errors "user@")
; => ["Email domain is invalid"]
(validation-errors "user@.com")
; => ["Email domain is invalid"]
;; Sem extensão (TLD)
(validation-errors "user@example")
; => ["Email domain must have an extension"]
;; Usuário muito longo (>64 caracteres)
(validation-errors (str (apply str (repeat 65 "a")) "@example.com"))
; => ["Email local part must be less than 64 characters"]
(defn validate-email-field [email-input]
(if (is-valid? email-input)
{:status :valid :email email-input}
{:status :invalid
:errors (validation-errors email-input)
:input email-input}))
(validate-email-field "john@example.com")
; => {:status :valid :email "john@example.com"}
(validate-email-field "invalid")
; => {:status :invalid :errors [...] :input "invalid"}
(defn filter-valid-emails [email-list]
(filter is-valid? email-list))
(filter-valid-emails
["john@example.com"
"invalid.email"
"alice@domain.co.uk"
nil
"bob@site.org"])
; => ["john@example.com" "alice@domain.co.uk" "bob@site.org"]
(defn get-validation-message [email]
(if (is-valid? email)
"E-mail válido!"
(let [errors (validation-errors email)
first-error (first errors)]
(str "Erro: " first-error))))
(get-validation-message "user@example.com")
; => "E-mail válido!"
(get-validation-message "userexample")
; => "Erro: Email should have an @"
(defn normalize-email [email]
(let [trimmed (clojure.string/trim email)
lowercased (clojure.string/lower-case trimmed)]
(when (is-valid? lowercased)
lowercased)))
(normalize-email " User@Example.COM ")
; => "user@example.com"
(normalize-email " invalid ")
; => nil
(defn process-contacts [contacts]
(let [grouped (group-by
(fn [contact]
(if (is-valid? (:email contact))
:valid
:invalid))
contacts)]
{:valid-contacts (get grouped :valid [])
:invalid-contacts (get grouped :invalid [])
:error-details (into {}
(map (fn [c]
[(:email c)
(validation-errors (:email c))])
(get grouped :invalid [])))}))
(process-contacts
[{:name "João" :email "joao@example.com"}
{:name "Maria" :email "invalid"}
{:name "Pedro" :email "pedro@domain.org"}])
; => {:valid-contacts [...]
; :invalid-contacts [...]
; :error-details {...}}
(defn validate-email-endpoint [email]
(if (is-valid? email)
{:status 200
:body {:valid true :email email}}
{:status 400
:body {:valid false
:errors (validation-errors email)}}))
(validate-email-endpoint "user@example.com")
; => {:status 200 :body {:valid true :email "user@example.com"}}
(validate-email-endpoint "bad-email")
; => {:status 400 :body {:valid false :errors [...]}}
| Padrão | Exemplo | Válido |
|---|---|---|
| Simples | user@domain.com | ✅ |
| Com ponto | john.doe@company.com | ✅ |
| Com + (alias) | user+tag@domain.com | ✅ |
| Com hífen | john-smith@domain.co.uk | ✅ |
| Com underscore | user_name@domain.org | ✅ |
| Vazio | "" | ❌ |
| Sem @ | user.domain.com | ❌ |
| @ duplicado | user@@domain.com | ❌ |
| Sem domínio | user@ | ❌ |
| Sem TLD | user@domain | ❌ |
Can you improve this documentation?Edit on GitHub
cljdoc builds & hosts documentation for Clojure/Script libraries
| Ctrl+k | Jump to recent docs |
| ← | Move to previous article |
| → | Move to next article |
| Ctrl+/ | Jump to the search field |