如何始终如一地获取/计算 Gmail 发送限制

How to consistently get / calculate Gmail sending limits

我正在尝试找出一种方法来获取 gmail/gsuite 帐户在接下来的 24 小时内仍可以发送多少封电子邮件。简而言之,我希望有一个一致的方法来获得 gmail 发送配额。

根据我的理解,gmail / gsuite 的发送配额可以概括为以下(不包括 MailApp):

在应用程序脚本中使用 GmailApp,limits are

使用 "raw" Gmail Apis,limits are

考虑到我在 appscript 中的实现可以使用 GmailApp 或 advanced gmail service,我怎样才能始终如一地获得剩余配额来展示用户并最终停止发送电子邮件?

我一直在走这两条路,但没有结果:

1) 在 appscript 中我可以使用 MailApp.getRemainingDailyQuota() 然而,从我的测试来看,这个方法似乎没有 return 实际值,而只是一个 "last time computed" 长时间刷新的值(在我的测试中花了 8 小时)

这是我用过的代码:

function logRemainingQuota(e) {
var emailQuotaRemaining = MailApp.getRemainingDailyQuota();
Logger.log("Remaining email quota now: " + emailQuotaRemaining);
}

我尝试通过同一帐户通过 gmail 和一些插件发送电子邮件,但配额从未立即减少,只是几个小时后。

2) 使用 gmail 计算值 api messages.list 通过进行以下调用,我可以在字段 resultSizeEstimate 中获取过去 24 小时内发送的电子邮件数量,或者通过简单地计算邮件数量。

curl \
  'https://www.googleapis.com/gmail/v1/users/me/messages?q=from%3Ame%20newer_than%3A1d%20in%3Aanywhere&fields=resultSizeEstimate&key=[YOUR_API_KEY]' \
  --header 'Authorization: Bearer [YOUR_ACCESS_TOKEN]' \
  --header 'Accept: application/json' \
  --compressed

查询是:from:me newer_than:1d in:anywhere 然而,这个值似乎并不真实,并且 return 收集了更多数据。 此外,无法区分正在试用的 gsuite 帐户和未试用的 gsuite 帐户,这使得难以以可靠的方式应用计算。

总结起来,我有以下问题:

抱歉拖了这么久post,感谢您的帮助!

---- 编辑 ----

所以,我更新了我的代码以对我的脚本执行测试:

function sendWithGmailApp(e) {

  var now = new Date();
  GmailApp.sendEmail("example@gmail.com", "current time", "The time is: " + now.toString());

  Logger.log("Gmail App used ");

  var emailQuotaRemaining = MailApp.getRemainingDailyQuota();
  Logger.log("Remaining email quota now Gmail App: " + emailQuotaRemaining);
}

function sendWithGmailAPI(e) {
  var draft = GmailApp.getMessageById('17139fda2e54af59');
  var raw = draft.getRawContent();
  var message = Gmail.newMessage();
  Gmail.Users.Messages.send(message, "me", Utilities.newBlob(raw, "message/rfc822"));
  Logger.log("Gmail Api used ");

  var emailQuotaRemaining = MailApp.getRemainingDailyQuota();
  Logger.log("Remaining email quota now Gmail Api: " + emailQuotaRemaining);
}

function showquota(){
var emailQuotaRemaining = MailApp.getRemainingDailyQuota();
  Logger.log("Remaining email quota now Gmail App: " + emailQuotaRemaining);
}

我还复制了一份脚本以确定配额是基于用户还是基于 user/script。 这是我的结论:

所以现在我的问题是,

1) 如果我的应用程序使用高级服务,有没有办法通过 gmail API 预测用户的配额?

2) 使用高级服务,也会影响 URLFetch 配额,因为它基本上是一个包装器?

方法MailApp.getRemainingDailyQuota() will return the remaining quota related to the use of MailApp and GmailApp, whose limits are stated here.

当发出 messages.list 响应时,响应也包括来自视频群聊的消息,这些消息带有 "CHAT" 标签。在任何情况下,您都可以通过 "SENT" 标签过滤已发送的消息。

您可以尝试使用 messages.list 方法找到解决方法,问题是您不知道每个用户的配额何时刷新,如 here 所述:

Limits per day are applied over a rolling 24-hour period, not a set time of day.

如果您要尝试开发某种接近的解决方法,Properties class that can be used to store values for each user using the script and time-based triggers , 可能对你有用。

关于您的高级服务问题,文档中未指定它们的配额,但受 URLFecthApp 限制的限制是有意义的,因为两者都被视为 external APIs requests. Also, be aware that Gmail API has its own set of usage limits