SES SNS Bounce Handling
This commit is contained in:
206
simulate_bounce.sh
Executable file
206
simulate_bounce.sh
Executable file
@@ -0,0 +1,206 @@
|
||||
#!/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!"
|
||||
Reference in New Issue
Block a user