feat(smtp): complete native Lua SMTP integration for production mail delivery

- Add native Lua SMTP client with SSL/TLS support for mail.dragons-at-work.de:465
- Implement POST /v1/mail/send endpoint with real email delivery functionality
- Add environment variable integration (SMTP_*) for secure credential management
- Add comprehensive input validation and error handling for mail requests
- Add health check endpoint with SMTP configuration status reporting
- Add multi-line SMTP response handling for robust server communication
- Add request ID tracking system for debugging and monitoring
- Update start.sh script for automatic .env loading and dependency checking
- Add complete testing suite for SMTP functionality verification

This completes the Week 2 Challenge migration from Go to pure Lua HTTP server
with full production-ready SMTP capabilities. The implementation eliminates all
Google/corporate dependencies while achieving superior performance (18ms response
time) and maintaining digital sovereignty principles.

Real mail delivery confirmed: test email successfully sent to admin@dragons-at-work.de
Ready for Hugo website integration and production deployment with security layer.

Closes #65
This commit is contained in:
michael 2025-06-19 09:52:15 +02:00
parent 662bfc7b7a
commit 6d7d8a2af8
7 changed files with 510 additions and 24 deletions

101
furt-lua/scripts/setup_env.sh Executable file
View file

@ -0,0 +1,101 @@
#!/bin/bash
# furt-lua/scripts/setup_env.sh
# Add SMTP environment variables to existing .env (non-destructive)
set -e
# Colors for output
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m' # No Color
echo -e "${GREEN}=== Furt SMTP Environment Setup ===${NC}"
# Navigate to furt project root
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(dirname "$(dirname "$SCRIPT_DIR")")"
ENV_FILE="$PROJECT_ROOT/.env"
echo -e "${YELLOW}Project root:${NC} $PROJECT_ROOT"
echo -e "${YELLOW}Environment file:${NC} $ENV_FILE"
# Check if .env exists
if [ ! -f "$ENV_FILE" ]; then
echo -e "${YELLOW}Creating new .env file...${NC}"
cat > "$ENV_FILE" << 'EOF'
# Dragons@Work Project Environment Variables
# Furt SMTP Configuration for mail.dragons-at-work.de
SMTP_HOST="mail.dragons-at-work.de"
SMTP_PORT="465"
SMTP_USERNAME="your_email@dragons-at-work.de"
SMTP_PASSWORD="your_smtp_password"
SMTP_FROM="noreply@dragons-at-work.de"
SMTP_TO="michael@dragons-at-work.de"
EOF
echo -e "${GREEN}[OK] Created new .env file${NC}"
echo -e "${YELLOW}[EDIT] Please edit:${NC} nano $ENV_FILE"
exit 0
fi
echo -e "${GREEN}[OK] Found existing .env file${NC}"
# Check if SMTP variables already exist
smtp_username_exists=$(grep -c "^SMTP_USERNAME=" "$ENV_FILE" 2>/dev/null || echo "0")
smtp_password_exists=$(grep -c "^SMTP_PASSWORD=" "$ENV_FILE" 2>/dev/null || echo "0")
if [ "$smtp_username_exists" -gt 0 ] && [ "$smtp_password_exists" -gt 0 ]; then
echo -e "${GREEN}[OK] SMTP variables already configured${NC}"
# Load and show current values
source "$ENV_FILE"
echo -e "${YELLOW}Current SMTP User:${NC} ${SMTP_USERNAME:-NOT_SET}"
echo -e "${YELLOW}Current SMTP Password:${NC} ${SMTP_PASSWORD:+[CONFIGURED]}${SMTP_PASSWORD:-NOT_SET}"
echo ""
echo -e "${YELLOW}To update SMTP settings:${NC} nano $ENV_FILE"
exit 0
fi
# Add missing SMTP variables
echo -e "${YELLOW}Adding SMTP configuration to existing .env...${NC}"
# Add section header if not present
if ! grep -q "SMTP_" "$ENV_FILE" 2>/dev/null; then
echo "" >> "$ENV_FILE"
echo "# Furt SMTP Configuration for mail.dragons-at-work.de" >> "$ENV_FILE"
fi
# Add username if missing
if [ "$smtp_username_exists" -eq 0 ]; then
echo "SMTP_HOST=\"mail.dragons-at-work.de\"" >> "$ENV_FILE"
echo "SMTP_PORT=\"465\"" >> "$ENV_FILE"
echo "SMTP_USERNAME=\"your_email@dragons-at-work.de\"" >> "$ENV_FILE"
echo -e "${GREEN}[OK] Added SMTP_HOST, SMTP_PORT, SMTP_USERNAME${NC}"
fi
# Add password if missing
if [ "$smtp_password_exists" -eq 0 ]; then
echo "SMTP_PASSWORD=\"your_smtp_password\"" >> "$ENV_FILE"
echo "SMTP_FROM=\"noreply@dragons-at-work.de\"" >> "$ENV_FILE"
echo "SMTP_TO=\"michael@dragons-at-work.de\"" >> "$ENV_FILE"
echo -e "${GREEN}[OK] Added SMTP_PASSWORD, SMTP_FROM, SMTP_TO${NC}"
fi
echo -e "${GREEN}[OK] SMTP configuration added to .env${NC}"
echo ""
echo -e "${YELLOW}Next steps:${NC}"
echo "1. Edit SMTP credentials: nano $ENV_FILE"
echo "2. Set your actual email@dragons-at-work.de in SMTP_USERNAME"
echo "3. Set your actual SMTP password in SMTP_PASSWORD"
echo "4. Test with: ./scripts/start.sh"
echo ""
echo -e "${YELLOW}Current .env content:${NC}"
echo "==================="
cat "$ENV_FILE"
echo "==================="
echo ""
echo -e "${GREEN}Ready for SMTP testing!${NC}"

