我正在使用gapi 发送gmail。但是如果我将邮件发送给自己,它就不会出现在我的收件箱中。最奇怪的是,它出现在“已发送”文件夹中。`
function sendMessage(email, callback) {
// Web-safe base64
var base64EncodedEmail = btoa(email).replace(/\//g,'_').replace(/\+/g,'-');
var request = gapi.client.gmail.users.messages.send({
'userId': 'me',
'message': {
'raw': base64EncodedEmail
}
});
request.execute(callback);
}
function send() {
var var to = 'znlswd@gmail.com',
subject = 'Hello World',
content = 'send a Gmail.'
var email = "From: 'me'\r\n"+
"To: "+ to +"\r\n"+
"Subject: "+subject+"\r\n"+
"\r\n"+
content;
sendMessage(email, function () {
console.log(arguments);
});
}
Run Code Online (Sandbox Code Playgroud)
` 控制台信息日志为:
"[? {? "id": "gapiRpc",? "result": {? "id": "1471e09d88000bf7",? "threadId": "1471e09d88000bf7",? "labelIds": [? "SENT"? ]? …Run Code Online (Sandbox Code Playgroud) 我想使用不同的“角色”(例如 info@ 、 customer-support@ 、 tech-support@ 、 no-reply@ )向我的客户发送电子邮件。
我尝试过两种方法:
我首先为我的 Gmail for Business 应用程序设置一个具有全局委托的服务帐户。
为了测试它是否有效,我设置了 2 个用户:lev@mydomain.com 和 root@mydomain.com。事实上,我可以成功地从 lev@ 和 root@ 发送电子邮件。
然而,当我尝试为我的应用程序添加 5 个不同的用户帐户时,Gmail 对机器人/滥用感到偏执,并要求我证明所有帐户都是“人性化”的,包括设置密码、登录和通过电话进行短信验证。此外,他们要求不同的账户使用不同的手机来证明是不同的人。因此,账户的设置成为一个主要问题。
我还想避免创建多个帐户,因为我要为每个帐户付费,而且从语义上讲,所有角色都只是一个帐户。所以别名似乎是一个更好的主意。
问题是,当我尝试发送电子邮件并将“发件人”字段设置为别名(例如 from:no-reply@mydomain.com)时,我收到以下异常:
Exception in thread "main" com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden
{
"code" : 403,
"errors" : [ {
"domain" : "global",
"message" : "Delegation denied for root@mydomain.com",
"reason" : "forbidden"
} ],
"message" : "Delegation denied for root@mydomain.com"
}
Run Code Online (Sandbox Code Playgroud)
有人遇到并解决过这个问题吗?
认证/凭证代码如下:
/*
* Set …Run Code Online (Sandbox Code Playgroud) 使用与 API 参考站点类似的代码,我在 for 循环开始时收到 null 异常错误。我已经检查过该附件message是否有附件,但它似乎是内联的。对于附件不是内联的其他邮件,它确实有效。
我需要做什么才能获取内联附件?
public List<Attachment> getAttachments(String messageId) throws IOException
{
List<Attachment> attachments = new ArrayList<>();
Message message = SERVICE.users().messages().get(USER, messageId).execute();
List<MessagePart> parts = message.getPayload().getParts();
if (parts != null)
{
for (MessagePart part : parts)
{
if (part.getFilename() != null && part.getFilename().length() > 0)
{
String attId = part.getBody().getAttachmentId();
MessagePartBody attachPart = SERVICE.users().messages().attachments().
get(USER, messageId, attId).execute();
byte[] fileByteArray = Base64.decodeBase64(attachPart.getData());
Attachment attachment = new Attachment(part, attachPart, fileByteArray);
attachments.add(attachment);
}
}
}
return …Run Code Online (Sandbox Code Playgroud) 我已阅读此处的 gmail api 配额说明(https://developers.google.com/gmail/api/v1/reference/quota),但仍无法理解导致我们超出限制的原因。
问题 1:每用户配额中的用户是多少?我不确定该用户是个人 gmail 用户,还是使用 gmail api 的服务客户端。
问题 2:我们已经多次看到以下错误,但没有看到任何明显的限制。
"error": {
"errors": [
{
"domain": "usageLimits",
"reason": "rateLimitExceeded",
"message": "Rate Limit Exceeded"
}
],
"code": 429,
"message": "Rate Limit Exceeded"
}
Run Code Online (Sandbox Code Playgroud)
我们的速度低于 250 单位/秒和 25,000 单位/100 秒。我们只使用history.list和message.get调用,不发送或修改。
我还缺少其他配额吗?
有没有办法使用 Google Mail API 按接收时间的顺序列出 Gmail 邮件?
尽管 API 按时间倒序返回邮件。对于像 10 封邮件这样的非常小的数据集,我发现了差异。
邮件列表API响应:
{
"messages": [
{
"id": "15afb61b8d220a19",
"threadId": "15afb61b8d220a19"
},
{
"id": "15afb618f941d73f",
"threadId": "15afb618f941d73f"
},
{
"id": "15afb6174711c7af",
"threadId": "15afb6174711c7af"
},
...
...
{
"id": "159bc283f63d5eb7",
"threadId": "159bc283f63d5eb7"
},
{
"id": "159bc283dc97cd87",
"threadId": "159bc283dc97cd87"
},
{
"id": "159bc283d95f097c",
"threadId": "159bc283d95f097c"
}
],
"resultSizeEstimate": 9
}
Run Code Online (Sandbox Code Playgroud)
回复的第一条消息(最新):
Id: 15afb61b8d220a19
Date: "Thu, 23 Mar 2017 19:06:08 +0530"
internalDate: "1490276168000"
Run Code Online (Sandbox Code Playgroud)
列表中的第二封邮件:
Id: 15afb618f941d73f
Date: "Thu, 23 Mar 2017 …Run Code Online (Sandbox Code Playgroud) 我正在使用 gmail api 从我的邮箱获取消息。但是当在 get 方法中使用 format='raw' 时,我无法解析 'raw' 字段中返回的数据。
service.users().messages().get(userId='me', id=message_id, format='raw').execute()
Run Code Online (Sandbox Code Playgroud)
这是在文档中,
“raw”:以 base64url 编码字符串的形式返回原始字段中包含正文内容的完整电子邮件数据;不使用有效负载字段。
我尝试过
返回值均不可读。
我得到了所有 ASCII 单词和数字,但没有一个日语单词可读:
当涉及日语(或消息正文?)时,消息变成类似: '''6Ie855Sw5qeYDQoNCuOBhOOBpOOCguOBiuS4luipseOBq+OBquOBo+OBpuOBiuOCiuOBvuOBmeOA gg0K44Oq44Ol44Km44Gn44GZ ...... PjwvZGl2PjwvZGl2Pjw vZGl2PjwvZGl2PjwvZGl2PjwvZGl2Pg0KPC9kaXY+ PC9kaXY+PC9kaXY+DQo='''
请帮帮我!!
我正在努力获取电子邮件的大型文本语料库。没有允许读取 Google 网上论坛中的消息的 API。因此,另一种方法是使用属于该组成员的 Gmail 帐户。通过使用此 Gmail,我可以检查发送到该组的所有邮件。我正在使用 python 和 Gmail API 来获取邮件。我面临的问题是,我无法获取来自群组的电子邮件。
results = service.users().messages().list(userId='me',q="from:support-dev-group@wso2.com", maxResults=10).execute()
当我用另一个普通用户 ID 替换 时,from:它就可以工作了。当我用组电子邮件 ID 替换 时,from:它给出的结果为零。我可以获得通过 Gmail 获取群组 Gmail 的实际代码吗?
第二个问题是,
当我使用某人的邮件查询时:
results = service.users().messages().list(userId='me',q="from:xyz@wso2.com", maxResults=10).execute()
Run Code Online (Sandbox Code Playgroud)
我得到这样的结果
{'resultSizeEstimate': 82, 'messages': [{'id': '1653929b0b414390', 'threadId': '1644c19f390faf28'}, {'id': '165330aaa5bb9134', 'threadId': '16532ef13e7eec8d'}......
Run Code Online (Sandbox Code Playgroud)
这里只返回消息id。为了获取带有标题的正文的邮件,我必须再次查询每个 id。我无法在一次查询中获取完整的 JSON 吗?
当我收到新电子邮件时,我尝试从 Gmail API 获取推送。
到目前为止,我发现的唯一方法是每 10-15 分钟进行一次轮询,检查是否有新的未读消息,以便我可以再次查询以获取最新消息。
我想要的解决方案是告诉 Gmail Api 向我推送传入的新邮件或有新邮件要拉取的警报。
我最初不想在这里发布我的问题,但 Gmail Api 支持将我重定向到这里。
谢谢
我想从 gmail 下载 100 多封电子邮件的 pdf 格式。通过 gmail 中的打印选项手动下载所有内容会太长。
此 python 脚本检索所选标签中的电子邮件。我怎样才能把这封电子邮件转换成pdf文件。
# source = https://developers.google.com/gmail/api/quickstart/python?authuser=2
from __future__ import print_function
import pickle
import os.path
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
SCOPES = ['https://www.googleapis.com/auth/gmail.readonly']
def main():
creds = None
if os.path.exists('token.pickle'):
with open('token.pickle', 'rb') as token:
creds = pickle.load(token)
# If there are no (valid) credentials available, let the user log in.
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
creds.refresh(Request()) …Run Code Online (Sandbox Code Playgroud) 我正在努力解决 Gmail API 问题。需要开始的一些事情:
我的程序正在代表经过身份验证的用户发送电子邮件。几乎所有 Gmail API 功能都可以完美运行 - 我能够创建草稿、在不创建草稿的情况下发送电子邮件、对标签进行操作等。
该问题似乎仅在我尝试使用以下方法发送草稿对象时才会发生users.drafts.send: https: //developers.google.com/gmail/api/reference/rest/v1/users.drafts/send
当我创建草稿消息然后触发发送消息的请求时,我不一致地返回错误 400Precondition check failed.
这是对端点https://gmail.googleapis.com/gmail/v1/users/me/drafts/send?uploadType=multipart的 POST 请求
让我完全困惑的奇怪部分是,半秒后我可以使用相同的 OAuth 访问令牌针对不同的草稿消息 ID 发出相同的请求,并且效果完美。
此请求失败 - 时间戳 2022-01-04T19:43:50.278Z
Method:POST URL:https://gmail.googleapis.com/gmail/v1/users/me/drafts/send?uploadType=multipart Proto:HTTP/1.1 ProtoMajor:1 ProtoMinor:1 Header:map[Authorization:[Bearer ya29.a0ARrdaM9mREDACTED] Content-Type:[application/json]] Body:{Reader:0xc0004e7dd0} GetBody:0x7198e0 ContentLength:70 TransferEncoding:[] Close:false Host:gmail.googleapis.com Form:map[] PostForm:map[] MultipartForm:<nil> Trailer:map[] RemoteAddr: RequestURI: TLS:<nil> Cancel:<nil> Response:<nil> ctx:0xc000044060
身体对象:
{"id":"r155747228619414494","message":{"threadId":"17e269e7bb12bece"}}
此请求成功 - 时间戳 2022-01-04T19:43:50.230Z
Method:POST URL:https://gmail.googleapis.com/gmail/v1/users/me/drafts/send?uploadType=multipart Proto:HTTP/1.1 ProtoMajor:1 ProtoMinor:1 Header:map[Authorization:[Bearer ya29.a0ARrdaM9mREDACTED] Content-Type:[application/json]] Body:{Reader:0xc00061b920} …
gmail-api ×10
gmail ×3
google-api ×3
python ×2
python-3.x ×2
download ×1
email ×1
google-oauth ×1
java ×1
javascript ×1
pdf ×1
quota ×1