mirror of
https://github.com/instant-labs/instant-smtp.git
synced 2025-02-13 05:22:04 +00:00
Implement Command::serialize
This commit is contained in:
parent
facfa4d7ea
commit
75d09f91ec
112
src/types.rs
112
src/types.rs
@ -165,6 +165,118 @@ impl std::fmt::Debug for Command {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Command {
|
||||||
|
pub fn serialize(&self, writer: &mut impl Write) -> std::io::Result<()> {
|
||||||
|
use Command::*;
|
||||||
|
|
||||||
|
match self {
|
||||||
|
// helo = "HELO" SP Domain CRLF
|
||||||
|
Helo {
|
||||||
|
fqdn_or_address_literal,
|
||||||
|
} => {
|
||||||
|
writer.write_all(b"HELO ")?;
|
||||||
|
writer.write_all(fqdn_or_address_literal)?;
|
||||||
|
}
|
||||||
|
// ehlo = "EHLO" SP ( Domain / address-literal ) CRLF
|
||||||
|
Ehlo {
|
||||||
|
fqdn_or_address_literal,
|
||||||
|
} => {
|
||||||
|
writer.write_all(b"EHLO ")?;
|
||||||
|
writer.write_all(fqdn_or_address_literal)?;
|
||||||
|
}
|
||||||
|
// mail = "MAIL FROM:" Reverse-path [SP Mail-parameters] CRLF
|
||||||
|
Mail {
|
||||||
|
reverse_path,
|
||||||
|
parameters: None,
|
||||||
|
} => {
|
||||||
|
writer.write_all(b"MAIL FROM:<")?;
|
||||||
|
writer.write_all(reverse_path)?;
|
||||||
|
writer.write_all(b">")?;
|
||||||
|
}
|
||||||
|
Mail {
|
||||||
|
reverse_path,
|
||||||
|
parameters: Some(parameters),
|
||||||
|
} => {
|
||||||
|
writer.write_all(b"MAIL FROM:<")?;
|
||||||
|
writer.write_all(reverse_path)?;
|
||||||
|
writer.write_all(b"> ")?;
|
||||||
|
writer.write_all(parameters)?;
|
||||||
|
}
|
||||||
|
// rcpt = "RCPT TO:" ( "<Postmaster@" Domain ">" / "<Postmaster>" / Forward-path ) [SP Rcpt-parameters] CRLF
|
||||||
|
Rcpt {
|
||||||
|
forward_path,
|
||||||
|
parameters: None,
|
||||||
|
} => {
|
||||||
|
writer.write_all(b"RCPT TO:<")?;
|
||||||
|
writer.write_all(forward_path)?;
|
||||||
|
writer.write_all(b">")?;
|
||||||
|
}
|
||||||
|
Rcpt {
|
||||||
|
forward_path,
|
||||||
|
parameters: Some(parameters),
|
||||||
|
} => {
|
||||||
|
writer.write_all(b"RCPT TO:<")?;
|
||||||
|
writer.write_all(forward_path)?;
|
||||||
|
writer.write_all(b"> ")?;
|
||||||
|
writer.write_all(parameters)?;
|
||||||
|
}
|
||||||
|
// data = "DATA" CRLF
|
||||||
|
Data => writer.write_all(b"DATA")?,
|
||||||
|
// rset = "RSET" CRLF
|
||||||
|
Rset => writer.write_all(b"RSET")?,
|
||||||
|
// vrfy = "VRFY" SP String CRLF
|
||||||
|
Vrfy { user_or_mailbox } => {
|
||||||
|
writer.write_all(b"VRFY ")?;
|
||||||
|
writer.write_all(user_or_mailbox)?;
|
||||||
|
}
|
||||||
|
// expn = "EXPN" SP String CRLF
|
||||||
|
Expn { mailing_list } => {
|
||||||
|
writer.write_all(b"EXPN ")?;
|
||||||
|
writer.write_all(mailing_list)?;
|
||||||
|
}
|
||||||
|
// help = "HELP" [ SP String ] CRLF
|
||||||
|
Help { argument: None } => writer.write_all(b"HELP")?,
|
||||||
|
Help {
|
||||||
|
argument: Some(data),
|
||||||
|
} => {
|
||||||
|
writer.write_all(b"HELP ")?;
|
||||||
|
writer.write_all(data)?;
|
||||||
|
}
|
||||||
|
// noop = "NOOP" [ SP String ] CRLF
|
||||||
|
Noop { argument: None } => writer.write_all(b"NOOP")?,
|
||||||
|
Noop {
|
||||||
|
argument: Some(data),
|
||||||
|
} => {
|
||||||
|
writer.write_all(b"NOOP ")?;
|
||||||
|
writer.write_all(data)?;
|
||||||
|
}
|
||||||
|
// quit = "QUIT" CRLF
|
||||||
|
Quit => writer.write_all(b"QUIT")?,
|
||||||
|
// ----- Extensions -----
|
||||||
|
// starttls = "STARTTLS" CRLF
|
||||||
|
StartTLS => writer.write_all(b"STARTTLS")?,
|
||||||
|
// auth_login_command = "AUTH LOGIN" [SP username] CRLF
|
||||||
|
AuthLogin(None) => {
|
||||||
|
writer.write_all(b"AUTH LOGIN")?;
|
||||||
|
}
|
||||||
|
AuthLogin(Some(data)) => {
|
||||||
|
writer.write_all(b"AUTH LOGIN ")?;
|
||||||
|
writer.write_all(data.as_bytes())?;
|
||||||
|
}
|
||||||
|
// auth_plain_command = "AUTH PLAIN" [SP base64] CRLF
|
||||||
|
AuthPlain(None) => {
|
||||||
|
writer.write_all(b"AUTH PLAIN")?;
|
||||||
|
}
|
||||||
|
AuthPlain(Some(data)) => {
|
||||||
|
writer.write_all(b"AUTH PLAIN ")?;
|
||||||
|
writer.write_all(data.as_bytes())?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
write!(writer, "\r\n")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct Greeting {
|
pub struct Greeting {
|
||||||
pub domain: String,
|
pub domain: String,
|
||||||
|
Loading…
Reference in New Issue
Block a user