使用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
相关产品推荐
相关产品推荐