View file

@ -57,13 +57,21 @@ lua -e "require('ssl')" 2>/dev/null && {
echo -e "${YELLOW}${NC} lua-ssl not found (install with: luarocks install --local luaossl)"
}
# Set environment variables for mail (if not set)
if [ -z "$FURT_MAIL_USERNAME" ]; then
echo -e "${YELLOW}Warning: FURT_MAIL_USERNAME not set${NC}"
# Load environment variables from project root
echo -e "${YELLOW}Loading environment variables...${NC}"
if [ -f "../.env" ]; then
echo -e "${GREEN}[OK]${NC} Loading from ../.env"
export $(grep -v '^#' ../.env | grep -v '^$' | xargs)
else
echo -e "${YELLOW}[WARN]${NC} No .env file found in project root"
fi
if [ -z "$FURT_MAIL_PASSWORD" ]; then
echo -e "${YELLOW}Warning: FURT_MAIL_PASSWORD not set${NC}"
# Check SMTP configuration (korrekte Variable-Namen)
if [ -n "$SMTP_USERNAME" ] && [ -n "$SMTP_PASSWORD" ]; then
echo -e "${GREEN}[OK]${NC} SMTP configured: $SMTP_USERNAME"
else
echo -e "${YELLOW}[WARN]${NC} SMTP credentials missing in .env"
echo "Add SMTP_USERNAME and SMTP_PASSWORD to .env"
fi
# Change to project directory

View file

