- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我希望下面的代码可以发送电子邮件,但我只收到了这个:
An error occurred: Error calling POST https://www.googleapis.com/gmail/v1/users/me/messages/send: (400) Bad Request
我使用 Google Developers Console here 得到 200 OK
在底部。有什么帮助吗?
$client_id = '599901532082-js1r50n20q6n5mir9fo1g81qkj9kfn3j.apps.googleusercontent.com';
$service_account_name = '599901532082-js1r50n20q6n5mir9fo1g81qkj9kfn3j@developer.gserviceaccount.com';
$key_file_location = '/tmp/APIProject-cb6558ba6435.p12';
$client = new \Google_Client();
$client->setApplicationName("Client_Library_Examples");
$service = new \Google_Service_Gmail($client);
if (isset($_SESSION['service_token'])) {
$client->setAccessToken($_SESSION['service_token']);
}
$key = file_get_contents($key_file_location);
$cred = new \Google_Auth_AssertionCredentials(
$service_account_name,
array('https://www.googleapis.com/auth/gmail.send', 'https://www.googleapis.com/auth/gmail.compose'),
$key
);
$client->setAssertionCredentials($cred);
if ($client->getAuth()->isAccessTokenExpired()) {
$client->getAuth()->refreshTokenWithAssertion($cred);
}
//check if you want the validity of this string at: http://www.komeil.com/toolbox/base64decoder
//it is web safe base64 encoded email
$mime = "RnJvbTogSm9obiBEb2UgPHRpcmVuZ2FyZmlvQGdtYWlsLmVzPiANClRvOiBNYXJ5IFNtaXRoIDx0aXJlbmdhcmZpb0BnbWFpbC5jb20-IA0KU3ViamVjdDogU2F5aW5nIEhlbGxvIA0KRGF0ZTogRnJpLCAyMSBOb3YgMTk5NyAwOTo1NTowNiAtMDYwMCANCk1lc3NhZ2UtSUQ6IDwxMjM0QGxvY2FsLm1hY2hpbmUuZXhhbXBsZT4NCg0KVGhpcyBpcyBhIG1lc3NhZ2UganVzdCB0byBzYXkgaGVsbG8uIFNvLCAiSGVsbG8iLg==";
$service = new \Google_Service_Gmail($client);
$msg = new \Google_Service_Gmail_Message();
$msg->setRaw($mime);
try {
$results = $service->users_messages->send("me", $msg);
print 'Message with ID: ' . $message->getId() . ' sent.';
return $message;
} catch (\Exception $e) {
print 'An error occurred: ' . $e->getMessage();
}
编辑:
这是请求对象。它还包括响应数据:
object(Google_Http_Request)[508]
private 'batchHeaders' =>
array (size=3)
'Content-Type' => string 'application/http' (length=16)
'Content-Transfer-Encoding' => string 'binary' (length=6)
'MIME-Version' => string '1.0' (length=3)
protected 'queryParams' =>
array (size=0)
empty
protected 'requestMethod' => string 'POST' (length=4)
protected 'requestHeaders' =>
array (size=3)
'content-type' => string 'application/json; charset=UTF-8' (length=31)
'authorization' => string 'Bearer ya29.8gEUMiBLfxS8OLdSmpiQ-EcumeATo2qFAfPtPqwTw9fQ2zVrfZaA1X5OLoBmQccrXr8V8g' (length=82)
'accept-encoding' => string 'gzip' (length=4)
protected 'baseComponent' => string 'https://www.googleapis.com' (length=26)
protected 'path' => string '/gmail/v1/users/me/messages/send' (length=32)
protected 'postBody' => string '{"raw":"RnJvbTogSm9obiBEb2UgPHRpcmVuZ2FyZmlvQGdtYWlsLmVzPg0KVG86IE1hcnkgU21pdGggPHRpcmVuZ2FyZmlvQGdtYWlsLmNvbT4NClN1YmplY3Q6IFNheWluZyBIZWxsbw0KDQpUaGlzIGlzIGEgbWVzc2FnZSBqdXN0IHRvIHNheSBoZWxsby4gU28sICdIZWxsbycu"}' (length=214)
protected 'userAgent' => string 'Client_Library_Examples google-api-php-client/1.0.6-beta (gzip)' (length=63)
protected 'canGzip' => boolean true
protected 'responseHttpCode' => null
protected 'responseHeaders' => null
protected 'responseBody' => null
protected 'expectedClass' => string 'Google_Service_Gmail_Message' (length=28)
public 'accessKey' => null
object(Google_Http_Request)[508]
private 'batchHeaders' =>
array (size=3)
'Content-Type' => string 'application/http' (length=16)
'Content-Transfer-Encoding' => string 'binary' (length=6)
'MIME-Version' => string '1.0' (length=3)
protected 'queryParams' =>
array (size=0)
empty
protected 'requestMethod' => string 'POST' (length=4)
protected 'requestHeaders' =>
array (size=4)
'content-type' => string 'application/json; charset=UTF-8' (length=31)
'authorization' => string 'Bearer ya29.8gEUM***fxS8OLdSmpiQ-EcumeATo2qFAfPtPqwTw9fQ2zVrfZaA1X5OLoBmQccrXr8V8g' (length=82)
'accept-encoding' => string 'gzip' (length=4)
'content-length' => int 214
protected 'baseComponent' => string 'https://www.googleapis.com' (length=26)
protected 'path' => string '/gmail/v1/users/me/messages/send' (length=32)
protected 'postBody' => string '{"raw":"RnJvbTogSm9obiBEb2UgPHRpcmVuZ2FyZmlvQGdtYWlsLmVzPg0KVG86IE1hcnkgU21pdGggPHRpcmVuZ2FyZmlvQGdtYWlsLmNvbT4NClN1YmplY3Q6IFNheWluZyBIZWxsbw0KDQpUaGlzIGlzIGEgbWVzc2FnZSBqdXN0IHRvIHNheSBoZWxsby4gU28sICdIZWxsbycu"}' (length=214)
protected 'userAgent' => string 'Client_Library_Examples google-api-php-client/1.0.6-beta (gzip)' (length=63)
protected 'canGzip' => boolean true
protected 'responseHttpCode' => int 400
protected 'responseHeaders' =>
array (size=13)
'vary' => string 'Origin
X-Origin' (length=15)
'content-type' => string 'application/json; charset=UTF-8' (length=31)
'content-encoding' => string 'gzip' (length=4)
'date' => string 'Fri, 18 Sep 2015 08:34:25 GMT' (length=29)
'expires' => string 'Fri, 18 Sep 2015 08:34:25 GMT' (length=29)
'cache-control' => string 'private, max-age=0' (length=18)
'x-content-type-options' => string 'nosniff' (length=7)
'x-frame-options' => string 'SAMEORIGIN' (length=10)
'x-xss-protection' => string '1; mode=block' (length=13)
'server' => string 'GSE' (length=3)
'alternate-protocol' => string '443:quic,p=1' (length=12)
'alt-svc' => string 'quic=":443"; p="1"; ma=604800' (length=29)
'transfer-encoding' => string 'chunked' (length=7)
protected 'responseBody' => string '{
"error": {
"errors": [
{
"domain": "global",
"reason": "failedPrecondition",
"message": "Bad Request"
}
],
"code": 400,
"message": "Bad Request"
}
}
' (length=179)
protected 'expectedClass' => string 'Google_Service_Gmail_Message' (length=28)
public 'accessKey' => null
最佳答案
终于可以用您的代码发送邮件了:
我认为您对 GMail API 有一点误解。
要使用它,您必须向 API 进行身份验证。为此,有两种方法:
那么您目前正在尝试从服务帐户发送邮件,但这不是 GMail 帐户。
Developer Console使用的是OAuth方式,试试这个没有问题。
另请注意:对于常规 GMail 帐户,您可以不使用“服务帐户”。您将不得不使用 OAuth。要使用服务帐户,您需要成为 Google Apps 客户。
我不会在这里讨论 OAuth 授权,因为它完全不同,而且那里有很多例子。
要授予您的服务帐户权限以代表您的 GMails/Google Apps 帐户发送邮件,请遵循 this document .对于 一个或多个 API 范围
,您必须输入https://mail.google.com/,https://www.googleapis.com/auth/gmail.modify,https://www.googleapis.com/auth/gmail.compose,https://www.googleapis.com/auth/gmail.send
。
设置完成后,就可以发送邮件了,修改代码如下:
$results = $service->users_messages->send("me", $msg);
不会工作,因为“我”指的是不能发送邮件的服务帐户(见上文)。将 me
替换为应发送邮件的帐户的用户 ID(邮件地址)。:
$results = $service->users_messages->send("senders_mail@domain.com", $msg);
然后,你需要添加
$cred->sub = 'senders_mail@domain.com';
下方
$cred = new \Google_Auth_AssertionCredentials(
$service_account_name,
array('https://www.googleapis.com/auth/gmail.send', 'https://www.googleapis.com/auth/gmail.compose'),
$key
);
另请注意,$message
应该是 try...catch
block 中的 $msg
。
下面,您将找到适合我的完整、有效的代码:
<?php
require_once realpath(dirname(__FILE__) . '/../src/Google/autoload.php');
$client_id = '*censored*.apps.googleusercontent.com';
$service_account_name = '*censored*@developer.gserviceaccount.com';
$key_file_location = '/tmp/apiKey.p12';
$userid_from='*censored*';
$client = new \Google_Client();
$client->setApplicationName("Client_Library_Examples");
//hmmm, really don't know whether these lines are necessary
if (isset($_SESSION['service_token'])) {
$client->setAccessToken($_SESSION['service_token']);
}
$key = file_get_contents($key_file_location);
$cred = new \Google_Auth_AssertionCredentials(
$service_account_name,
array('https://www.googleapis.com/auth/gmail.send', 'https://www.googleapis.com/auth/gmail.compose', 'https://www.googleapis.com/auth/gmail.modify','https://www.googleapis.com/auth/gmail.readonly'),
$key
);
$cred->sub=$userid_from; //<-- Important!
$client->setAssertionCredentials($cred);
if ($client->getAuth()->isAccessTokenExpired()) {
$client->getAuth()->refreshTokenWithAssertion($cred);
}
//check if you want the validity of this string at: http://www.komeil.com/toolbox/base64decoder
//it is web safe base64 encoded email
$mime = "*censored*, same content as you posted, but another recipient ;-)";
$service = new \Google_Service_Gmail($client);
$msg = new \Google_Service_Gmail_Message();
$msg->setRaw($mime);
try {
$results = $service->users_messages->send($userid_from, $msg);
print 'Message with ID: ' . $results->id . ' sent.';
} catch (\Exception $e) {
print 'An error occurred: ' . $e->getMessage();
}
如果还有什么问题,欢迎随时提问!
关于php - Gmail API : 400 bad request when trying to send an email (PHP code),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32591549/
只是出于好奇,我想知道gmail是如何做到的。查看页面源代码后,您看不到任何链接、onclick 方法和 javascript。我知道他们隐藏了 javascript,但页面仍然知道有点击。是否有一个
最近谷歌宣布,出于安全目的,Gmail 将使用代理加载外部图像。这导致我的应用程序在 Gmail 中显示图像时出现问题。 Gmail图片元素检查: https://ci5.googleusercont
我想将节点脚本作为 cronjob 运行,它使用 Gmail 的 API 来轮询我拥有的 gmail 帐户。 我关注 these quickstart instructions : 我被困在第一步。在
如果您在 Gmail 上处于非事件状态,则通过一段时间不移动鼠标,您的聊天状态会更改为橙色,这意味着空闲。但是当您再次开始移动鼠标时,它会变回绿色,表示处于事件状态。它如何知道您何时移动鼠标? 最佳答
您知道,当您加载 GMail 时,左侧会显示“撰写邮件”、“收件箱”、“已发送邮件”等吗?我在页面源代码中搜索了“撰写邮件”,但一无所获。 最佳答案 Gmail 界面使用 JavaScript 动态加
我正在创建一个函数,使用 Google 的 API 从一个人的 gmail 帐户导入联系人。但是我知道许多企业注册 Google 是为了拥有更专业的域名(例如 some_name@bislr.com)
我可以通过桌面应用程序使用 Gmail API 成功读取我的收件箱内容。但是,当我尝试阅读其他人的 gmail 收件箱时,我收到 Delegation denied 异常? 所以我的问题是,Gmail
我已经读到我可以使用 gmail atom 提要从谷歌创建的“内置”标签中获取邮件。 但是当我尝试从“已读”标签获取邮件时,使用 https://mail.google.com/mail/feed/a
通过 Gmail API 发送到 Gmail 地址的邮件在 Gmail 中被标记为“小心处理此邮件。它包含通常用于窃取个人信息的内容。” 该消息基本上只是说测试。并且通过 Gmail SMTP 发送的
编辑 :解决下面的第一条评论,为清楚起见,这不是代码问题。问题很简单: 我应该在新 Gmail UI 的 URI 查询字符串中输入什么来查看 Gmail API 创建的草稿邮件? 尽管这并不是一个真正
我是谷歌产品的新手。我打算开始在 gmail 中添加一些东西。使用类似于 Add on 的 Add on 或 chrome Gmail Extension 更好吗?如果是add-on,我们不能直接在s
使用标准查询格式时,Gmail api 和 Gmail Web ui 的结果有所不同,如下所述 - https://support.google.com/mail/answer/7190 . 该问题专
我正在尝试创建一个 PHP 应用程序,它将自动设置用户的电子邮件签名。这部分有效,我可以为用户设置签名。 我的问题是我在 SendAs 设置中找不到任何选项,该选项将禁用 GMail 中签名前插入的两
我的电子邮件标记通过了电子邮件标记测试器,我尝试了 JSON-LD 和微数据,但无论如何 - 我只是看不到标记在 Gmail (iOS) 客户端中的任何效果。 即使是 Google 自己文档中的基本示
我目前正在使用 Gmail 实验室功能 - canned responses.我有很多这样的预设回复并使用 their menu找到合适的,证明是耗时的。通过以下方式找到预设响应会更容易: 将预设回复
请问是否可以在我的 Gmail 状态中发布倒计时? 像“01:44:15:23”及其不断递减。 最佳答案 发现一个好 article to share : Google Talk 使用 XMPP 那么
我开发了一个上下文小工具并将其安装在我的域中。它在我的域中运行良好,但在我的域之外无法正常工作。如何在我的域外访问我的小工具? 最佳答案 您指的是您的 Google Apps 域吗?根据 Google
我在 this guide 之后配置了推送通知并在调用 watch 时端点我得到大约一周的到期时间。 在此期间,我希望收到有关我已配置的 Pub/Sub 主题的通知,而无需调用 watch。在到期日期
是否有可以在 gmail 中捕获的 API 或事件,以便我可以启动工作流甚至触发 python 脚本。 我正在尝试自动化一项工作,该工作将从已到达 gmail 的电子邮件中提取 csv 附件。然后它会
为什么网络版的 Gmail 会在不使用 = 标记中断位置的情况下对邮件内容进行换行,这使得电子邮件处理变得非常困难: 查看gmail发送的原始邮件内容: 这封由 Mac OS X Mail 发送的邮件
我是一名优秀的程序员,十分优秀!