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§
- Priority
Config - Configuration for priority assignment rules
- Priority
Queue - Multi-level priority queue
- Priority
Stats - Statistics for a single priority level
Enums§
- Priority
- Mail priority levels