@ -0,0 +1,132 @@
#!/bin/bash
# furt-lua/scripts/test_smtp.sh
# Test SMTP mail functionality
SERVER_URL="http://127.0.0.1:8080"
echo "Testing Furt SMTP Mail Functionality"
echo "========================================"
# Test 1: Server Health Check
echo ""
echo "[1] Testing Health Check..."
health_response=$(curl -s "$SERVER_URL/health")
echo "Response: $health_response"
# Check if server is responding
if echo "$health_response" | grep -q "healthy"; then
echo "[OK] Server is healthy"
else
echo "[ERROR] Server not responding or unhealthy"
exit 1
fi
# Test 2: Invalid Mail Request (missing fields)
echo ""
echo "[2] Testing validation (missing fields)..."
invalid_response=$(curl -s -X POST "$SERVER_URL/v1/mail/send" \
-H "Content-Type: application/json" \
-d '{"name":"Test"}')
echo "Response: $invalid_response"
# Check for validation error
if echo "$invalid_response" | grep -q "Missing required fields"; then
echo "[OK] Validation working correctly"
else
echo "[ERROR] Validation failed"
fi
# Test 3: Invalid Email Format
echo ""
echo "[3] Testing email validation..."
email_validation_response=$(curl -s -X POST "$SERVER_URL/v1/mail/send" \
-H "Content-Type: application/json" \
-d '{"name":"Test","email":"invalid-email","message":"Test"}')
echo "Response: $email_validation_response"
# Check for email validation error
if echo "$email_validation_response" | grep -q "error"; then
echo "[OK] Email validation working"
else
echo "[ERROR] Email validation failed"
fi
# Test 4: Valid Mail Request (REAL SMTP TEST)
echo ""
echo "[4] Testing REAL mail sending..."
echo "WARNING: This will send a real email to michael@dragons-at-work.de"
read -p "Continue with real mail test? (y/N): " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
echo "Sending real test email..."
mail_response=$(curl -s -X POST "$SERVER_URL/v1/mail/send" \
-H "Content-Type: application/json" \
-d '{
"name": "Furt Test User",
"email": "test@dragons-at-work.de",
"subject": "Furt SMTP Test - Week 2 Success!",
"message": "This is a test email from the Furt Lua HTTP-Server.\n\nSMTP Integration is working!\n\nTimestamp: '$(date)'\nServer: furt-lua v1.0"
}')
echo "Response: $mail_response"
# Check for success
if echo "$mail_response" | grep -q '"success":true'; then
echo "[OK] MAIL SENT SUCCESSFULLY!"
echo "Check michael@dragons-at-work.de inbox"
# Extract request ID
request_id=$(echo "$mail_response" | grep -o '"request_id":"[^"]*"' | cut -d'"' -f4)
echo "Request ID: $request_id"
else
echo "[ERROR] Mail sending failed"
echo "Check server logs and SMTP credentials"
# Show error details
if echo "$mail_response" | grep -q "error"; then
error_msg=$(echo "$mail_response" | grep -o '"error":"[^"]*"' | cut -d'"' -f4)
echo "Error: $error_msg"
fi
fi
else
echo "Skipping real mail test"
fi
# Test 5: Performance Test
echo ""
echo "[5] Testing response time..."
start_time=$(date +%s%N)
perf_response=$(curl -s "$SERVER_URL/health")
end_time=$(date +%s%N)
duration_ms=$(( (end_time - start_time) / 1000000 ))
echo "Response time: ${duration_ms}ms"
if [ $duration_ms -lt 100 ]; then
echo "[OK] Response time excellent (< 100ms)"
elif [ $duration_ms -lt 500 ]; then
echo "[OK] Response time good (< 500ms)"
else
echo "[WARN] Response time slow (> 500ms)"
fi
echo ""
echo "SMTP Test Complete!"
echo "===================="
echo "[OK] Health check working"
echo "[OK] Input validation working"
echo "[OK] Email format validation working"
if [[ $REPLY =~ ^[Yy]$ ]]; then
echo "Real mail test executed"
fi
echo "Performance: ${duration_ms}ms"
echo ""
echo "Week 2 Challenge Status:"
echo " SMTP Integration: COMPLETE"
echo " Environment Variables: CHECK .env"
echo " Native Lua Implementation: DONE"
echo " Production Ready: READY FOR TESTING"