#!/usr/bin/env bash # Create or update a Mailcow mailbox via API. # # Usage: # make mailcow-mailbox MAILBOX=alerts # # or with env (after: source scripts/load-mailcow-vault-env.sh): # MAILBOX_LOCAL_PART=notify MAILBOX_NAME="Notify" MAILBOX_PASSWORD='...' ./scripts/mailcow-mailbox.sh # # Variables (env or make): # MAILBOX / MAILBOX_LOCAL_PART — local part (required) # MAILBOX_NAME — display name (default: title-case of local part) # MAILBOX_PASSWORD — if unset, loaded from vault_mailcow_mailbox_passwords[local_part] # MAILBOX_QUOTA — MiB (default 1024) # MAILCOW_URL, MAILCOW_DOMAIN, MAILCOW_API_KEY — see load-mailcow-vault-env.sh set -euo pipefail MAILCOW_URL="${MAILCOW_URL:-https://mail.levkine.ca}" DOMAIN="${MAILCOW_DOMAIN:-levkine.ca}" LOCAL_PART="${MAILBOX_LOCAL_PART:-${MAILBOX:-}}" API_KEY="${MAILCOW_API_KEY:-}" MAILBOX_PASSWORD="${MAILBOX_PASSWORD:-${ALERTS_PASSWORD:-}}" QUOTA="${MAILBOX_QUOTA:-1024}" if [[ -z "${LOCAL_PART}" ]]; then echo "Set MAILBOX=localpart or MAILBOX_LOCAL_PART" >&2 exit 1 fi if [[ -z "${API_KEY}" ]]; then echo "Set MAILCOW_API_KEY (make mailcow-mailbox loads vault/.env)" >&2 exit 1 fi if [[ -z "${MAILBOX_PASSWORD}" ]]; then echo "Set MAILBOX_PASSWORD or add vault_mailcow_mailbox_passwords.${LOCAL_PART} in vault" >&2 exit 1 fi DISPLAY_NAME="${MAILBOX_NAME:-$(echo "${LOCAL_PART}" | sed 's/[-_]/ /g' | awk '{for(i=1;i<=NF;i++) $i=toupper(substr($i,1,1)) tolower(substr($i,2)); print}')}" ATTR=$(jq -nc \ --arg lp "${LOCAL_PART}" \ --arg dom "${DOMAIN}" \ --arg name "${DISPLAY_NAME}" \ --arg pw "${MAILBOX_PASSWORD}" \ --arg quota "${QUOTA}" \ '{local_part:$lp,domain:$dom,name:$name,quota:$quota,password:$pw,password2:$pw,active:"1"}') echo "Creating mailbox ${LOCAL_PART}@${DOMAIN} (${DISPLAY_NAME})..." RESP=$(curl -sk -w "\n%{http_code}" -X POST "${MAILCOW_URL}/api/v1/add/mailbox" \ -H "X-API-Key: ${API_KEY}" \ -d "attr=${ATTR}") HTTP_CODE=$(echo "${RESP}" | tail -1) BODY=$(echo "${RESP}" | sed '$d') echo "${BODY}" | jq . 2>/dev/null || echo "${BODY}" if [[ "${HTTP_CODE}" -lt 200 || "${HTTP_CODE}" -ge 300 ]]; then echo "Mailcow API HTTP ${HTTP_CODE}" >&2 exit 1 fi echo "Done: ${LOCAL_PART}@${DOMAIN}"