【问题标题】:What is the size limit of email body in messages.send method of Gmail API?Gmail API的messages.send方法中电子邮件正文的大小限制是多少?
【发布时间】:2015-07-02 14:31:50
【问题描述】:

我正在使用官方.net api client通过messages.send方法发送带有附件的电子邮件。当我附加一个大小超过大约 5mb 的文件时,我来了

[JsonReaderException: Unexpected character encountered while parsing value: <. Path '', line 0, position 0.]
   Newtonsoft.Json.JsonTextReader.ParseValue() +1187
   Newtonsoft.Json.JsonTextReader.ReadInternal() +65
   Newtonsoft.Json.JsonTextReader.Read() +28
   Newtonsoft.Json.Serialization.JsonSerializerInternalReader.ReadForType(JsonReader reader, JsonContract contract, Boolean hasConverter) +237
   Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent) +783
   Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType) +293
   Newtonsoft.Json.JsonConvert.DeserializeObject(String value, Type type, JsonSerializerSettings settings) +274
   Newtonsoft.Json.JsonConvert.DeserializeObject(String value, JsonSerializerSettings settings) +57
   Google.Apis.Json.NewtonsoftJsonSerializer.Deserialize(String input) in c:\code\google.com\google-api-dotnet-client\default\Tools\Google.Apis.Release\bin\Debug\test\default\Src\GoogleApis.Core\Apis\Json\NewtonsoftJsonSerializer.cs:120
   Google.Apis.Services.<DeserializeError>d__8.MoveNext() in c:\code\google.com\google-api-dotnet-client\default\Tools\Google.Apis.Release\bin\Debug\test\default\Src\GoogleApis\Apis\Services\BaseClientService.cs:286

[GoogleApiException: An Error occurred, but the error response could not be deserialized]
   Google.Apis.Requests.ClientServiceRequest`1.Execute() in c:\code\google.com\google-api-dotnet-client\default\Tools\Google.Apis.Release\bin\Debug\test\default\Src\GoogleApis\Apis\Requests\ClientServiceRequest.cs:102

我认为客户使用Metadata URI, for metadata-only requests。我将尝试另一种选择:上传 URI,用于媒体上传请求。 电子邮件大小似乎存在限制,导致在客户端库中解析错误响应时出现异常。

那么,第一个问题:有大小限制吗? 其次,没有关于如何通过客户端使用different upload methods的信息,您知道任何客户端库文档吗?

更新:我破解了由

生成的请求
var request = gmailService.Users.Messages.Send(message, AccountUserId);

将前往https://www.googleapis.com/gmail/v1/users/me/messages/send。正如我猜想的那样,它没有使用媒体上传请求。

【问题讨论】:

  • 今天开始在现有应用程序上遇到同样的问题。查看文件大小,原因... 8MB?

标签: gmail-api


【解决方案1】:

我最终限制了附件总大小。这是代码sn-p。

班级等级:

public const int MaxAttachmentsSize = 5 * 1024 * 1024;

方法级别:

var attachmentsSize = 0;
foreach (var attachment in attachments)
{
    attachmentsSize += attachment.Item1;
    if (attachmentsSize > MaxAttachmentsSize) break;
    mailMessage.Attachments.Add(attachment.Item2);
}

【讨论】:

  • 你只是凭经验算出极限?
【解决方案2】:

整条消息的 MB 数有限制。 Google API 允许您发送相当大的电子邮件,但如果您的服务由于连接速度太长,发送时可能会超时。

根据这个 google 文档,它是 35MB:

google api send docs

【讨论】:

  • 这是不正确的,因为谷歌文档声明 35mb 限制仅适用于媒体上传请求。其次,连接持续时间不到一秒。
  • 你说的实话。我犯了这个错误,因为 user.messages.send 和 user.messages.attachements 中有单独的文档。
  • 我认为 Gmail API 在验证 Content-Length 标头后会立即关闭连接。
  • 我也尝试在这些文档中找到:tools.ietf.org/html/rfc2822#section-2.3
【解决方案3】:

对于超过几 MB 的任何内容(上传),您绝对应该使用该方法的 /upload 版本,否则您可能会遇到这些大小限制。

【讨论】:

  • 这个问题到底是什么限制?如果你知道,告诉它,否则不要引用这个问题。
【解决方案4】:

针对您问题的第二部分...

其次,没有关于如何通过客户端使用不同的上传方法的信息,你知道任何客户端库文档吗?

我在 API 中进行了一些探索,发现还有一个将流作为第三个参数的方法。

services.Users.Messages.Send( body, userId, stream, contentType)

深入研究它的源代码,我发现它似乎使用了一个如下所示的 URL:

upload/....

我还没有尝试过,我不知道(还)它想要什么“流”,但这看起来是获得具有更大限制的可恢复上传的一个很好的可能性。

【讨论】:

  • 我有使用这个重载的代码。我现在不记得了,但我想上次我没有成功。
  • 我记得在如何将正文和附件作为参数传递时存在问题。附件应在流中传递。流中应该使用什么格式?这种情况下body应该如何构造?
猜你喜欢
  • 2019-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-07
  • 2018-07-28
  • 1970-01-01
  • 2016-11-23
  • 2010-12-08
相关资源
最近更新 更多