Skip to main content

Module priority

Module priority 

Source
Expand description

Priority queue system for mail delivery

This module provides a multi-level priority queue system for mail delivery, allowing mails to be processed based on their priority level.

§Priority Levels

  • High: Urgent mail (priority 3)
  • Normal: Default for most mail (priority 2)
  • Low: Non-urgent mail (priority 1)
  • Bulk: Newsletters, marketing (priority 0)

§Features

  • Priority-based scheduling (highest priority first)
  • Per-priority statistics tracking
  • Priority inheritance for retries
  • Configurable priority assignment rules:
    • Per sender email
    • Per recipient email
    • Per domain
  • Automatic priority boosting after N failed attempts

§Example: Basic Priority Queue

use rusmes_core::queue::priority::{Priority, PriorityQueue};
use rusmes_proto::MailId;

let mut queue = PriorityQueue::<String>::with_default_config();

// Enqueue items with different priorities
queue.enqueue(MailId::new(), "bulk mail".to_string(), Priority::Bulk);
queue.enqueue(MailId::new(), "urgent mail".to_string(), Priority::High);
queue.enqueue(MailId::new(), "normal mail".to_string(), Priority::Normal);

// Dequeue returns highest priority first (High, Normal, Bulk)
let (mail_id, item, priority) = queue.dequeue().unwrap();
assert_eq!(item, "urgent mail");
assert_eq!(priority, Priority::High);

§Example: Priority Configuration

use rusmes_core::queue::priority::{Priority, PriorityConfig};
use rusmes_proto::{Mail, MimeMessage, MessageBody, HeaderMap};
use bytes::Bytes;

let mut config = PriorityConfig::new();

// VIP sender always gets high priority
config.add_sender_priority("vip@example.com", Priority::High);

// Important domain gets high priority
config.add_domain_priority("important.com", Priority::High);

// Bulk domain gets low priority
config.add_domain_priority("marketing.com", Priority::Bulk);

// Enable priority boost after 3 failed attempts
config.boost_after_attempts = Some(3);
config.boost_amount = 1;

// Calculate priority for a mail
let message = MimeMessage::new(HeaderMap::new(), MessageBody::Small(Bytes::from("test")));
let mail = Mail::new(
    Some("vip@example.com".parse().unwrap()),
    vec!["user@example.com".parse().unwrap()],
    message,
    None,
    None,
);

let priority = config.calculate_priority(&mail, 0);
assert_eq!(priority, Priority::High);

§Example: Integration with MailQueue

use rusmes_core::{MailQueue, PriorityConfig, Priority};
use rusmes_proto::{Mail, MimeMessage, MessageBody, HeaderMap};
use bytes::Bytes;

#[tokio::main]
async fn main() {
    // Create priority configuration
    let mut priority_config = PriorityConfig::new();
    priority_config.add_domain_priority("urgent.com", Priority::High);

    // Create queue with priority support
    let queue = MailQueue::new_with_priority_config(priority_config);

    // Enqueue mail (priority calculated automatically)
    let message = MimeMessage::new(HeaderMap::new(), MessageBody::Small(Bytes::from("test")));
    let mail = Mail::new(
        Some("sender@example.com".parse().unwrap()),
        vec!["user@urgent.com".parse().unwrap()],
        message,
        None,
        None,
    );
    queue.enqueue(mail).await.unwrap();

    // Get ready mails (sorted by priority)
    let ready_mails = queue.get_ready_for_retry(10);

    // Get statistics by priority
    let stats = queue.stats_by_priority();
    for (priority, stat) in stats {
        println!("{}: {} total, {} ready", priority, stat.total, stat.ready);
    }
}

Structs§

PriorityConfig
Configuration for priority assignment rules
PriorityQueue
Multi-level priority queue
PriorityStats
Statistics for a single priority level

Enums§

Priority
Mail priority levels