问题描述
我正在想办法让一个Gmail/gSuite账户在接下来的24小时内还能发送多少封电子邮件。简而言之,我希望有一种一致的方式来获得Gmail发送配额。
根据我的理解,Gmail/gSuite的发送配额可以概括为以下内容(不包括MailApp):
在APP脚本中使用GmailApp,limits are:
- GSuite帐户每天1500个收件人
- 试用版中的GSuite帐户每天有100至500名收件人
- 每天100个收件人Gmail帐户
使用"原始"Gmail Apis,limits are:
- GSuite帐户每天发送2000条消息
- 试用版中的GSuite帐户每天500封邮件
- 每天500个收件人Gmail帐户
考虑到在我的appscript实现中,我可以使用GmailApp或advanced gmail service,我如何才能始终获得剩余配额来展示用户并最终停止电子邮件?
我走了这两条路,但没有结果:
1)在应用程序脚本中,我可以使用MailApp.getRemainingDailyQuota()然而,从我的测试来看,该方法似乎并不返回实际值,而只是长时间间隔(在我的测试中为8小时)刷新的"上次计算的"值。这是我使用的代码:
function logRemainingQuota(e) {
var emailQuotaRemaining = MailApp.getRemainingDailyQuota();
Logger.log("Remaining email quota now: " + emailQuotaRemaining);
}
我尝试通过Gmail发送电子邮件,并通过同一个账户发送一些插件,但配额从未立即减少,仅仅几个小时后。
2)使用Gmail接口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
然而,这个值似乎不是真的,并且返回了更多的数据。此外,无法区分试用中和未试用的GSuite帐户,这使得以可靠的方式应用计算变得困难。总结一下,我有以下问题:
- 有没有办法计算/获取通过Gmail发送邮件(或收件人)的剩余配额(如果在应用脚本中会更好)?
- 有没有办法了解GSuite帐户是否处于试用状态?
很抱歉发了这么长的帖子,谢谢你的帮助!
-编辑-
所以,我已经更新了我的代码以对我的脚本执行测试:
function sendWithGmailApp(e) {
var now = new Date();
GmailApp.sendEmail("[email protected]", "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(高级服务)不会消耗此配额,因此回落到standard gmail quota。
- 我已经在旧的GAE引擎中进行了测试,它工作正常
所以现在我的问题是
1)如果我的应用程序使用高级服务,我是否可以通过Gmail API预测用户配额?
2)使用高级服务,也会影响URLFetch配额,因为它基本上是一个包装器?
推荐答案
方法MailApp.getRemainingDailyQuota()将返回邮件应用和GmailApp使用相关的剩余配额,其限制如下here。
创建messages.list时,响应还包括来自闲逛的消息,这些消息带有"聊天"标签。在任何情况下,您都可以按"已发送"标签筛选已发送的邮件。
您可以尝试使用Messages.list方法找到解决方法,问题是您不知道刷新每个用户的配额的时间,如here所述:
如果您要尝试开发某种封闭的解决方法,Properties类可用于使用脚本和基于时间的triggers存储每个用户的值,可能对您有用。关于您的高级服务问题,他们的配额没有在文档中指定,但受URLFecthApp限制是有意义的,因为两者都被视为external APIs请求。另外,请注意Gmail API有自己的usage limits集。这篇关于如何一致地获取/计算Gmail发送限制的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!