提问者:小点点

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


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

据我了解,用于发送的gmail/gsuite配额可以总结为以下(不包括MailApp):

在应用脚本中使用GmailApp,限制为:

  • 每天1500个谷歌办公套件账户收件人
  • 每天100到500个试用谷歌办公套件帐户的收件人
  • 每天100个收件人Gmail帐户

使用“原始”Gmail Apis,限制是:

  • 每天为谷歌办公套件帐户发送2000条消息
  • 试用中的谷歌办公套件帐户每天500条消息
  • 每天500个收件人Gmail帐户

考虑到在我的appscript实现中,我可以使用GmailApp或高级gmail服务,我如何始终如一地获得剩余配额来展示用户并最终停止电子邮件?

我沿着这两条路走,但没有结果:

1)在appscript中,我可以使用MailApp. getRemainingDailyQuota()但是从我的测试来看,这个方法似乎不返回真实值,而只是一个“上次计算”的值,它会以很长的时间间隔刷新(在我的测试中花了8小时)

这是我使用的代码:

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

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

2)使用gmail api message. list计算值通过进行以下调用,我可以获得过去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: menewer_than:1d in:any但是这个值似乎不是真的,并且返回了更多的数据。此外,没有办法区分正在试用的gsuite帐户和没有试用的帐户,这使得很难以可靠的方式应用计算。

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

  • 有没有一种方法可以用来计算/获取使用gmail发送消息(或收件人)的剩余配额数量(如果在应用程序脚本中更好)?
  • 有没有办法了解gsuite帐户是否在试用中?

抱歉发了这么长的帖子,谢谢你的帮助!

----编辑----

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

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);
}

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

  • MailApp. getRemainingDailyQuota()适用于通过GmailApp发送的电子邮件
  • 配额与GmailApp/MailApp相关,并且是基于用户的(因此其他脚本可以消耗配额)
  • 使用GmailApi(高级服务)不会消耗此配额,因此它会回退到标准gmail配额中。
  • 我已经在传统的GAE引擎中进行了测试,它可以工作

所以现在我的问题是,

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

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


共1个答案

匿名用户

MailApp. getRemainingDailyQuota()方法将返回与使用MailApp和GmailApp相关的剩余配额,此处说明了它们的限制。

制作message. list时,响应也包括来自环聊的消息,这些消息带有“聊天”标签。在任何情况下,您都可以按“SENT”标签过滤已发送的消息。

您可以尝试使用message. list方法找到解决方法,问题是您不知道每个用户的配额在什么时候被刷新,如下所述:

每天的限制是在滚动的24小时内应用的,而不是一天中的固定时间。

如果您要尝试开发某种紧密的解决方法,可用于使用脚本和基于时间的触发器为每个用户存储值的Properties类可能对您有用。

关于您的高级服务问题,它们的配额未在留档中指定,但受URLFecthApp限制是有意义的,因为两者都被视为外部API请求。此外,请注意GmailAPI有自己的一组使用限制。