Skip to content

Configuration

Courier uses HOCON format for its main configuration file located at config/courier/config.conf.

config/courier/config.conf
# Courier Mail System Configuration
# Rate limiting settings
rateLimits {
# Maximum messages per day per player
messagesPerDay = 50
# Maximum messages per hour per player
messagesPerHour = 10
# Maximum messages per minute per player
messagesPerMinute = 3
# Maximum recipients per message
maxRecipients = 10
}
# Mail expiration settings
expiration {
# Days until unclaimed mail expires (0 = never)
defaultDays = 30
# Hours between cleanup runs
cleanupIntervalHours = 1
}
# GUI settings
gui {
# Items per page in inbox
itemsPerPage = 45
# Allow sending to self (useful for testing)
allowSendToSelf = false
}

Rate limits prevent spam and protect server performance:

SettingDefaultDescription
messagesPerDay50Max messages a player can send per day
messagesPerHour10Max messages per hour
messagesPerMinute3Max messages per minute
maxRecipients10Max recipients per message

Configure how long mail is kept:

expiration {
# Set to 0 to never expire mail
defaultDays = 30
# How often to check for expired mail
cleanupIntervalHours = 1
}

Customize all user-facing messages in config/courier/messages.json:

config/courier/messages.json
{
"prefix": "<gray>[<gold>Mail</gold>]</gray> ",
"errors": {
"cannotSendToSelf": "<red>You cannot send mail to yourself!</red>",
"playerNotFound": "<red>Player <yellow>{player}</yellow> not found!</red>",
"rateLimited": "<red>You are sending too fast! Try again in {seconds}s</red>",
"presetNotFound": "<red>Preset <yellow>{preset}</yellow> not found!</red>"
},
"success": {
"mailSent": "<green>Mail sent to <yellow>{recipient}</yellow>!</green>",
"block": "<green>Blocked <yellow>{player}</yellow></green>",
"unblock": "<green>Unblocked <yellow>{player}</yellow></green>"
},
"login": {
"header": "<gold>━━━━━━━━━━━━━━━━━━━━━━━━━━━</gold>",
"unread": "<yellow>You have <gold>{count}</gold> unread message{plural}!</yellow>",
"hint": "<gray>Use <yellow>/mail</yellow> to view your inbox</gray>",
"footer": "<gold>━━━━━━━━━━━━━━━━━━━━━━━━━━━</gold>"
}
}

All messages support MiniMessage formatting:

Colors

  • <red>, <green>, <blue>, etc.
  • <#FF5555> (hex colors)
  • <gradient:red:blue>text</gradient>

Styles

  • <bold>, <italic>, <underlined>
  • <strikethrough>, <obfuscated>
  • <reset> to clear formatting

Available placeholders in messages:

PlaceholderDescription
{player}Player name
{recipient}Recipient name
{count}Number count
{plural}”s” if count > 1
{seconds}Seconds remaining
{preset}Preset ID
{error}Error message

Courier depends on Ceremony for storage and cross-server communication. Configure Ceremony in config/ceremony/config.conf:

config/ceremony/config.conf
# Database storage for mail
storageType = "MONGO_DB"
storageUrl = "mongodb://localhost:27017"
# Cross-server communication
messageBus {
type = "REDIS"
serverId = "server-1"
redisAddress = "redis://localhost:6379"
}
# Player data storage
playerData {
backend = "CARDINAL_COMPONENTS"
caching = true
}
TypeBest For
JSONDevelopment/testing
SQLITESingle server, simple setup
MONGO_DBProduction, multi-server
MARIA_DBAlternative to MongoDB
TypeDescription
NONESingle server only
REDISPopular, feature-rich
NATSLightweight, fast

Courier uses the Fabric Permissions API. Default permissions:

PermissionDefaultDescription
courier.mail.usetrueUse /mail command
courier.adminop (4)Admin commands

Configure with LuckPerms or similar:

/lp group default permission set courier.mail.use true
/lp group admin permission set courier.admin true

Package presets are stored in config/courier/presets/:

config/courier/presets/
├── starter_kit.json
├── welcome_gift.json
├── rare_pokemon.json
├── mining_supplies.json
├── battle_ready.json
└── event_reward.json

See Preset Packages for creating custom presets.

Reload configurations without restarting:

/mailadmin reload

This reloads:

  • Package presets
  • Messages configuration