Type-safe, zero-copy, validated email addresses with generic storage, IDNA domain support, and no_std/no-alloc compatibility.
Overview
emailaddr provides validated email address types with a storage model similar
to hostaddr:
EmailAddr<S = str>stores a validated full address using caller-chosen storage.LocalPart<S = str>validates dot-atom and quoted-string local-parts.DomainPart<S = str>validates RFC 5321 domain-parts and bracketed address literals.Bufferstores a full validated address on the stack forno_std/ no-allocation use.
With the default std feature, SMTPUTF8 local-parts are accepted and Unicode
domain-parts are normalized to IDNA/punycode. The verify_ascii_* helpers
remain strict ASCII validators.
Installation
[]
= "0.1"
Quick Start
use EmailAddr;
let addr: = "user.name@example.com".parse.unwrap;
assert_eq!;
assert_eq!;
let quoted = try_from_ascii_str.unwrap;
assert_eq!;
let idn: = "user@测试.中国".parse.unwrap;
assert_eq!;
let smtp_utf8: = "用户@example.com".parse.unwrap;
assert_eq!;
Borrowed DSTs
use ;
let addr: & = try_from_ascii_str.unwrap;
assert_eq!;
assert_eq!;
assert_eq!;
let bytes: & = addr.as_bytes_addr;
assert_eq!;
let local: & = try_from_ascii_str.unwrap;
let domain: & = try_from_ascii_str.unwrap;
assert_eq!;
assert_eq!;
Storage
use ;
use Arc;
let owned: = "user@example.com".parse.unwrap;
let shared: = try_from.unwrap;
let bytes: = try_from.unwrap;
let stack: = try_from.unwrap;
assert_eq!;
assert_eq!;
Validation Helpers
use ;
assert!;
assert!;
assert!;
assert!;
assert!;
assert!;
assert!;
assert!;
Parsing Options
Default parsing stays RFC-compatible. [Options] adds application policy and
explicit non-standard relaxations without changing the default constructors.
parse_with_options is available on EmailAddr<S, Relax>, so relaxed parsing
is visible in the type while ordinary EmailAddr<S> remains strict.
use ;
let require_tld = new
.with_domain;
assert!;
let long_local = new
.with_limits;
assert!;
let ascii_local = new
.with_local;
assert!;
let no_literals = new
.with_domain;
assert!;
let raw_domain = new
.with_domain;
let addr = parse_with_options.unwrap;
assert_eq!;
DomainUnicodePolicy::NonStandardUtf8 preserves raw UTF-8 DNS labels as
application data. It is not SMTP/DNS-compatible IDNA normalization.
The DomainUnicodePolicy::as_str() values, CLI values, and human-readable
serde values for this policy are ascii, idna, and raw.
Human-readable serde formats such as JSON, YAML, and TOML serialize option
enums with those same string values, so configuration files can use fields like:
[]
= "raw"
= "forbid"
= 2
Feature Flags
| Feature | Description |
|---|---|
std (default) |
Standard library support and IDNA domain normalization |
alloc |
Allocation support without std, including IDNA domain normalization |
serde |
serde_core-backed serialization/deserialization for addresses, parts, and parsing options; combine with alloc or std for IDNA-validated A-label deserialization |
clap |
clap::Args / ValueEnum support for parsing options; CLI flags only, no environment-variable wiring |
zeroize |
zeroize::Zeroize support for Buffer, EmailAddr, LocalPart, and DomainPart when the selected storage can be wiped |
bytes / bytes_1 |
bytes::Bytes storage support |
smallvec / smallvec_1 |
smallvec::SmallVec byte storage support |
smol_str / smol_str_0_3 |
smol_str::SmolStr storage support |
tinyvec / tinyvec_1 |
tinyvec::TinyVec byte storage support |
triomphe / triomphe_0_1 |
triomphe::Arc<str> and triomphe::Arc<[u8]> storage support |
arbitrary |
Invariant-preserving arbitrary::Arbitrary impls for owned storage backends |
quickcheck |
Invariant-preserving quickcheck::Arbitrary impls for owned storage backends |
Calling zeroize clears the underlying storage and intentionally destroys the
validated-address invariant. Drop or reassign a value after wiping it.
RFC Coverage
emailaddr validates the address forms relevant to an address value:
- RFC 5321 SMTP mailbox syntax and length limits
- RFC 5322
addr-speclocal-part/domain token grammar where it overlaps with mailbox addresses - RFC 6531 SMTPUTF8 local-parts
- RFC 6532 UTF-8 header character model for address tokens
- RFC 1123 host label digit relaxation for domains
- RFC 4291 IPv6 address literals
- RFC 5890 IDNA domain normalization
- RFC 3629 UTF-8 validity for SMTPUTF8 input
- RFC 5234 ABNF-derived parser behavior
- RFC 3696 application-level email length guidance
This crate does not parse full message headers, display names, groups, comments, or SMTP commands; it validates and normalizes address values.
License
emailaddr is under the terms of both the MIT license and the Apache License
(Version 2.0).
See LICENSE-APACHE, LICENSE-MIT for details.
Copyright (c) 2026 Al Liu.