Skip to content
This page was generated and translated with the assistance of AI. If you spot any inaccuracies, feel free to help improve it. Edit on GitHub

Account Management

PRX-Email supports multiple email accounts, each with its own IMAP and SMTP configuration, authentication credentials, and feature flags. Accounts are stored in the SQLite database and identified by a unique account_id.

Creating an Account

Use the EmailRepository to create a new account:

rust
use prx_email::db::{EmailRepository, NewAccount};

let account_id = repo.create_account(&NewAccount {
    email: "[email protected]".to_string(),
    display_name: Some("Alice".to_string()),
    now_ts: current_timestamp(),
})?;

Account Fields

FieldTypeDescription
idi64Auto-generated primary key
emailStringEmail address (used as IMAP/SMTP user)
display_nameOption<String>Human-readable name for the account
created_ati64Unix timestamp of creation
updated_ati64Unix timestamp of last update

Retrieving an Account

rust
let account = repo.get_account(account_id)?;
if let Some(acct) = account {
    println!("Email: {}", acct.email);
    println!("Name: {}", acct.display_name.unwrap_or_default());
}

Multi-Account Setup

Each account operates independently with its own:

  • IMAP connection -- Separate server, port, and credentials
  • SMTP connection -- Separate server, port, and credentials
  • Folders -- Synced folder list per account
  • Sync state -- Cursor tracking per account/folder pair
  • Feature flags -- Independent feature enablement
  • Outbox -- Separate send queue with per-message tracking
rust
// Account 1: Gmail with OAuth
let gmail_id = repo.create_account(&NewAccount {
    email: "[email protected]".to_string(),
    display_name: Some("Alice (Gmail)".to_string()),
    now_ts: now,
})?;

// Account 2: Work email with password
let work_id = repo.create_account(&NewAccount {
    email: "[email protected]".to_string(),
    display_name: Some("Alice (Work)".to_string()),
    now_ts: now,
})?;

Feature Flags

PRX-Email uses feature flags to control which capabilities are enabled per account. This supports staged rollout of new features.

Available Feature Flags

FlagDescription
inbox_readAllow listing and reading messages
inbox_searchAllow searching messages
email_sendAllow sending new emails
email_replyAllow replying to emails
outbox_retryAllow retrying failed outbox messages

Managing Feature Flags

rust
// Enable a feature for a specific account
plugin.set_account_feature(account_id, "email_send", true, now)?;

// Disable a feature
plugin.set_account_feature(account_id, "email_send", false, now)?;

// Set the global default for all accounts
plugin.set_feature_default("inbox_read", true, now)?;

// Check if a feature is enabled
let enabled = plugin.is_feature_enabled(account_id, "email_send")?;

Percentage-Based Rollout

Roll out features to a percentage of accounts:

rust
// Enable email_send for 50% of accounts
let enabled = plugin.apply_percentage_rollout(
    account_id,
    "email_send",
    50,  // percentage
    now,
)?;
println!("Feature enabled for this account: {}", enabled);

The rollout uses account_id % 100 to deterministically assign accounts to buckets, ensuring consistent behavior across restarts.

Folder Management

Folders are created automatically during IMAP sync, or you can create them manually:

rust
use prx_email::db::NewFolder;

let folder_id = repo.create_folder(&NewFolder {
    account_id,
    name: "INBOX".to_string(),
    path: "INBOX".to_string(),
    now_ts: now,
})?;

Listing Folders

rust
let folders = repo.list_folders(account_id)?;
for folder in &folders {
    println!("{}: {} ({})", folder.id, folder.name, folder.path);
}

Next Steps

Released under the Apache-2.0 License.