RFC 5322 compliant email address parsing, validation, and normalization
cargo add philiprehberger-email-parserRFC 5322 compliant email address parsing, validation, and normalization
[dependencies]
philiprehberger-email-parser = "0.3.0"
use philiprehberger_email_parser::Email;
// Parse and validate
let email = Email::parse("user@example.com")?;
assert_eq!(email.local_part(), "user");
assert_eq!(email.domain(), "example.com");
// Quick validation
assert!(Email::is_valid("user@example.com"));
assert!(!Email::is_valid("not-an-email"));
// Display name
let email = Email::parse("\"John Doe\" <john@example.com>")?;
assert_eq!(email.display_name(), Some("John Doe"));
let email = Email::parse("User+tag@Example.COM")?;
let normalized = email.normalize();
assert_eq!(normalized.domain(), "example.com");
let clean = email.without_plus_alias();
assert_eq!(clean.local_part(), "User");
let email = Email::parse("admin@example.com")?;
assert!(email.is_role_address());
let email = Email::parse("user@gmail.com")?;
assert!(email.is_free_provider());
let email = Email::parse("user@company.com")?;
assert!(!email.is_free_provider());
let email = Email::parse("user@mailinator.com")?;
assert!(email.is_disposable_provider());
let email = Email::parse("user@company.com")?;
assert!(email.is_corporate());
let email = Email::parse("user@gmail.com")?;
assert!(!email.is_corporate());
let email = Email::parse("User+tag@Example.COM")?;
let canonical = email.to_canonical();
assert_eq!(canonical.local_part(), "User");
assert_eq!(canonical.domain(), "example.com");
let email = Email::parse("user@example.com")?;
assert_eq!(email.tld(), Some("com"));
| Function / Type | Description |
|---|---|
Email::parse(input) | Parse and validate an email address |
Email::is_valid(input) | Quick boolean validation |
.local_part() | Get the local part |
.domain() | Get the domain |
.display_name() | Get the display name (if any) |
.normalize() | Lowercase domain |
.without_plus_alias() | Remove + alias |
.is_role_address() | Check if it's a role address |
.is_free_provider() | Check if domain is a free email provider |
.is_disposable_provider() | Check if domain is a disposable / throwaway provider |
.is_corporate() | True if neither free nor disposable |
.to_canonical() | Combine normalize() + without_plus_alias() |
.tld() | Last domain label, or None for IP literals |
cargo test
cargo clippy -- -D warnings
If you find this project useful: