use crate::response::SmtpResponse;
#[derive(Debug, thiserror::Error)]
pub enum SmtpError {
#[error("connection to {host}:{port} failed: {source}")]
Connection {
host: String,
port: u16,
source: std::io::Error,
},
#[error("TLS error: {message}")]
Tls { message: String },
#[error("authentication failed (code {code}): {message}")]
Auth { code: u16, message: String },
#[error("sender {address} rejected (code {code}): {message}")]
RejectedSender {
address: String,
code: u16,
message: String,
},
#[error("recipient {address} rejected (code {code}): {message}")]
RejectedRecipient {
address: String,
code: u16,
message: String,
},
#[error("data rejected (code {code}): {message}")]
DataRejected { code: u16, message: String },
#[error("timeout waiting for response to {stage}")]
Timeout { stage: String },
#[error("protocol error: expected {expected}, got {}", got.code)]
Protocol { expected: u16, got: SmtpResponse },
#[error("invalid email: {message}")]
InvalidEmail { message: String },
#[error("no compatible auth method (server supports: {available:?})")]
NoAuthMethod { available: Vec<String> },
#[error("I/O error: {0}")]
Io(#[from] std::io::Error),
}