Email / SMTP Setup
FeedbackPulse sends various transactional emails. Proper email configuration is important for:
- Welcome emails to new tenants
- Team invitation links
- Password reset emails
- Email OTP verification (for geri bildirim formus)
- Daily/weekly digests
- Scheduled reports
- Usage alerts
- Plan change notifications
⚙️ Yapilandirma Methods
Method 1: Via Admin Panel (Recommended)
- Giris yapin as superadmin
- Su adrese gidin Admin → Ayarlar → Email
- Fill in your SMTP details
- Click Send Test Email to verify
- Save
Method 2: Via .env File
MAIL_MAILER=smtp
MAIL_HOST=smtp.mailgun.org
MAIL_PORT=587
MAIL_USERNAME=your_username
MAIL_PASSWORD=your_password
MAIL_ENCRYPTION=tls
[email protected]
MAIL_FROM_NAME="FeedbackPulse"
📮 Provider-Specific Setup
📧 Gmail
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
[email protected]
MAIL_PASSWORD=your_app_password
MAIL_ENCRYPTION=tls
⚠️ Onemli: Gmail requires an App Password, not your regular password.
- Su adrese gidin Google Account Guvenlik
- Enable 2-Step Verification (required)
- Su adrese gidin App passwords → select "Mail" → generate
- Use the generated 16-character password
🔴 Gmail limits: 500 emails/day (personal) or 2,000/day (Workspace). Not recommended for production SaaS.
🔫 Mailgun
MAIL_HOST=smtp.mailgun.org
MAIL_PORT=587
[email protected]
MAIL_PASSWORD=your_mailgun_smtp_password
MAIL_ENCRYPTION=tls
- Kaydolun at Mailgun
- Add your domain → verify DNS records
- Su adrese gidin Sending → Domain Ayarlar → SMTP credentials
- Copy the SMTP password
📦 Amazon SES
MAIL_HOST=email-smtp.us-east-1.amazonaws.com
MAIL_PORT=587
MAIL_USERNAME=your_ses_smtp_username
MAIL_PASSWORD=your_ses_smtp_password
MAIL_ENCRYPTION=tls
- Su adrese gidin AWS SES Console
- Verify your domain
- Su adrese gidin SMTP Ayarlar → Create SMTP Credentials
- Move out of sandbox mode for production
📨 SendGrid
MAIL_HOST=smtp.sendgrid.net
MAIL_PORT=587
MAIL_USERNAME=apikey
MAIL_PASSWORD=your_sendgrid_api_key
MAIL_ENCRYPTION=tls
💡 Not: The username is literally
apikey(not your email). The password is your SendGrid API key.
✉️ Postmark
MAIL_HOST=smtp.postmarkapp.com
MAIL_PORT=587
MAIL_USERNAME=your_postmark_server_api_token
MAIL_PASSWORD=your_postmark_server_api_token
MAIL_ENCRYPTION=tls
🔵 ZOHO Mail
MAIL_HOST=smtp.zoho.com
MAIL_PORT=587
[email protected]
MAIL_PASSWORD=your_zoho_password
MAIL_ENCRYPTION=tls
🧪 Mailtrap (Testing Only!)
MAIL_HOST=sandbox.smtp.mailtrap.io
MAIL_PORT=587
MAIL_USERNAME=your_mailtrap_username
MAIL_PASSWORD=your_mailtrap_password
MAIL_ENCRYPTION=tls
⚠️ Mailtrap is for development/testing only. Emails are captured in your Mailtrap inbox and never delivered to real recipients.
🧪 Testing Email
Via Admin Panel
- Su adrese gidin Admin → Ayarlar → Email
- Click Send Test Email
- Check your inbox
Via Command Line
php artisan tinker
Mail::raw('Test email from FeedbackPulse', function ($message) {
$message->to('[email protected]')->subject('SMTP Test');
});
📨 Emails Sent by FeedbackPulse
| When | Recipient | |
|---|---|---|
| Welcome | New tenant registers | Tenant admin |
| Team Invitation | Admin invites team member | Invitee email |
| Plan Changed | Subscription changes | Tenant admin |
| New Submission Alert | New feedback received | Tenant admin/staff |
| Email Digest | Daily/weekly schedule | Tenant admin |
| Scheduled Report | Daily/weekly/monthly | Tenant admin |
| Usage Alert | 90%+ of plan limit | Tenant admin |
| Password Reset | User requests reset | Requesting user |
| Email Verification | New registration | New user |
| OTP Code | Feedback form with OTP | End user submitting feedback |
🐛 Sorun Giderme Email
| Issue | Solution |
|---|---|
| Emails not sending | Check .env SMTP settings. Try MAIL_MAILER=log to test without SMTP. Check storage/logs/laravel.log. |
| Emails going to spam | Add SPF, DKIM, and DMARC records to your domain's DNS. Use a reputable SMTP provider. |
| "Connection timed out" | Port 587/465 might be blocked by your hosting provider. Try a different port or provider. |
| Gmail "Less secure apps" error | Use App Password instead. See Gmail section above. |
| Emails delayed | If using QUEUE_CONNECTION=database, make sure the queue worker is running. |