#[derive(Debug, Clone, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(tag = "event", rename_all = "snake_case"))]
#[non_exhaustive]
pub enum SmtpMessage {
Command { verb: SmtpCommand, args: String },
Reply { code: u16, text: String },
Banner { banner: String },
Helo { domain: String, esmtp: bool },
MailFrom { address: String },
RcptTo { address: String },
Credentials {
mechanism: String,
user: String,
pass: String,
},
TlsUpgrade,
DataBegin,
DataEnd { bytes: u64 },
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(rename_all = "snake_case"))]
#[non_exhaustive]
pub enum SmtpCommand {
Helo,
Ehlo,
MailFrom,
RcptTo,
Data,
Rset,
Vrfy,
Expn,
Help,
Noop,
Quit,
StartTls,
Auth,
Bdat,
Other(String),
}
impl SmtpCommand {
pub fn from_verb(raw: &str) -> Self {
let upper = raw.to_ascii_uppercase();
match upper.as_str() {
"HELO" => Self::Helo,
"EHLO" => Self::Ehlo,
"MAIL" => Self::MailFrom,
"RCPT" => Self::RcptTo,
"DATA" => Self::Data,
"RSET" => Self::Rset,
"VRFY" => Self::Vrfy,
"EXPN" => Self::Expn,
"HELP" => Self::Help,
"NOOP" => Self::Noop,
"QUIT" => Self::Quit,
"STARTTLS" => Self::StartTls,
"AUTH" => Self::Auth,
"BDAT" => Self::Bdat,
_ => Self::Other(upper),
}
}
}