我正在尝试将新的Gmail API与Google API节点客户端配合使用.我从开发人员控制台创建了一个新项目,设置了一个新的"服务帐户"客户端ID,并启用了对API的访问.
作为概念证明,我只是想在我的收件箱中列出线程.当我为API资源管理器启用OAuth 2.0切换并输入我的电子邮件地址时,请求成功,我看到带有数据的JSON响应.
现在我尝试在Node中做同样的事情:
var googleapis = require('googleapis');
var SERVICE_ACCOUNT_EMAIL = '...SNIP...';
// generated by: openssl pkcs12 -in ...SNIP...p12 -out key.pem -nocerts -nodes
var SERVICE_ACCOUNT_KEY_FILE = 'key.pem';
var jwt = new googleapis.auth.JWT(
SERVICE_ACCOUNT_EMAIL,
SERVICE_ACCOUNT_KEY_FILE,
null,
['https://www.googleapis.com/auth/gmail.readonly']);
googleapis
.discover('gmail', 'v1')
.execute(function(err, client) {
jwt.authorize(function(err, result) {
if(err) console.error(err);
else console.log(result);
client.gmail.users.threads.list()
.withAuthClient(jwt)
.execute(function(err, result) {
if(err) console.error(err);
else console.log(result);
});
});
});
Run Code Online (Sandbox Code Playgroud)
首先,我打印authorize()调用的结果,看起来它返回一个令牌,所以我想我已经正确设置了所有OAuth的东西:
{ access_token: '...SNIP...',
token_type: 'Bearer',
expires_in: 1404277946,
refresh_token: …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Gmail API计算用户邮箱中的所有电子邮件.这意味着运行类似的东西
do{
page = request.execute();
if (page.getMessages() != null){
totalSize += page.getMessages().size();
}
request.setPageToken(page.getNextPageToken());
}while (request.getPageToken() != null && request.getPageToken().length() > 0);
Run Code Online (Sandbox Code Playgroud)
问题是对于大型邮箱,这可能是一个漫长的过程,需要许多API调用.例如,一个包含31,000封电子邮件的邮箱运行时间超过一分钟,并且需要300多次迭代才能运行.
有没有更好的办法?
我尝试过使用maxResults参数,但默认为100并忽略任何> 100的值.批处理不起作用,因为在您已遍历每个页面之前,无法知道必须进行多少次请求.resultSizeEstimate列表响应中的属性是荒谬的不准确.
我们正在使用他们提供的最新API集成GMail,作为在我们的应用程序中开发电子邮件客户端的一部分.我们正在使用Google提供的PHP客户端库.
请参阅链接https://developers.google.com/api-client-library/php/
在这里我试图发送带附件的邮件.这里我们生成了message/rfc822兼容文本,并使用'raw'参数传递它.这里我发现的问题是,在执行代码后,当我检查发送的邮件是否通过GMail API发送的邮件时,附件显示正确.但是没有收到/显示发件人的邮箱.
有关详细信息,请参阅代码:
require_once DOCUMENT_ROOT . '/../library/google/src/Google/Client.php';
require_once DOCUMENT_ROOT . '/../library/google/src/Google/Service/Gmail.php';
function encodeRecipients($recipient){
$recipientsCharset = 'utf-8';
if (preg_match("/(.*)<(.*)>/", $recipient, $regs)) {
$recipient = '=?' . $recipientsCharset . '?B?'.base64_encode($regs[1]).'?= <'.$regs[2].'>';
}
return $recipient;
}
$isAccessCodeExpired = 0;
$arrAccessToken = array();
$session = new Zend_Session_Namespace();
$client = new Google_Client();
$client->setClientId($this->client_id);
$client->setClientSecret($this->client_secret);
$client->setRedirectUri($this->redirect_uri);
$client->setAccessType('offline');
$client->setApprovalPrompt('force');
$client->addScope("https://mail.google.com/");
$client->addScope("https://www.googleapis.com/auth/gmail.compose");
$client->addScope("https://www.googleapis.com/auth/gmail.modify");
$client->addScope("https://www.googleapis.com/auth/gmail.readonly");
if ($this->getRequest()->getParam('code')) {
$code = $this->getRequest()->getParam('code');
$client->authenticate($code);
$session->gmail_access_token = $client->getAccessToken();
//$redirect = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
$redirect = BASE_PATH . …Run Code Online (Sandbox Code Playgroud) 我想从谷歌API下载client_secret.json.我按照https://developers.google.com/gmail/api/quickstart/ruby中列出的步骤操作.
client_secret.json文件确实下载但它是空的.该文件的标题看起来必须是以apps.googleusercontent.com结尾的client_id,但文件中没有存储数据.
我正在尝试通过Gmail API自动创建草稿,我希望这些草稿能够回复现有的电子邮件.为此,我认为我需要设置"threadId"标题(特定于Gmail),"引用"标题和"In-Reply-To"标题.此外,要让Gmail将邮件视为回复,"主题"标题必须与原始电子邮件匹配.
我将所有这些标头硬编码到MIMEText对象中,然后将消息作为字符串进行base-64编码(urlsafe)并让Gmail API提供它.但是,"threadId","In-Reply-To"和"References"标题似乎没有在发送的电子邮件中显示,因为单击"显示原始"时显示的MIME中不存在它们在Gmail用户界面中.
new = MIMEText("reply body text")
new["In-Reply-To"] = "[Message-ID of email to reply to]" #looks like <..@mail.gmail.com>
new["References"] = "[Message-ID of email to reply to]" #looks like <..@mail.gmail.com>
new["threadId"] = "[threadId of message to reply to]" #looks like 14ec476abbce3421
new["Subject"] = "Testsend2"
new["To"] = "[Email to send to]"
new["From"] = "[Email to send from]"
messageToDraft = {'raw': base64.urlsafe_b64encode(new.as_string())}
message = {'message': messageToDraft}
draft = service.users().drafts().create(userId="me", body=message).execute()
Run Code Online (Sandbox Code Playgroud) Gmail IMAP也会转移到Oauth2身份验证.因此,我们正在为Gmail REST API和Gmail IMAP 使用相同的控制台应用.
我的问题:对于IMAP和REST API,分配的配额是共享的还是每个都有自己的配额?如果是这样,任何人都可以共享Gmail IMAP的配额.
imap google-api gmail-imap gmail-api google-console-developer
我一直在使用gmail api的指南来创建草稿.以下代码运行良好.
def create_message(sender, to, subject, message_text):
message = MIMEText(message_text)
message['to'] = to
message['from'] = sender
message['subject'] = subject
return {'raw': base64.urlsafe_b64encode(message.as_string())}
Run Code Online (Sandbox Code Playgroud)
我的问题是,如何添加多个收件人?API指南似乎没有提到任何类型.
我们已将Gmail登录集成到我们的Android应用程序中,我们正在使用服务器端集成来获取一次auth_code,如下所述:https://developers.google.com/identity/sign-in/android/offline-access
我们在服务器端以及应用程序内的Android设备上都可以访问Gmail帐户.
但不知何故,我们没有使用以下方法获取个人资料照片:
googleSignInAccount.getPhotoUrl();
Run Code Online (Sandbox Code Playgroud)
在提出请求时,我们使用以下代码:
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestScopes(new Scope(GmailScopes.GMAIL_READONLY))
.requestServerAuthCode("OUR_SERVER_CLIET_ID", true)
.requestEmail()
.requestProfile()
.build();
Run Code Online (Sandbox Code Playgroud)
有关stackoverflow的一些问题表明,如果用户启用了Google+个人资料帐户,那么只有您才能获得照片网址.这种情况在我们的案例中没有发生,因为我们使用在Google+帐户上有照片的帐户进行了测试.
我们在iOS应用程序中进行了类似的集成,我们可以在其中获取个人资料照片网址?可能有什么问题?
更新:
只有在个人资料中设置了照片集的用户才能获得照片网址,否则为空.
我正在使用oAuth2.0从我的Gmail帐户中读取电子邮件.这是我的代码
oauthswift = OAuth2Swift(
consumerKey: "242468529977-xxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com",
consumerSecret: "GfGVl_xxxxxxxxxxmjnAX",
authorizeUrl: "https://accounts.google.com/o/oauth2/auth",
accessTokenUrl: "https://accounts.google.com/o/oauth2/token",
responseType: "code"
)
oauthswift?.allowMissingStateCheck = true
let _ = oauthswift?.authorize(
withCallbackURL: URL(string: "urn:ietf:wg:oauth:2.0:oob")!, scope: "https://www.googleapis.com/auth/gmail.metadata", state: "",
success: { credential, response, parameters in
let parameters = Dictionary<String, AnyObject>()
// Multi-part upload
print(credential)
print(response)
},
failure: { error in
print("ERROR: \(error.localizedDescription)")
}
)
Run Code Online (Sandbox Code Playgroud)
但在我允许后,它会向我显示此屏幕
并说'请复制此代码并切换到应用程序并将其粘贴到那里.' 但我不知道在哪里粘贴代码.
gmail-api ×10
python ×2
android ×1
attachment ×1
email ×1
gmail ×1
gmail-imap ×1
google-api ×1
google-plus ×1
imap ×1
ios ×1
json ×1
mime ×1
oauth-2.0 ×1
php ×1
ruby ×1
swift ×1