You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel原生SwiftMailer能否通过XOAUTH2认证对接G Suites邮箱?

XOAUTH2 Authentication for Gmail SMTP in Laravel with SwiftMailer

Absolutely! You can implement XOAUTH2 authentication for Gmail/G Suite SMTP in Laravel using its native SwiftMailer integration—you just need to extend the default SMTP driver to use an OAuth2 authenticator instead of standard password-based auth. Here's a step-by-step guide tailored to your scenario (since you already have a valid clientId, clientSecret, and refreshToken):

1. Install Required Dependency

First, install the Google OAuth2 client package, which SwiftMailer will use to handle token refresh and authentication:

composer require league/oauth2-google

2. Update Environment Configuration

Add your OAuth2 credentials to your .env file, along with the standard Gmail SMTP settings (note we leave MAIL_PASSWORD empty since we're using OAuth2):

MAIL_MAILER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=your-gsuite-email@your-domain.com
MAIL_PASSWORD=
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=your-gsuite-email@your-domain.com
MAIL_FROM_NAME="${APP_NAME}"

# Google OAuth2 Credentials
GOOGLE_CLIENT_ID=your-existing-client-id
GOOGLE_CLIENT_SECRET=your-existing-client-secret
GOOGLE_REFRESH_TOKEN=your-existing-refresh-token

3. Extend the SMTP Mail Driver

Next, we'll override Laravel's default SMTP driver to use the XOAUTH2 authenticator. Add this code to the boot() method of your App\Providers\AppServiceProvider.php:

use Illuminate\Support\Facades\Mail;
use Swift_SmtpTransport;
use Swift_Transport_Esmtp_Auth_XOAuth2Authenticator;
use League\OAuth2\Client\Provider\Google;

public function boot()
{
    Mail::extend('smtp', function ($config) {
        // Initialize the SMTP transport with your Gmail settings
        $transport = new Swift_SmtpTransport(
            $config['host'],
            $config['port'],
            $config['encryption']
        );

        // Set up the Google OAuth2 provider
        $oauthProvider = new Google([
            'clientId' => env('GOOGLE_CLIENT_ID'),
            'clientSecret' => env('GOOGLE_CLIENT_SECRET'),
        ]);

        // Create the XOAUTH2 authenticator using your refresh token
        $oauthAuthenticator = new Swift_Transport_Esmtp_Auth_XOAuth2Authenticator(
            $oauthProvider,
            [
                'refresh_token' => env('GOOGLE_REFRESH_TOKEN'),
                'username' => env('MAIL_USERNAME'),
            ]
        );

        // Replace the default auth handler with our OAuth2 authenticator
        $transport->setAuthHandler($oauthAuthenticator);

        // Return the configured SwiftMailer instance
        return new \Swift_Mailer($transport);
    });
}

4. Verify Permissions & Test

  • Make sure your existing refreshToken has the necessary Gmail API scopes (either https://www.googleapis.com/auth/gmail.send for sending only, or https://mail.google.com/ for full access). If you used this token with CodeIgniter/PHPMailer before, it should already be valid.
  • Test the setup by sending a test email using Laravel's standard Mail facade:
// Example in a controller or route
use Illuminate\Support\Facades\Mail;
use App\Mail\TestEmail;

Mail::to('recipient@example.com')->send(new TestEmail());

This setup leverages Laravel's native SwiftMailer integration, so you don't need to switch to PHPMailer—you can keep using Laravel's built-in mail features (markdown mails, queues, etc.) while authenticating via XOAUTH2.

内容的提问来源于stack exchange,提问作者DeiForm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:27:54