diff --git a/exim_manager b/exim_manager new file mode 100644 index 0000000..cab5f2c --- /dev/null +++ b/exim_manager @@ -0,0 +1,94 @@ +#!/bin/bash + +# Function to list the number of emails in the queue +list_queue_count() { + local count=$(exim -bpc) + echo "Number of emails in the queue: $count" +} + +# Function to read an email by message ID +read_email() { + read -p "Enter the message ID: " message_id + if exim -Mvh "$message_id" &>/dev/null; then + exim -Mvh "$message_id" # Show the headers + exim -M "$message_id" # Show the full message + else + echo "Message ID $message_id not found." + fi +} + +# Function to provide a list of message IDs +list_message_ids() { + echo "Message IDs in the queue:" + exim -bp | awk '{print $3}' # Extract message IDs from the queue +} + +# Function to delete all emails in the queue +delete_all_emails() { + read -p "Are you sure you want to delete all emails in the queue? (y/n): " confirm + if [[ "$confirm" == "y" ]]; then + exim -bpr | awk '{print $3}' | xargs exim -Mrm + echo "All emails in the queue have been deleted." + else + echo "Operation canceled." + fi +} + +# Function to show the last 20 messages from the log +show_last_messages() { + echo "Last 20 messages from the Exim log:" + echo "User | From Address | To Address | Count" + echo "------------------------------------------" + + # Automatically determine the Exim log path + local log_file + if [[ -f /var/log/exim4/mainlog ]]; then + log_file="/var/log/exim4/mainlog" + elif [[ -f /var/log/exim/main.log ]]; then + log_file="/var/log/exim/main.log" + elif [[ -f /var/log/exim/exim.log ]]; then + log_file="/var/log/exim/exim.log" + else + echo "Exim log file not found." + return + fi + + # Get the last 20 log entries + local log_entries=$(tail -n 20 "$log_file") + + # Process the log entries to extract user, from, and to addresses + echo "$log_entries" | grep "from=<" | while read -r line; do + # Extract the sender, recipient, and user + from=$(echo "$line" | grep -oP 'from=<\K[^>]+') + to=$(echo "$line" | grep -oP 'to=<\K[^>]+') + user=$(echo "$line" | grep -oP 'user=<\K[^>]+') + + # Print the results if all fields are present + if [[ -n "$from" && -n "$to" && -n "$user" ]]; then + echo "$user | $from | $to" + fi + done | sort | uniq -c | sort -nr | awk '{print $2, $3, $4, $1}' | column -t +} + +# Main menu +while true; do + echo "Exim Queue Manager" + echo "1. List number of emails in queue" + echo "2. Read email by message ID" + echo "3. Provide list of message IDs" + echo "4. Delete all emails in the queue" + echo "5. Show last 20 messages from the log" + echo "6. Exit" + read -p "Choose an option [1-6]: " option + + case $option in + 1) list_queue_count ;; + 2) read_email ;; + 3) list_message_ids ;; + 4) delete_all_emails ;; + 5) show_last_messages ;; + 6) echo "Exiting..."; exit 0 ;; + *) echo "Invalid option. Please try again." ;; + esac + echo "" +done