Symfony 4 Swift Mailer无法发送邮件:本地注册无确认邮件
Alright, let's tackle this registration email issue with Symfony 4 and FOSUserBundle step by step. I’ve dealt with this exact problem dozens of times, so let’s walk through the fixes that usually resolve it.
In Symfony 4, SwiftMailer relies on two key files, and it’s easy to mix them up:
.env(or.env.local): This is where you define your mailer credentials..env.localtakes priority over.env, so if you have both, check the local one first—often people edit.envbut the local file has old settings.config/packages/swiftmailer.yaml: This file references your.envvariables and controls SwiftMailer’s behavior (like spooling).
Mailtrap is great for testing because it doesn’t rely on email provider restrictions. Here’s the correct setup:
Step 2.1: Update .env (or .env.local)
Add this line, replacing the username/password with your Mailtrap credentials:
MAILER_URL=smtp://smtp.mailtrap.io:2525?encryption=tls&username=your-mailtrap-username&password=your-mailtrap-password
Step 2.2: Verify swiftmailer.yaml
Make sure it’s pulling the environment variable correctly:
swiftmailer: url: '%env(MAILER_URL)%' spool: { type: 'memory' } # Critical: This stores emails in memory until you trigger sending
Step 2.3: Trigger Spooled Emails
In dev mode, Symfony doesn’t send emails immediately—they’re held in the spool. Run this command to send any queued messages:
php bin/console swiftmailer:spool:send
Check your Mailtrap inbox after running this—you should see the confirmation email there.
Gmail’s security rules changed, so you can’t use your regular password anymore. Here’s how to set it up properly:
Step 3.1: Prepare Your Google Account
- Enable 2-Step Verification on your Google account.
- Generate an App Password (this is the password you’ll use in Symfony, not your regular Gmail password).
Step 3.2: Update .env
MAILER_URL=smtp://your-email@gmail.com:your-app-password@smtp.gmail.com:587?encryption=tls&auth_mode=login
Step 3.3: Check Gmail’s Security Settings
Go to your Google Account’s Security tab and look for "Unusual activity" alerts—you might need to approve the Symfony server’s login attempt.
Even if SwiftMailer is set up right, FOSUserBundle might not be triggering the email. Double-check config/packages/fos_user.yaml:
fos_user: # ... other config (firewall, user class, etc.) registration: confirmation: enabled: true # THIS IS NON-NEGOTIABLE—if it's false, no email sends template: '@FOSUser/Registration/email.txt.twig' # Use the HTML template if you prefer from_email: address: noreply@your-app.com # This shows as the sender sender_name: Your App Name
Make sure enabled: true is set under registration.confirmation—this is the most common oversight.
You said dev.log has no errors? That usually means emails are being spooled, not actually failing to send. Here’s how to dig deeper:
- Check for spool logs: Look in
var/log/dev.logfor lines likeStored mail in spool—that confirms the email is queued, not sent. Run theswiftmailer:spool:sendcommand to push it through. - Test with a manual email: Create a quick test controller to send a direct email, bypassing FOSUserBundle, to rule out bundle-specific issues:
// src/Controller/TestMailController.php namespace App\Controller; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Response; use Swift_Mailer; use Swift_Message; class TestMailController extends AbstractController { public function sendTest(Swift_Mailer $mailer): Response { $message = (new Swift_Message('Test Email')) ->setFrom('noreply@your-app.com') ->setTo('your-personal-email@example.com') ->setBody('If you get this, SwiftMailer is working!'); $mailer->send($message); return new Response('Test email sent—check your inbox!'); } }
Add a route for this controller, visit it, and see if the test email arrives. If it does, the problem is with FOSUserBundle’s configuration, not SwiftMailer.
- Check server port access: Some hosting providers block SMTP ports (like 587 or 2525). Ask your host if these ports are open, or use port 465 as a fallback (with
encryption=ssl).
If none of the above works, share:
- The full content of
swiftmailer.yaml - The full content of
fos_user.yaml - Any lines from
dev.logrelated to SwiftMailer or FOSUserBundle
That’ll help narrow down the exact issue.
内容的提问来源于stack exchange,提问作者Alvaro Garcia Solano

