我在使用Gmail API向多个地址发送邮件时遇到问题.我已经成功地只向一个地址发送了一条消息,但是当我在'To'字段中包含多个以逗号分隔的地址时,会收到以下错误:
发生错误:https: //www.googleapis.com/gmail/v1/users/me/messages/send ?alt = json 返回"标题无效">
我正在使用此Gmail API指南中的CreateMessage和SendMessage方法:https:
//developers.google.com/gmail/api/guides/sending
该指南指出Gmail API需要符合RFC-2822的邮件.我再次使用RFC-2822指南中的一些寻址示例没有太多运气:https: //tools.ietf.org/html/rfc2822#appendix-A
我的印象是'mary @ x.test,jdoe @ example.org,one @ y.test'应该是一个有效的字符串,以传递给'to'参数CreateMessage,但是我收到的错误SendMessage引导我否则相信.
如果您可以重新创建此问题,或者您对我可能犯错误的地方有任何建议,请告诉我.谢谢!
编辑:这是产生错误的实际代码......
def CreateMessage(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())}
def SendMessage(service, user_id, message):
try:
message = (service.users().messages().send(userId=user_id, body=message)
.execute())
print 'Message Id: %s' % message['id']
return message
except errors.HttpError, error: …Run Code Online (Sandbox Code Playgroud) 在创建邮件并使用Gmail API创建草稿或电子邮件时,您是否可以在正文中嵌入图片?我希望实际嵌入的图像数据类似于将图像(实际数据,而不是链接)复制和粘贴到Gmail电子邮件中,将图像放在内容中.
可以这样做,还是我需要将图像上传到其他位置并使用HTML将图像嵌入电子邮件中?有关如何做的任何指示?
我正在使用Gmail的API从我的帐户收到电子邮件.邮件正文以"URL safe base64"格式提供.对此进行解码的最佳方法是什么?我找到了一些nodejs解决方案,但没有客户端解决方案.window.atob不起作用,因为它是URL安全的.
谢谢你的帮助.
我已成功设置Google Pub/Sub以使用Gmail API监视功能,如下所述:https://developers.google.com/gmail/api/guides/push在我的Gmail帐户中观看INBOX标签.
一旦收到新消息,我立即以有效格式获得推送通知,如:
{ message:
{ data: '.......',
attributes: {},
message_id: '1248700053943' },
subscription: '.....' }
Run Code Online (Sandbox Code Playgroud)
在我base64decode数据后,我收到电子邮件和historyId.然后,按照建议,我请求gmail.users.history.list API(通过API控制台),并将startHistoryId设置为推送通知中的historyId.然后在没有任何细节的情况下获得空响应:
GET https://www.googleapis.com/gmail/v1/users/me/history?startHistoryId=4658879&key={YOUR_API_KEY}
200 OK
- Show headers
{
"historyId": "4658894"
}
Run Code Online (Sandbox Code Playgroud)
因此,来自通知的historyId似乎无效.似乎Gmail users.watch API工作不正常,发送错误的historyId,或者我只是遗漏了什么?
我想只提取消息的正文并将其返回.我可以过滤字段并显示片段但不显示正文.
def GetMimeMessage(service, user_id, msg_id):
try:
message = service.users().messages().get(userId=user_id, id=msg_id, format='raw').execute()
print 'Message snippet: %s' % message['snippet']
msg_str = base64.urlsafe_b64decode(message['raw'].encode('ASCII'))
mime_msg = email.message_from_string(msg_str)
return mime_msg
except errors.HttpError, error:
print 'An error occurred: %s' % error
Run Code Online (Sandbox Code Playgroud)
https://developers.google.com/gmail/api/v1/reference/users/messages/get
我需要身体中的所有文本来接收电子邮件.
我试过了:
var mesage = GetMessage(service, "me", 1);
Console.WriteLine(mesage.Snippet);
public static Message GetMessage(GmailService service, String userId, String messageId)
{
try
{
return service.Users.Messages.Get(userId, messageId).Execute();
}
catch (Exception e)
{
Console.WriteLine("An error occurred: " + e.Message);
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
但我正在获取截图中显示的片段.
问题:当通过api发送回复电子邮件然后在接收方,它显示为包含两封电子邮件的邮件(收件人方面有好处),但发件人有两封不同的电子邮件,一封在收件箱中,一封在已发邮件中(发件人方面有问题)).
例如:
电子邮件从A发送到B.再次B发送给A.
在api中,我在"In-Reply-To"和"References"中给出了之前的电子邮件消息ID,(根据rfc822格式)这里Google正在处理A侧的消息ID而不是B侧.A在单个线程中接收消息作为两条消息,但在B的帐户中,它显示为两个单独的电子邮件,一个在收件箱中,一个在已发送.
Api使用:
https://www.googleapis.com/upload/gmail/v1/users/me/messages/send?uploadType=multipart Content-Type:"message/rfc822; boundary = foo_bar_baz"
请求正文是rfc2822格式
我正在使用gmail API搜索来自用户的电子邮件.我创建了以下搜索查询:
ticket after:2015/11/04 AND -from:me AND -in:trash
Run Code Online (Sandbox Code Playgroud)
当我在Gmail的浏览器界面中运行此查询时,我收到11封邮件(正如预期的那样).但是,当我在API中运行相同的查询时,我只收到10条消息.我用来查询gmail API的代码是用Python编写的,如下所示:
searchQuery = 'ticket after:2015/11/04 AND -from:me AND -in:trash'
messagesObj = google.get('/gmail/v1/users/me/messages', data={'q': searchQuery}, token=token).data
print messagesObj.resultSizeEstimate # 10
Run Code Online (Sandbox Code Playgroud)
我将相同的消息发送到另一个Gmail地址并从该电子邮件地址进行了测试,并且(令我惊讶的是)它确实显示在使用该其他电子邮件地址的API搜索中,因此问题不在于电子邮件本身.
在通过各种测试gmail帐户无休止地通过电子邮件发送后,我认为(但不是100%肯定)浏览器界面搜索功能具有不同的定义"me".似乎在API搜索中它不包括来自具有相同名称的电子邮件地址的电子邮件,而这些结果实际上包含在浏览器搜索的结果中.例如:如果"Pete Kramer"把从电子邮件petekramer@icloud.com到pete@gmail.com(这都有自己的名称设置为"Pete Kramer"),它会在浏览器中搜索显示,它不会在API搜索显示.
任何人都可以确认这是问题吗?如果是这样,有没有办法绕过这个以获得与浏览器搜索返回相同的结果?或者是否有人知道为什么gmail浏览器搜索的结果与gmail API搜索不同?Al提示是受欢迎的!
我已经实现了自定义电子邮件服务器和Web客户端.服务器只是一个REST API(类似于google的gmail API),它使用第三方(sendgrid)进行发送和接收.电子邮件存储在数据库中.Web客户端只是与REST客户端进行通信以进行发送和接收.
这种方法的问题是它没有在任何地方实现IMAP,这使得标准客户端(outlook,iphone等)无法连接并使用我们的电子邮件API.这限制了客户仅使用我们的客户端发送电子邮件.
我需要的是某种IMAP服务器"facade",它将管理与客户端的连接并调用我的REST API来实际处理请求(获取电子邮件,发送电子邮件等).
如何实施IMAP门面?是否有可能采用现有的MailServer并将其发布并将其所有"事件"指向调用我的API?
我正在尝试发送带有附件(最好是多个附件)的电子邮件,这些附件大于10 MB并且小于25 MB的总限制。我提到10 MB的原因是,这似乎是正常的附加文件方式停止起作用时得到的下限Error 10053。
我在文档中已经读到,做到这一点的最佳方法是使用可恢复的上载方法,但我无法使其正常工作,也无法在Python中找到任何好的示例。关于此的大多数SO问题都只是链接回到没有Python示例的文档,否则它们的代码会导致其他错误。
我正在寻找Python中的解释,因为我想确保自己理解正确。
我浏览过的问题:
码:
import base64
import json
import os
from email import utils, encoders
from email.message import EmailMessage
from email.mime import application, multipart, text, base, image, audio
import mimetypes
from apiclient import errors
from googleapiclient import discovery, http
from google.oauth2 import service_account
def send_email(email_subject, email_body, email_sender='my_service_account@gmail.com', email_to='', email_cc='', email_bcc='', files=None):
# Getting credentials
with open(os.environ.get('SERVICE_KEY_PASSWORD')) as f:
service_account_info …Run Code Online (Sandbox Code Playgroud) python mime email-attachments google-api-python-client gmail-api
gmail-api ×10
gmail ×4
python ×4
email ×3
mime ×2
api ×1
base64 ×1
c# ×1
google-api ×1
imap ×1
javascript ×1
mail-server ×1
rfc2822 ×1