
google 已彻底移除“低安全性应用访问”开关,php 通过 xampp 的 sendmail 直连 gmail smtp 将不再可行;必须改用 oauth 2.0 认证的 gmail api 或切换至支持 smtps/starttls 的第三方邮件服务(如 mailgun、sendgrid 或 outlook smtp)。
google 已彻底移除“低安全性应用访问”开关,php 通过 xampp 的 sendmail 直连 gmail smtp 将不再可行;必须改用 oauth 2.0 认证的 gmail api 或切换至支持 smtps/starttls 的第三方邮件服务(如 mailgun、sendgrid 或 outlook smtp)。
自 2022 年 5 月 30 日起,Google 全面停用「允许低安全性应用访问」设置,这意味着你不能再通过明文密码(如 auth_password=my-gmail-password)直接登录 Gmail SMTP 服务器(smtp.gmail.com:587)。你当前的 sendmail.ini 配置虽语法正确,但因缺少 OAuth 2.0 凭据,连接将被拒绝——Gmail 不再接受任何基于密码的 SMTP 身份验证。
✅ 正确替代方案有两种,推荐按优先级选择:
方案一:使用 Gmail API(推荐,最安全)
需启用 Gmail API、创建 OAuth 2.0 凭据,并使用服务端令牌发送邮件。
步骤简述:
- 进入 Google Cloud Console → 创建新项目 → 启用 Gmail API;
- 配置 OAuth 2.0 凭据(选择「Desktop app」类型),下载 credentials.json;
- 使用官方 PHP 客户端库(google/apiclient)完成授权与发信:
composer require google/apiclient
<?php require_once 'vendor/autoload.php';
$client = new Google_Client();
$client->setApplicationName('PHP Gmail Sender');
$client->setScopes(Google_Service_Gmail::GMAIL_SEND);
$client->setAuthConfig('credentials.json');
$client->setAccessType('offline');
$client->setPrompt('select_account consent');
// 若无有效 token,需用户授权(首次运行时浏览器跳转)
$tokenPath = 'token.json';
if (file_exists($tokenPath)) {
$accessToken = json_decode(file_get_contents($tokenPath), true);
$client->setAccessToken($accessToken);
}
if ($client->isAccessTokenExpired()) {
if ($client->getRefreshToken()) {
$client->fetchAccessTokenWithRefreshToken($client->getRefreshToken());
} else {
// 触发 OAuth 流程(需 Web 环境)
$authUrl = $client->createAuthUrl();
echo "Open this link:\n" . $authUrl . "\n";
exit;
}
file_put_contents($tokenPath, json_encode($client->getAccessToken()));
}
$service = new Google_Service_Gmail($client);
// 构建 MIME 邮件(Base64 URL 安全编码)
$rawMessage = base64_encode(
"To: recipient@example.com\r\n" .
"Subject: Email Verification Code\r\n" .
"Content-Type: text/plain; charset=utf-8\r\n\r\n" .
"Your verification code is 123456"
);
try {
$message = $service->users_messages->send('me', new Google_Service_Gmail_Message(['raw' => $rawMessage]));
echo "Email sent via Gmail API! Message ID: " . $message->getId();
} catch (Exception $e) {
echo "Error: " . $e->getMessage();
}
⚠️ 注意:该方式需部署在可处理重定向的 Web 环境(如本地 localhost),且首次授权需人工介入;生产环境建议使用服务账号 + 域委派(仅限 G Suite)。
方案二:切换至支持现代认证的 SMTP 服务商(快速落地)
若只需快速恢复 mail() 功能,推荐使用以下替代 SMTP 服务(均支持 App Password 或 API Key):
| 服务商 | SMTP 服务器 | 端口 | 认证方式 | 备注 |
|---|---|---|---|---|
| Outlook / Hotmail | smtp-mail.outlook.com | 587 | 用户名+App Password | 生成 App Password |
| Mailgun | smtp.mailgun.org | 587 | postmaster@your-domain.com + API Key | 免费层每月 10k 邮件 |
| SendGrid | smtp.sendgrid.net | 587 | apikey + API Key | 免费层每月 100 邮件 |
以 Outlook 为例,修改 sendmail.ini:
smtp_server=smtp-mail.outlook.com smtp_port=587 auth_username=your-email@outlook.com auth_password=your-app-password-here ; ❗非账户密码!
同时确保 php.ini 中 sendmail_path 指向正确路径,并重启 Apache。
? 重要提醒:
- 切勿在代码或配置文件中硬编码密码或密钥,应使用环境变量(如 $_ENV['SMTP_PASSWORD']);
- mail() 函数本身不支持 TLS/SSL 协商,依赖 sendmail.exe 实现;务必确认 debug.log 中有 AUTH LOGIN 成功日志;
- Gmail 原生 SMTP 已不可逆弃用,任何“绕过方法”(如启用两步验证后生成 App Password)对 Gmail 无效——该机制仅适用于 Google Workspace(企业版)或 Outlook/Apple ID 等其他服务。
综上,放弃 sendmail.ini + Gmail 密码 方案,转向 Gmail API(高安全合规)或第三方 SMTP(开发效率优先),是当前唯一可靠路径。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











