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

使用PHP调用Gmail API插入邮件遭退回,请求技术协助

排查Gmail API插入邮件被退回的问题

我来帮你梳理下代码里的几个关键问题,这些很可能就是邮件被退回的原因:

1. 发件人格式存在错误

你代码里的发件人行多了个不必要的点,而且冒号后缺少空格(不符合邮件头的标准格式):

$raw_message .= "From:dev2test.@gmail.com <dev2test@gmail.com>\r\n";

改成规范格式:

$raw_message .= "From: dev2test@gmail.com <dev2test@gmail.com>\r\n";

2. 邮件头与正文之间缺少必要的分隔空行

邮件头和正文必须用**两个连续的换行符(\r\n\r\n)**分隔,否则正文会被解析成邮件头的一部分,直接导致邮件格式无效。你现在直接把模板接在Content-Type后面,这是典型的格式错误:

// 错误写法
$raw_message .= "Content-Type: text/html; charset=iso-8859-1\r\n";
$raw_message .= $template;

// 正确写法
$raw_message .= "Content-Type: text/html; charset=utf-8\r\n\r\n"; // 新增空行分隔头和正文
$raw_message .= $template;

3. 字符集编码不一致

你在Subject里用了utf-8编码,但Content-Type指定的是iso-8859-1,这会导致字符编码冲突,建议统一为utf-8:

$raw_message .= "Content-Type: text/html; charset=utf-8\r\n";

4. Refresh Token的使用误区

你调用$client->refreshToken($accessToken );时,传入的参数应该是刷新令牌(refresh token),而不是普通的访问令牌(access token)。如果这里传的是access token,会直接导致认证失败,进而邮件无法正常插入Gmail。请确认你的$accessToken变量存储的是有效的refresh token。

修正后的完整代码示例

$client = new Google_Client();
$client->setApplicationName(APPLICATION_NAME);
$client->setScopes(SCOPES);
$client->setClientId('CLIENT_ID');
$client->setClientSecret('CLIENT_SECRET_ID');
$client->setAccessType('offline');
$client->setApprovalPrompt('force');
$client->setRedirectUri('http://localhost/demo/google/test/');
// 确保这里传入的是有效的refresh token
$refreshToken = "YOUR_VALID_REFRESH_TOKEN";
$client->refreshToken($refreshToken);

/* set message */
$raw_message = "To: test@gmail.com <testfirstlastname009@gmail.com>\r\n";
$raw_message .= "From: dev2test@gmail.com <dev2test@gmail.com>\r\n";
$raw_message .= 'Subject: =?utf-8?B?' . base64_encode('Repoting from the crm task') . "?=\r\n";
$raw_message .= "MIME-Version: 1.0\r\n";
$raw_message .= "Content-Type: text/html; charset=utf-8\r\n\r\n"; // 空行分隔头和正文
$template = "Hello this is <br> testing email for the localsystem sending by gmail or not";
$raw_message .= $template;

$mime = rtrim(strtr(base64_encode($raw_message), '+/', '-_'), '=');
$message = new Google_Service_Gmail_Message();
$message->setRaw($mime);

/* end of set message*/
$gmailService = new Google_Service_Gmail($client);
try {
    $messages = $gmailService->users_messages->insert('me',$message);
    print 'Message with ID: ' . $messages->getId() . ' sent.';
    exit;
} catch (Exception $e) {
    // 建议打印更详细的错误追踪信息,方便定位问题
    print 'An error occurred: ' . $e->getMessage() . "\n" . $e->getTraceAsString();
}

另外,建议你在catch块里添加错误追踪信息的打印,这样能更精准地判断是认证问题还是邮件格式问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:54:31