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

如何在Laravel中通过Google Workspace OAuth发送邮件?已获Access Token

在Laravel中通过Google Workspace OAuth2实现SMTP邮件发送

1. 确保获取到Refresh Token

你用Socialite获取access token时,默认仅能拿到短期有效(1小时)的access token,必须在授权请求中添加offline scope,才能获取到可用来自动刷新token的refresh token:

修改Socialite授权跳转代码:

return Socialite::driver('google')
    ->scopes([
        'https://www.googleapis.com/auth/gmail.send', // 仅申请发邮件所需的最小权限
        'offline' // 必须添加该scope才能获取refresh token
    ])
    ->redirect();

回调时获取并保存关键信息:

$user = Socialite::driver('google')->user();
// 将以下信息存入数据库或加密配置:
// $user->token(当前access token)
// $user->refreshToken(用于刷新token的凭证)
// $user->expiresIn(token剩余有效期,单位秒)

若你是Google Workspace管理员,还需在Admin Console中给应用开启域范围委派,这样应用可代表域内任意用户发送邮件(按需开启)。

2. 配置Laravel邮件驱动

Laravel默认集成了symfony/google-mailer组件,可直接配置SMTP结合OAuth2认证。先修改.env文件:

MAIL_MAILER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_ENCRYPTION=tls
MAIL_USERNAME=你的Workspace邮箱@域名.com
MAIL_PASSWORD=null # 此处无需填写密码
MAIL_FROM_ADDRESS=你的Workspace邮箱@域名.com
MAIL_FROM_NAME="${APP_NAME}"

# Google OAuth2 参数
GOOGLE_CLIENT_ID=你的客户端ID
GOOGLE_CLIENT_SECRET=你的客户端密钥
GOOGLE_REFRESH_TOKEN=你保存的refresh token

再修改config/mail.php中smtp驱动的配置,添加OAuth认证参数:

'smtp' => [
    'transport' => 'smtp',
    'host' => env('MAIL_HOST', 'smtp.gmail.com'),
    'port' => env('MAIL_PORT', 587),
    'encryption' => env('MAIL_ENCRYPTION', 'tls'),
    'username' => env('MAIL_USERNAME'),
    'password' => env('MAIL_PASSWORD'),
    'timeout' => null,
    'auth_mode' => 'oauth',
    'oauth' => [
        'client_id' => env('GOOGLE_CLIENT_ID'),
        'client_secret' => env('GOOGLE_CLIENT_SECRET'),
        'refresh_token' => env('GOOGLE_REFRESH_TOKEN'),
        'token_uri' => 'https://oauth2.googleapis.com/token',
    ],
],

3. 自动刷新Access Token

无需手动处理token刷新逻辑,symfony/google-mailer组件会在access token过期时,自动使用refresh token获取新的access token。

4. 测试邮件发送

编写简单测试代码验证功能,比如在路由中:

Route::get('/test-email', function () {
    Mail::raw('这是OAuth2认证的测试邮件', function ($message) {
        $message->to('测试邮箱@example.com')
                ->subject('Laravel Google Workspace 邮件测试');
    });
    return '邮件发送成功';
});

注意事项

  • 最小权限原则:仅申请gmail.send权限,避免不必要的权限请求提升安全性。
  • Token安全存储:refresh token需加密存储,禁止明文暴露在代码或配置文件中。
  • 内部应用豁免审核:若仅为Workspace内部使用的应用,无需通过Google OAuth公开应用审核流程。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 00:07:33