Skip to content

Email Configuration Guide ​

This guide explains how to set up and use email configurations for Meo Mai Moi.

Quick Setup ​

bash
# Set up configurations with your credentials
php artisan email:setup \
  --smtp-username=your-email@gmail.com \
  --smtp-password=your-app-password \
  --mailgun-api-key=key-your-actual-api-key \
  --activate=smtp

# Or set up without credentials (update later in admin panel)
php artisan email:setup

Using Database Seeder ​

bash
php artisan db:seed --class=EmailConfigurationSeeder

Configuration Details ​

SMTP and Mailgun configurations can be pre-configured with:

  • Domain: your sending domain
  • From Email: your sender address
  • From Name: Meo Mai Moi
  • Test Email: a monitored test recipient

SMTP Configuration ​

  • Host: smtp.gmail.com
  • Port: 587
  • Encryption: tls
  • Username: Your Gmail address
  • Password: Your Gmail app password

Mailgun Configuration ​

  • Domain: your Mailgun sending domain
  • Endpoint: api.mailgun.net
  • API Key: Your Mailgun API key

Admin Panel Usage ​

Accessing Email Configurations ​

  1. Go to /admin/email-configurations
  2. View, edit, or create new configurations
  3. Test configurations using the "Send Test Email" button

Testing Email Configurations ​

  1. Both SMTP and Mailgun now require a Test Email Address
  2. Test emails are sent to the configured test address by default
  3. All test emails now appear in /admin/email-logs

Viewing Email Logs ​

  1. Go to /admin/email-logs
  2. View all sent emails including test emails
  3. Check delivery status and error messages
  4. Retry failed emails if needed

Email Status Lifecycle ​

Email logs track the full delivery lifecycle with Mailgun webhook integration:

  • pending: Initial state when queued
  • accepted: Mailgun has accepted the email for delivery (replaces legacy "sent" status)
  • delivered: Email successfully delivered to recipient's mail server
  • opened: Recipient opened the email (tracking pixel)
  • clicked: Recipient clicked a link in the email
  • unsubscribed: Recipient unsubscribed via Mailgun
  • complained: Recipient marked email as spam
  • failed: Permanent delivery failure

Additional tracking fields:

  • opened_at, clicked_at, unsubscribed_at, complained_at, permanent_fail_at

Idempotency Protection ​

Email verification notifications use idempotency to prevent duplicate sends:

  • Default window: 30 seconds (configurable via EMAIL_VERIFICATION_IDEMPOTENCY_SECONDS)
  • Applied at: notification channel, registration response, resend endpoint
  • See config/notifications.php for configuration

Mailgun Webhook Setup ​

Configure webhook in Mailgun dashboard to track delivery events:

POST /webhooks/mailgun

Required events: delivered, opened, clicked, unsubscribed, complained, permanent_fail

Webhook requests are rejected unless the Mailgun signing key is configured and the request contains a valid, fresh signature. Invalid signature attempts are logged with a sanitized failure reason (missing_signing_key, missing_signature_fields, expired_signature_timestamp, or signature_mismatch) to make delivery/debugging issues visible without logging the raw signature payload.

New Features ​

Test Email Address for Mailgun ​

  • Mailgun configurations now have a "Test Email Address" field
  • Consistent experience between SMTP and Mailgun
  • Required for sending test emails

Test Emails in Email Logs ​

  • All test emails are now logged in the database
  • Visible in the admin panel at /admin/email-logs
  • Proper status tracking (pending → sent/failed)
  • Error messages for failed test emails

Troubleshooting ​

Test Email Not Received ​

  1. Check /admin/email-logs for delivery status
  2. Verify the test email address is correct
  3. Check spam folder
  4. Ensure email configuration is valid and active

Database Connection Issues ​

If you see database connection errors:

  1. Ensure your database is running
  2. Check your .env file database settings
  3. Run php artisan migrate if needed

Gmail SMTP Issues ​

  1. Use an App Password, not your regular password
  2. Enable 2-factor authentication first
  3. Generate App Password in Google Account settings

Mailgun Issues ​

  1. Verify your domain is properly configured in Mailgun
  2. Check your API key is correct and active
  3. Ensure your domain is verified in Mailgun dashboard

Commands Reference ​

bash
# Setup email configurations
php artisan email:setup

# Setup with credentials
php artisan email:setup --smtp-username=email@gmail.com --smtp-password=password

# Setup and activate SMTP
php artisan email:setup --activate=smtp

# Setup and activate Mailgun
php artisan email:setup --activate=mailgun

# Run email configuration seeder
php artisan db:seed --class=EmailConfigurationSeeder

# Check migration status
php artisan migrate:status

# Run migrations
php artisan migrate

Security Notes ​

  • Never commit real credentials to version control
  • Use environment variables for sensitive data
  • Regularly rotate API keys and passwords
  • Use App Passwords for Gmail SMTP