我正在尝试使用通过Gmail API在Javascript客户端附加的jpeg文件发送消息.我到目前为止编写的代码如下:
$.ajax({
type: "POST",
url: "https://www.googleapis.com/upload/gmail/v1/users/me/messages/send?uploadType=multipart",
headers: {
'Authorization': 'Bearer ' + accessToken,
'Content-Type': 'multipart/related; boundary="foo_bar_baz"'
},
data: data
});
Run Code Online (Sandbox Code Playgroud)
哪里data是一个字符串建立类似的例子在这里找到:
--foo_bar_baz
Content-Type: application/json; charset=UTF-8
{
"raw": "RnJvbTogRW1pbCBUaG9saW4gPGVtdGhvbGluQGdtYWlsLmNvbT4KVG86IEV4YW1wbGUgTmFtZSA8ZW10aG9saW5AZ21haWwuY29tPgpTdWJqZWN0OiBzZHNkCgpzZHNk"
}
--foo_bar_baz
Content-Type: image/jpeg
data:image_jpeg;base64,_9j_4AAQSkZJRgABAQEAYABgAAD_2wBDAAIBAQIBAQICAgICAgIC…bHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3-Pn6_9oADAMBAAIRAxEAPwD-f-iiigD_2Q==
--foo_bar_baz--
Run Code Online (Sandbox Code Playgroud)
我得到的错误是Media type 'image/jpeg' is not supported. Valid media types: [message/rfc822]可以理解的,因为[message/rfc822]根据规范,媒体是唯一有效的MIME类型,但上面链接的示例另有说明.
我究竟做错了什么?如果有人能够对此有所了解,我将不胜感激!
在.Net中使用GMail API.使用Net.Mail.MailMessage创建消息传递.然后使用MimeKit创建MimeMessage(使用此方法发送附件+ HTML消息).将MimeMessage.ToString传递给Base64编码器.没有API错误.代码运行正常.我可以在GMail的已发送页面中看到该消息.邮件看起来很完美(发送实际返回消息ID).但是,Gmail中的此邮件会附加以下附加消息.
Bounce <nobody@gmail.com>
An error occurred. Your message was not sent.
Run Code Online (Sandbox Code Playgroud)
像往常一样,谷歌没有其他信息.如何解决这个问题?
Dim msg = New Net.Mail.MailMessage
msg.Subject = subject
msg.To.Add(New MailAddress(ToEmail))
msg.From = New MailAddress(FromEmail, SenderName)
msg.ReplyTo = New MailAddress(FromEmail, SenderName)
msg.Body = bodyText
msg.IsBodyHtml = True
If Not String.IsNullOrWhiteSpace(fileAttachment) Then
If System.IO.File.Exists(fileAttachment) Then
Dim Attachment As New Net.Mail.Attachment(fileAttachment, "application/pdf")
msg.Attachments.Add(Attachment)
End If
End If
Dim message As MimeMessage = MimeMessage.CreateFromMailMessage(msg)
Dim newMsg = New Google.Apis.Gmail.v1.Data.Message()
newMsg.Raw = Base64UrlEncode(message.ToString)
GmailService.Users.Messages.Send(newMsg, "me").Execute()
Private Function Base64UrlEncode(ByVal input As String) …Run Code Online (Sandbox Code Playgroud) 我尝试使用- 尝试的谷歌REST API - Users.messages:发送.
有一个必要的参数 - raw-
整个电子邮件消息采用RFC 2822格式化和base64url编码的字符串.当提供format = RAW参数时,在messages.get和drafts.get响应中返回.
我检查了RFC 2822格式,似乎它应该在这里显示为示例,然后我用这个编码器将它编码为base64URL并将其粘贴raw到try的字段中,我得到 - Invalid value for ByteString: http://ostermiller.org/calc/encode.html.
你能给我一个正确的RFC 2822 format和它相应的base64URL,它会在上面试试吗?
我正在尝试使用 Go 中的 Gmail API 检索邮件的完整邮件正文。目前,当我这样做时,我只能得到消息正文的前三个字符,即“<ht”。我很确定我的问题在于消息正文的解码,但我似乎无法弄清楚我做错了什么。
我查看了其他几种语言的示例,并尝试将它们翻译成 Go,但没有成功。编码的消息正文相当大,所以我相当肯定一些数据在某处丢失了。
这是一个(删节的)代码片段,说明了我是如何尝试解决这个问题的:
req := svc.Users.Messages.List("me").Q("from:someone@somedomain.com,label:inbox")
r, _ := req.Do()
for _, m := range r.Messages {
msg, _ := svc.Users.Messages.Get("me", m.Id).Format("full").Do()
for _, part := range msg.Payload.Parts {
if part.MimeType == "text/html" {
data, _ := base64.StdEncoding.DecodeString(part.Body.Data)
html := string(data)
fmt.Println(html)
}
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 POST 方法使用 gmail API 和 POSTMAN 发送邮件
POST https://www.googleapis.com/upload/gmail/v1/users/example@gmail.com/messages/send
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误:
{
"error": {
"errors": [
{
"domain": "global",
"reason": "invalidArgument"
"message": "Recipient address required"
}
],
"code": 400,
"message": "Recipient address required"
}
}
Run Code Online (Sandbox Code Playgroud)
标头已放入内容类型:message/rfc822
我知道这必须编码成base64(web_safe),所以我翻译了
"From: sender.example@gmail.com\r\n" +
"To: receiver.example@gmail.com\r\n" +
"Subject: Subject Example\r\n" +
"This is content: hope you got it\r\n"
Run Code Online (Sandbox Code Playgroud)
我也将它们替换为网络安全
replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
Run Code Online (Sandbox Code Playgroud)
所以我得到了如下的base64。所以我把 raw 放在 POST METHOD 的正文中
{
"raw": "RnJvbTogc2VuZGVyLmV4YW1wbGVAZ21haWwuY29tDQpUbzogcmVjZWl2ZXIuZXhhbXBsZUBnbWFpbC5jb20NClN1YmplY3Q6IFN1YmplY3QgRXhhbXBsZQ0KVGhpcyBpcyBjb250ZW50OiBob3BlIHlvdSBnb3QgaXQNCg"
}
Run Code Online (Sandbox Code Playgroud)
我在谷歌开发者网站上使用了“尝试这个API”,我可以发送它。 https://developers.google.com/gmail/api/v1/reference/users/messages/send
但对于邮递员,我不能。
有什么帮助吗?
我面临着API的几个问题,
第一:
发送方法询问'id'(消息ID或线程ID)..但为什么?我正在发送新消息,所以它不应该要求.根据Gmail Api documnetation它的可选. https://developers.google.com/gmail/api/v1/reference/users/messages/send
ArgumentError: Missing required parameters: id.
Run Code Online (Sandbox Code Playgroud)
第二:
即使在指定消息ID后,它也会返回此消息.
Your client has issued a malformed or illegal request.
Run Code Online (Sandbox Code Playgroud)
码
require 'mime'
include MIME
msg = Mail.new
msg.date = Time.now
msg.subject = 'This is important'
msg.headers.set('Priority', 'urgent')
msg.body = Text.new('hello, world!', 'plain', 'charset' => 'us-ascii')
msg.from = {'hi@gmail.com' => 'Boss Man'}
msg.to = {
'list@example.com' => nil,
'john@example.com' => 'John Doe',
'jane@example.com' => 'Jane Doe',
}
@email = @google_api_client.execute(
api_method: @gmail.users.messages.send(:get),
body_object: {
raw: Base64.urlsafe_encode64(msg.to_s)
},
parameters: …Run Code Online (Sandbox Code Playgroud) 我在 Gmail API 中一步一步地提出了一个简单的请求。
根据我打这个电话的所有说明:
var request = gapi.client.gmail.users.messages.send({
'userId': 'me',
"payload": {
"headers": [
{
"name": "To",
"value": "########@gmail.com"
}
]},
'raw': 'SEVMTE8gTVkgREVBUiBGUklFTkQ='
});
request.then(()=>{console.log('yep')})
Run Code Online (Sandbox Code Playgroud)
但是收到一个错误:
{
"error": {
"errors": [
{
"domain": "global",
"reason": "invalidArgument",
"message": "Recipient address required"
}
],
"code": 400,
"message": "Recipient address required"
}
}
Run Code Online (Sandbox Code Playgroud) 我正在测试如何使用带有Google Apps脚本的Admin SDK目录服务更新用户图片,具有以下功能:
function updatePhoto(){
var fileId = 'XXXXXXXXXXXXXXXXXXX';
var b = DocsList.getFileById(fileId).getBlob();
var encoded = Utilities.base64Encode(b.getBytes());
encoded = encoded.replace(/\//g,'_').replace(/\+/g,'-').replace(/\=/g,'*');
AdminDirectory.Users.Photos.update({
"photoData": encoded },'harry.potter@abc.edu.hk');
}
Run Code Online (Sandbox Code Playgroud)
但是,它并不总是有效.只要base64编码的字符串中有填充,它就会失败.参考Google的文档(https://developers.google.com/admin-sdk/directory/v1/reference/users/photos/update),我对这些说明感到有些困惑.它说:
应该做什么?(=)用于Base64中的填充.那么,我应该使用(*)还是(.)?我确实尝试用(.)替换(=)但没有运气.
有人可以帮忙吗?
太奇怪了.当我不替换(=)时,它工作.
function updatePhoto(){
var fileId = 'XXXXXXXXXXXXXXXXXXX';
var b = DocsList.getFileById(fileId).getBlob();
var encoded = Utilities.base64Encode(b.getBytes());
encoded = encoded.replace(/\//g,'_').replace(/\+/g,'-');
AdminDirectory.Users.Photos.update({
"photoData": encoded },'harry.potter@abc.edu.hk');
Run Code Online (Sandbox Code Playgroud)
}
我应该将邮件服务从旧项目替换为 GMail。但是,该项目正在使用 PHP,并且在 google 文档页面中还没有关于 PHP 代码的文档。我想测试发送带有简单邮件正文的电子邮件,这是代码:
require_once __DIR__."/google-api-php-client-2.2.1/vendor/autoload.php";
define("APPLICATION_NAME", "Gmail API PHP Quickstart");
define("CREDENTIALS_PATH", "~/.credentials/gmail-php-quickstart.json");
define("CLIENT_SECRET_PATH", __DIR__."/client_secret.json");
// If modifying these scopes, delete your previously saved credentials
// at ~/.credentials/gmail-php-quickstart.json
define('SCOPES', implode(' ', array(
Google_Service_Gmail::GMAIL_READONLY)
));
date_default_timezone_set('America/New_York'); // Prevent DateTime tz exception
/*
if (php_sapi_name() != 'cli') {
throw new Exception('This application must be run on the command line.');
}
*/
/**
* Returns an authorized API client.
* @return Google_Client the authorized client object
*/
function getClient() { …Run Code Online (Sandbox Code Playgroud)