#!/bin/bash ################################################################################ # Email Account/Domain Diagnostics ################################################################################ # Purpose: Verify email is working for specific address or domain # Shows proof of delivery or identifies why emails aren't working ################################################################################ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" source "$SCRIPT_DIR/lib/common-functions.sh" source "$SCRIPT_DIR/lib/system-detect.sh" source "$SCRIPT_DIR/lib/email-functions.sh" show_banner "Email Diagnostics - Verify Email Delivery" # Get mail log path MAIL_LOG=$(get_mail_log_path) if [ ! -f "$MAIL_LOG" ]; then print_error "Mail log not found: $MAIL_LOG" exit 1 fi print_success "Using mail log: $MAIL_LOG" echo "" # Ask what to check echo -e "${BOLD}What would you like to check?${NC}" echo "" echo " 1) Specific email address (e.g., user@example.com)" echo " 2) Entire domain (e.g., example.com)" echo "" read -p "Enter choice [1]: " check_type check_type=${check_type:-1} # Get email/domain to check echo "" if [ "$check_type" = "2" ]; then read -p "Enter domain to check (e.g., example.com): " target search_pattern="@${target}" check_label="domain $target" else read -p "Enter email address to check: " target search_pattern="$target" check_label="email $target" fi if [ -z "$target" ]; then print_error "No email/domain provided" exit 1 fi # Time period to check echo "" echo "Check logs from:" echo " 1) Last 1 hour" echo " 2) Last 6 hours" echo " 3) Last 24 hours (recommended)" echo " 4) Last 48 hours" echo " 5) Last week" echo "" read -p "Enter choice [3]: " time_choice time_choice=${time_choice:-3} case "$time_choice" in 1) hours=1 ;; 2) hours=6 ;; 3) hours=24 ;; 4) hours=48 ;; 5) hours=168 ;; *) hours=24 ;; esac echo "" print_info "Analyzing $check_label for last $hours hours..." echo "" # Calculate time cutoff if date --version 2>&1 | grep -q "GNU"; then # GNU date cutoff_time=$(date -d "$hours hours ago" +"%Y-%m-%d %H:%M:%S") else # BSD date (macOS) cutoff_time=$(date -v-${hours}H +"%Y-%m-%d %H:%M:%S") fi ################################################################################ # Analysis ################################################################################ TEMP_MATCHES="/tmp/email_diag_$$.txt" grep -i "$search_pattern" "$MAIL_LOG" > "$TEMP_MATCHES" 2>/dev/null if [ ! -s "$TEMP_MATCHES" ]; then print_error "❌ NO EMAIL ACTIVITY FOUND for $check_label" echo "" echo "This means:" echo " • No emails sent TO this $check_label" echo " • No emails sent FROM this $check_label" echo " • No delivery attempts logged" echo "" print_warning "Possible reasons:" echo " 1. Email address/domain doesn't exist on this server" echo " 2. No email activity in the last $hours hours" echo " 3. Emails are going to a different mail server" echo "" # Check if domain exists if [ "$check_type" = "2" ]; then if grep -q "$target" /etc/localdomains 2>/dev/null || grep -q "$target" /etc/userdomains 2>/dev/null; then print_info "✓ Domain $target IS configured on this server" else print_warning "⚠ Domain $target NOT found in local domains" fi fi rm -f "$TEMP_MATCHES" exit 0 fi total_lines=$(wc -l < "$TEMP_MATCHES") print_success "✓ Found $total_lines log entries for $check_label" echo "" ################################################################################ # Categorize activity ################################################################################ print_header "📊 Activity Summary" echo "" # Count different types delivered=$(grep -ci "=> .*$search_pattern\|delivered.*$search_pattern" "$TEMP_MATCHES" || echo 0) sent=$(grep -ci "<=.*$search_pattern" "$TEMP_MATCHES" || echo 0) bounced=$(grep -ci "bounce.*$search_pattern\|failed.*$search_pattern\|550.*$search_pattern" "$TEMP_MATCHES" || echo 0) deferred=$(grep -ci "deferred.*$search_pattern\|retry.*$search_pattern\|temporarily rejected" "$TEMP_MATCHES" || echo 0) rejected=$(grep -ci "rejected.*$search_pattern\|denied.*$search_pattern\|blocked.*$search_pattern" "$TEMP_MATCHES" || echo 0) spf_fail=$(grep -ci "SPF.*fail.*$search_pattern" "$TEMP_MATCHES" || echo 0) dkim_fail=$(grep -ci "DKIM.*fail.*$search_pattern" "$TEMP_MATCHES" || echo 0) if [ "$delivered" -gt 0 ]; then print_success "✅ Delivered: $delivered emails successfully delivered" fi if [ "$sent" -gt 0 ]; then print_info "📤 Sent: $sent emails sent FROM this $check_label" fi if [ "$bounced" -gt 0 ]; then print_error "❌ Bounced: $bounced emails bounced/failed" fi if [ "$deferred" -gt 0 ]; then print_warning "⏸ Deferred: $deferred emails temporarily delayed" fi if [ "$rejected" -gt 0 ]; then print_error "🚫 Rejected: $rejected emails blocked/rejected" fi if [ "$spf_fail" -gt 0 ]; then print_warning "⚠ SPF Failures: $spf_fail authentication failures" fi if [ "$dkim_fail" -gt 0 ]; then print_warning "⚠ DKIM Failures: $dkim_fail signature failures" fi echo "" ################################################################################ # Show verdict ################################################################################ print_header "🔍 Diagnostic Result" echo "" if [ "$delivered" -gt 0 ] && [ "$bounced" -eq 0 ] && [ "$rejected" -eq 0 ]; then print_success "✅ EMAIL IS WORKING PROPERLY" echo "" echo "Evidence: $delivered successful deliveries in the last $hours hours" echo "No bounces or rejections detected" echo "Proof shown below with timestamps" echo "" elif [ "$delivered" -gt 0 ] && [ "$bounced" -gt 0 ]; then print_warning "⚠ EMAIL PARTIALLY WORKING" echo "" echo "Some emails delivered ($delivered) but some failed ($bounced)" echo "Check bounce reasons below for details" echo "" elif [ "$bounced" -gt 0 ] || [ "$rejected" -gt 0 ]; then print_error "❌ EMAIL HAS PROBLEMS" echo "" echo "Emails are being rejected or bouncing" echo "See details below for why" echo "" elif [ "$deferred" -gt 0 ]; then print_warning "⏸ EMAIL DELAYED" echo "" echo "Emails are being deferred (temporary failures)" echo "This usually resolves itself" echo "" else print_info "📬 EMAILS SENT, AWAITING CONFIRMATION" echo "" echo "Emails were sent but no delivery confirmation yet" echo "Check again in a few minutes" echo "" fi ################################################################################ # Show recent activity samples ################################################################################ if [ "$delivered" -gt 0 ]; then print_header "✅ Recent Successful Deliveries (last 5 from past $hours hours)" echo "" print_info "PROOF - These emails were delivered recently:" echo "" grep -i "=> .*$search_pattern\|delivered.*$search_pattern" "$TEMP_MATCHES" | tail -5 | while read line; do # Extract timestamp if present timestamp=$(echo "$line" | grep -oE '[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}|[A-Z][a-z]{2} [0-9]+ [0-9]{2}:[0-9]{2}:[0-9]{2}' | head -1) if [ -n "$timestamp" ]; then echo -e " ${GREEN}[$timestamp]${NC} $line" else echo " $line" fi done echo "" fi if [ "$bounced" -gt 0 ]; then print_header "❌ Recent Bounces/Failures (last 5 from past $hours hours)" echo "" print_warning "PROOF - These emails failed recently:" echo "" grep -i "bounce.*$search_pattern\|failed.*$search_pattern\|550.*$search_pattern" "$TEMP_MATCHES" | tail -5 | while read line; do timestamp=$(echo "$line" | grep -oE '[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}|[A-Z][a-z]{2} [0-9]+ [0-9]{2}:[0-9]{2}:[0-9]{2}' | head -1) if [ -n "$timestamp" ]; then echo -e " ${RED}[$timestamp]${NC} $line" else echo " $line" fi done echo "" # Extract bounce reasons print_header "Common Bounce Reasons" echo "" grep -i "bounce\|550\|fail" "$TEMP_MATCHES" | grep -oE "550 .*|User unknown|Mailbox.*full|Relay.*denied|blocked" | sort | uniq -c | sort -rn | head -5 echo "" fi if [ "$rejected" -gt 0 ]; then print_header "🚫 Recent Rejections (last 5)" echo "" grep -i "rejected.*$search_pattern\|denied.*$search_pattern\|blocked.*$search_pattern" "$TEMP_MATCHES" | tail -5 | while read line; do echo " $line" done echo "" fi if [ "$spf_fail" -gt 0 ] || [ "$dkim_fail" -gt 0 ]; then print_header "⚠ Authentication Issues" echo "" if [ "$spf_fail" -gt 0 ]; then echo "SPF failures detected:" grep -i "SPF.*fail" "$TEMP_MATCHES" | head -3 echo "" fi if [ "$dkim_fail" -gt 0 ]; then echo "DKIM failures detected:" grep -i "DKIM.*fail" "$TEMP_MATCHES" | head -3 echo "" fi fi ################################################################################ # Recommendations ################################################################################ print_header "💡 Recommendations" echo "" if [ "$bounced" -gt 0 ]; then echo "To fix bounces:" echo " 1. Verify the recipient email address is correct" echo " 2. Check if recipient mailbox is full" echo " 3. Ensure domain DNS is configured properly" echo "" fi if [ "$rejected" -gt 0 ]; then echo "To fix rejections:" echo " 1. Check if server IP is blacklisted (use Blacklist Check tool)" echo " 2. Verify SPF/DKIM/DMARC records are correct" echo " 3. Check if recipient is blocking your domain" echo "" fi if [ "$spf_fail" -gt 0 ]; then echo "To fix SPF failures:" echo " 1. Add this server's IP to domain's SPF record" echo " 2. Use SPF/DKIM/DMARC Check tool for details" echo "" fi ################################################################################ # Save full report ################################################################################ REPORT_FILE="/tmp/email_diag_${target//[@.]/_}_$(date +%Y%m%d_%H%M%S).txt" cp "$TEMP_MATCHES" "$REPORT_FILE" print_info "Full log saved to: $REPORT_FILE" echo "" # Cleanup rm -f "$TEMP_MATCHES"