#!/usr/bin/env bash # Get script directory SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # Load configuration source "$SCRIPT_DIR/mailcow.conf" # Clipboard helper function copy_to_clipboard() { if command -v xclip >/dev/null 2>&1; then echo -n "$1" | xclip -selection clipboard echo "(Copied to clipboard via xclip)" elif command -v wl-copy >/dev/null 2>&1; then echo -n "$1" | wl-copy echo "(Copied to clipboard via wl-copy)" elif command -v pbcopy >/dev/null 2>&1; then echo -n "$1" | pbcopy echo "(Copied to clipboard via pbcopy)" fi } # Create a new alias create_alias() { local SITE="$1" local DOMAIN_CHOICE="$2" if [ -z "$SITE" ]; then echo "Error: You must provide a site name or identifier." exit 1 fi # Select domain if [ -n "$DOMAIN_CHOICE" ]; then SELECTED_DOMAIN="$DOMAIN_CHOICE" else echo "Select a domain:" for i in "${!DOMAINS[@]}"; do echo "$((i+1))) ${DOMAINS[$i]}" done read -rp "Enter choice number: " choice INDEX=$((choice-1)) if [[ $INDEX -ge 0 && $INDEX -lt ${#DOMAINS[@]} ]]; then SELECTED_DOMAIN="${DOMAINS[$INDEX]}" else echo "Invalid choice. Defaulting to ${DOMAINS[0]}" SELECTED_DOMAIN="${DOMAINS[0]}" fi fi local RAND=$(tr -dc a-z0-9 $REAL_EMAIL" RESPONSE=$(curl -s -X POST "${MAILCOW_URL}/api/v1/add/alias" \ -H "X-API-Key: ${API_KEY}" \ -H "Content-Type: application/json" \ -d "{ \"address\": \"${ALIAS}\", \"goto\": \"${REAL_EMAIL}\", \"active\": \"1\", \"public_comment\": \"aliasgen ${SITE}\" }") if echo "$RESPONSE" | grep -q "error"; then echo "Error creating alias: $RESPONSE" else echo "Alias created: $ALIAS" copy_to_clipboard "$ALIAS" fi } # List all aliases list_aliases() { curl -s -X GET "${MAILCOW_URL}/api/v1/get/alias/all" \ -H "X-API-Key: ${API_KEY}" \ | jq -r '.[] | "\(.address) -> \(.goto) [active: \(.active)]"' \ | column -t } # Search aliases by keyword search_aliases() { local TERM="$1" if [ -z "$TERM" ]; then echo "Error: Please provide a search term." exit 1 fi curl -s -X GET "${MAILCOW_URL}/api/v1/get/alias/all" \ -H "X-API-Key: ${API_KEY}" \ | jq -r --arg TERM "$TERM" '.[] | select(.address | test($TERM)) | "\(.address) -> \(.goto) [active: \(.active)]"' \ | column -t } # Delete alias delete_alias() { local ALIAS="$1" if [ -z "$ALIAS" ]; then echo "Error: Please provide the alias to delete." exit 1 fi RESPONSE=$(curl -s -X POST "${MAILCOW_URL}/api/v1/delete/alias" \ -H "X-API-Key: ${API_KEY}" \ -H "Content-Type: application/json" \ -d "{ \"address\": \"${ALIAS}\" }") echo "Response: $RESPONSE" } # Disable alias (sets active=0) disable_alias() { local ALIAS="$1" if [ -z "$ALIAS" ]; then echo "Error: Please provide the alias to disable." exit 1 fi RESPONSE=$(curl -s -X POST "${MAILCOW_URL}/api/v1/edit/alias" \ -H "X-API-Key: ${API_KEY}" \ -H "Content-Type: application/json" \ -d "{ \"address\": \"${ALIAS}\", \"active\": \"0\" }") echo "Response: $RESPONSE" } # Enhanced help menu show_help() { cat < [arguments] Commands: create Create a new alias for a website or service Example: aliasgen create amazon Generates: amazon-abc12@domain.com -> $REAL_EMAIL list List all aliases with their destination emails and active status Example: aliasgen list search Search for aliases by a keyword Example: aliasgen search amazon delete Permanently delete an alias Example: aliasgen delete amazon-abc12@domain.com disable Disable an alias without deleting it (active=0) Example: aliasgen disable amazon-abc12@domain.com help Show this help menu Example: aliasgen help Notes: - Created aliases are automatically copied to clipboard (Linux/macOS supported) - Configuration is stored in 'mailcow.conf' (API key, domain, real email) - Random suffix length can be adjusted with RANDOM_LENGTH in mailcow.conf EOF } # Main command dispatch case "$1" in create) create_alias "$2" ;; list) list_aliases ;; search) search_aliases "$2" ;; delete) delete_alias "$2" ;; disable) disable_alias "$2" ;; help|"" ) show_help ;; *) echo "Unknown command: $1"; show_help ;; esac