#email-address #validation #serde #serialization


A validating email type that can be serialised using Serde

10 stable releases

3.0.0 Aug 13, 2023
2.1.0 Jul 20, 2023
2.0.0 Jun 11, 2023
1.5.0 May 22, 2023
1.1.0 Nov 21, 2022

#32 in Email

Download history 303/week @ 2023-08-14 338/week @ 2023-08-21 303/week @ 2023-08-28 160/week @ 2023-09-04 185/week @ 2023-09-11 334/week @ 2023-09-18 366/week @ 2023-09-25 366/week @ 2023-10-02 811/week @ 2023-10-09 524/week @ 2023-10-16 621/week @ 2023-10-23 364/week @ 2023-10-30 371/week @ 2023-11-06 229/week @ 2023-11-13 205/week @ 2023-11-20 198/week @ 2023-11-27

1,026 downloads per month
Used in 3 crates

MIT license

548 lines

Serde Email

A validating email type that can be serialised using Serde (and Sea Orm).

crate docs


This crate is for creating Email objects.

  • It allows you to have Email as a type. i.e. let emails : Vec<Email> = vec![].
  • The Email type guarantees to be validated. Once it is created, you can be confident it's safe to use as an email.
  • The Email type can also be used as strings. This allows interoptability with lots of connector functions which will take a String.
  • It supports Serde out of the box. For Serialisation with CLIs, requests, etc.

(Note this library will not check if the Email address exists. It only validates that it looks correct.)


  • serde Default - Enables serde serialisation and deserialisation.
  • sea-orm - Enables Sea Orm use with DB entities.


Building your own email addresses

use ::serde_email::Email;

let email = Email::from_str("test@example.com").expect("A valid email address");

Validating the email address yourself

use ::serde_email::is_valid_email;

if is_valid_email(&"test@example.com") {
  // do something

Serialisation / Deserialisation

use ::serde_email::Email;
use ::serde_json;

struct Person {
  name: String,
  email: Email,

// Some JSON input data as a &str. Maybe this comes from the user.
let data = r#"
        "name": "John Doe",
        "email": "john@example.com"

// Parse the string of data into serde_json::Value.
let person: Person = serde_json::from_str(data).unwrap();

// Access parts of the data by indexing with square brackets.
println!("Hello {} I'll email you are {}", person.name, person.email);

Sea Orm Entities

You can use the Email type with Sea Orm, including using it to save data to the DB. Underneath it will serialise to a Text type within the DB.

use ::sea_orm::entity::prelude::*;
use ::serde::Deserialize;
use ::serde::Serialize;
use ::serde_email::Email;

#[derive(Clone, Debug, PartialEq, DeriveEntityModel, Serialize, Deserialize)]
#[sea_orm(table_name = "user")]
pub struct Model {
    pub id: i32,
    pub email: Email, // use as an email field

#[derive(Copy, Clone, Debug, EnumIter, DeriveRelation)]
pub enum Relation {}

impl ActiveModelBehavior for ActiveModel {}

Special Thanks

The validation is all done by the email_address crate.


~29K SLoC