postfix-log-parser 0.2.0

高性能模块化Postfix日志解析器,经3.2GB生产数据验证,SMTPD事件100%准确率
Documentation
//! SMTP客户端投递模块
//!
//! 处理Postfix smtp客户端的事件,包括外部邮件投递、SMTP会话和投递状态报告

use serde::{Deserialize, Serialize};

/// SMTP投递组件事件
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum SmtpEvent {
    /// 投递成功
    Sent {
        queue_id: String,
        to: String,
        relay_hostname: String,
        relay_ip: Option<String>,
        relay_port: Option<u16>,
        delay: f64,
        delay_before_queue: Option<f64>,
        delay_in_queue: Option<f64>,
        delay_connection: Option<f64>,
        delay_transmission: Option<f64>,
        dsn: Option<String>,
        status: String,
        message_size: Option<u64>,
    },
    /// 投递延迟
    Deferred {
        queue_id: String,
        to: Option<String>,
        relay_hostname: Option<String>,
        relay_ip: Option<String>,
        relay_port: Option<u16>,
        delay: Option<f64>,
        delay_before_queue: Option<f64>,
        delay_in_queue: Option<f64>,
        delay_connection: Option<f64>,
        delay_transmission: Option<f64>,
        dsn: Option<String>,
        status: String,
        defer_reason: String,
    },
    /// 投递失败(退信)
    Bounced {
        queue_id: String,
        to: String,
        relay_hostname: Option<String>,
        relay_ip: Option<String>,
        relay_port: Option<u16>,
        delay: Option<f64>,
        delay_before_queue: Option<f64>,
        delay_in_queue: Option<f64>,
        delay_connection: Option<f64>,
        delay_transmission: Option<f64>,
        dsn: Option<String>,
        status: String,
        bounce_reason: String,
    },
    /// 连接超时
    ConnectionTimeout {
        queue_id: String,
        target_hostname: String,
        target_ip: String,
        target_port: u16,
        timeout_duration: Option<u32>,
    },
    /// 连接拒绝
    ConnectionRefused {
        queue_id: String,
        target_hostname: String,
        target_ip: String,
        target_port: u16,
    },
    /// 连接丢失
    ConnectionLost {
        queue_id: String,
        target_hostname: String,
        target_ip: String,
        lost_stage: String,
    },
    /// 协议交互
    ProtocolInteraction {
        queue_id: String,
        interaction_type: String,
        details: String,
    },
    /// 其他SMTP事件
    Other {
        queue_id: Option<String>,
        event_type: String,
        message: String,
    },
}

impl SmtpEvent {
    pub fn event_type(&self) -> &'static str {
        match self {
            SmtpEvent::Sent { .. } => "sent",
            SmtpEvent::Deferred { .. } => "deferred",
            SmtpEvent::Bounced { .. } => "bounced",
            SmtpEvent::ConnectionTimeout { .. } => "connection_timeout",
            SmtpEvent::ConnectionRefused { .. } => "connection_refused",
            SmtpEvent::ConnectionLost { .. } => "connection_lost",
            SmtpEvent::ProtocolInteraction { .. } => "protocol_interaction",
            SmtpEvent::Other { .. } => "other",
        }
    }

    pub fn queue_id(&self) -> Option<&str> {
        match self {
            SmtpEvent::Sent { queue_id, .. } => Some(queue_id),
            SmtpEvent::Deferred { queue_id, .. } => Some(queue_id),
            SmtpEvent::Bounced { queue_id, .. } => Some(queue_id),
            SmtpEvent::ConnectionTimeout { queue_id, .. } => Some(queue_id),
            SmtpEvent::ConnectionRefused { queue_id, .. } => Some(queue_id),
            SmtpEvent::ConnectionLost { queue_id, .. } => Some(queue_id),
            SmtpEvent::ProtocolInteraction { queue_id, .. } => Some(queue_id),
            SmtpEvent::Other { queue_id, .. } => queue_id.as_deref(),
        }
    }
}