207 lines
6.0 KiB
Bash
Executable File
207 lines
6.0 KiB
Bash
Executable File
#!/bin/bash
|
|
# Simulate Bounce Events for Testing
|
|
# This script inserts bounce data directly into the database to test the UI
|
|
# without needing to set up AWS SNS
|
|
|
|
set -e
|
|
|
|
echo "=== Bounce Simulation Script ==="
|
|
echo
|
|
echo "This script will create test bounce events for existing members"
|
|
echo
|
|
|
|
# Get database password from .env
|
|
DB_PASSWORD=$(grep MYSQL_ROOT_PASSWORD /home/jamesp/docker/maillist/.env | cut -d'=' -f2)
|
|
|
|
# Check if containers are running
|
|
if ! sudo docker-compose ps | grep -q "maillist-mysql.*Up"; then
|
|
echo "❌ MySQL container is not running. Starting containers..."
|
|
sudo docker-compose up -d
|
|
echo "Waiting for MySQL to be ready..."
|
|
sleep 5
|
|
fi
|
|
|
|
echo "1. Fetching existing members..."
|
|
echo
|
|
|
|
# Get list of members
|
|
MEMBERS=$(sudo docker-compose exec -T mysql mysql -u root -p"$DB_PASSWORD" maillist -N -e "SELECT member_id, name, email FROM members LIMIT 5;")
|
|
|
|
if [ -z "$MEMBERS" ]; then
|
|
echo "❌ No members found in database. Please add members first."
|
|
exit 1
|
|
fi
|
|
|
|
echo "Available members:"
|
|
echo "$MEMBERS" | while read -r line; do
|
|
MEMBER_ID=$(echo "$line" | awk '{print $1}')
|
|
NAME=$(echo "$line" | awk '{print $2, $3}')
|
|
EMAIL=$(echo "$line" | awk '{$1=""; $2=""; print $0}' | xargs)
|
|
echo " [$MEMBER_ID] $NAME - $EMAIL"
|
|
done
|
|
echo
|
|
|
|
# Prompt for member ID
|
|
read -p "Enter member ID to simulate bounce for (or press Enter for first member): " MEMBER_ID
|
|
|
|
if [ -z "$MEMBER_ID" ]; then
|
|
MEMBER_ID=$(echo "$MEMBERS" | head -1 | awk '{print $1}')
|
|
echo "Using member ID: $MEMBER_ID"
|
|
fi
|
|
|
|
# Get member details
|
|
MEMBER_INFO=$(sudo docker-compose exec -T mysql mysql -u root -p"$DB_PASSWORD" maillist -N -e "SELECT member_id, name, email FROM members WHERE member_id = $MEMBER_ID;")
|
|
|
|
if [ -z "$MEMBER_INFO" ]; then
|
|
echo "❌ Member ID $MEMBER_ID not found"
|
|
exit 1
|
|
fi
|
|
|
|
MEMBER_EMAIL=$(echo "$MEMBER_INFO" | awk '{$1=""; $2=""; print $0}' | xargs)
|
|
MEMBER_NAME=$(echo "$MEMBER_INFO" | awk '{print $2, $3}')
|
|
|
|
echo
|
|
echo "Selected member: $MEMBER_NAME ($MEMBER_EMAIL)"
|
|
echo
|
|
|
|
# Bounce type selection
|
|
echo "Select bounce type to simulate:"
|
|
echo " 1) Soft Bounce (Transient - e.g., mailbox full)"
|
|
echo " 2) Hard Bounce (Permanent - e.g., invalid address)"
|
|
echo " 3) Multiple Soft Bounces (3 bounces to trigger soft_bounce status)"
|
|
echo " 4) Undetermined Bounce"
|
|
echo
|
|
read -p "Enter choice (1-4): " BOUNCE_CHOICE
|
|
|
|
case $BOUNCE_CHOICE in
|
|
1)
|
|
BOUNCE_TYPE="Transient"
|
|
BOUNCE_SUBTYPE="MailboxFull"
|
|
DIAGNOSTIC="smtp; 452 4.2.2 Mailbox full"
|
|
COUNT=1
|
|
;;
|
|
2)
|
|
BOUNCE_TYPE="Permanent"
|
|
BOUNCE_SUBTYPE="General"
|
|
DIAGNOSTIC="smtp; 550 5.1.1 User unknown"
|
|
COUNT=1
|
|
;;
|
|
3)
|
|
BOUNCE_TYPE="Transient"
|
|
BOUNCE_SUBTYPE="General"
|
|
DIAGNOSTIC="smtp; 451 4.4.1 Temporary failure"
|
|
COUNT=3
|
|
;;
|
|
4)
|
|
BOUNCE_TYPE="Undetermined"
|
|
BOUNCE_SUBTYPE=""
|
|
DIAGNOSTIC="Unknown error occurred"
|
|
COUNT=1
|
|
;;
|
|
*)
|
|
echo "Invalid choice"
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
echo
|
|
echo "Simulating $COUNT bounce event(s)..."
|
|
echo
|
|
|
|
# Insert bounce events
|
|
for i in $(seq 1 $COUNT); do
|
|
TIMESTAMP=$(date -u -d "-$((i * 24)) hours" '+%Y-%m-%d %H:%M:%S')
|
|
FEEDBACK_ID="test-feedback-$(date +%s)-$i"
|
|
|
|
echo "Creating bounce event $i/$COUNT (timestamp: $TIMESTAMP)..."
|
|
|
|
sudo docker-compose exec -T mysql mysql -u root -p"$DB_PASSWORD" maillist <<EOF
|
|
-- Insert bounce log
|
|
INSERT INTO bounce_logs (member_id, email, bounce_type, bounce_subtype, diagnostic_code, timestamp, feedback_id)
|
|
VALUES ($MEMBER_ID, '$MEMBER_EMAIL', '$BOUNCE_TYPE', '$BOUNCE_SUBTYPE', '$DIAGNOSTIC', '$TIMESTAMP', '$FEEDBACK_ID');
|
|
EOF
|
|
|
|
# Update member bounce status
|
|
if [ "$BOUNCE_TYPE" = "Permanent" ]; then
|
|
echo " → Hard bounce: Deactivating member..."
|
|
sudo docker-compose exec -T mysql mysql -u root -p"$DB_PASSWORD" maillist <<EOF
|
|
UPDATE members
|
|
SET bounce_count = bounce_count + 1,
|
|
last_bounce_at = '$TIMESTAMP',
|
|
bounce_status = 'hard_bounce',
|
|
active = 0
|
|
WHERE member_id = $MEMBER_ID;
|
|
EOF
|
|
elif [ "$BOUNCE_TYPE" = "Transient" ]; then
|
|
# Check current bounce count
|
|
CURRENT_COUNT=$(sudo docker-compose exec -T mysql mysql -u root -p"$DB_PASSWORD" maillist -N -e "SELECT bounce_count FROM members WHERE member_id = $MEMBER_ID;")
|
|
NEW_COUNT=$((CURRENT_COUNT + 1))
|
|
|
|
if [ $NEW_COUNT -ge 3 ]; then
|
|
echo " → Soft bounce threshold reached: Marking as soft_bounce..."
|
|
BOUNCE_STATUS="soft_bounce"
|
|
else
|
|
echo " → Soft bounce: Incrementing counter ($NEW_COUNT)..."
|
|
BOUNCE_STATUS="clean"
|
|
fi
|
|
|
|
sudo docker-compose exec -T mysql mysql -u root -p"$DB_PASSWORD" maillist <<EOF
|
|
UPDATE members
|
|
SET bounce_count = $NEW_COUNT,
|
|
last_bounce_at = '$TIMESTAMP',
|
|
bounce_status = '$BOUNCE_STATUS'
|
|
WHERE member_id = $MEMBER_ID;
|
|
EOF
|
|
else
|
|
echo " → Undetermined bounce: Incrementing counter..."
|
|
sudo docker-compose exec -T mysql mysql -u root -p"$DB_PASSWORD" maillist <<EOF
|
|
UPDATE members
|
|
SET bounce_count = bounce_count + 1,
|
|
last_bounce_at = '$TIMESTAMP'
|
|
WHERE member_id = $MEMBER_ID;
|
|
EOF
|
|
fi
|
|
done
|
|
|
|
echo
|
|
echo "✅ Bounce simulation complete!"
|
|
echo
|
|
|
|
# Show updated member status
|
|
echo "Updated member status:"
|
|
sudo docker-compose exec -T mysql mysql -u root -p"$DB_PASSWORD" maillist -e "
|
|
SELECT
|
|
member_id,
|
|
name,
|
|
email,
|
|
active,
|
|
bounce_count,
|
|
last_bounce_at,
|
|
bounce_status
|
|
FROM members
|
|
WHERE member_id = $MEMBER_ID\G
|
|
"
|
|
|
|
echo
|
|
echo "Bounce history for this member:"
|
|
sudo docker-compose exec -T mysql mysql -u root -p"$DB_PASSWORD" maillist -e "
|
|
SELECT
|
|
bounce_id,
|
|
bounce_type,
|
|
bounce_subtype,
|
|
diagnostic_code,
|
|
timestamp
|
|
FROM bounce_logs
|
|
WHERE member_id = $MEMBER_ID
|
|
ORDER BY timestamp DESC;
|
|
"
|
|
|
|
echo
|
|
echo "🎉 You can now view this bounce in the web UI:"
|
|
echo " 1. Open http://localhost:3000"
|
|
echo " 2. Go to the Members tab"
|
|
echo " 3. Look for $MEMBER_NAME"
|
|
echo " 4. Click the 'Bounces' button to see the history"
|
|
echo
|
|
echo "To simulate more bounces, run this script again!"
|