我有一个脚本,可以从 Gmail 获取特定草稿来发送电子邮件。它发送了 10-15 封电子邮件,然后开始抛出错误:
一天内服务调用次数过多:电子邮件。
这是代码片段:
function sendAutomatedEmails() {
var drafts = GmailApp.getDrafts();
var draftEmail = drafts.find(draft => draft.getMessage().getSubject() == "Specific Email");
if (draftEmail) {
var emailBody = draftEmail.getMessage().getBody();
var emailSubject = draftEmail.getMessage().getSubject();
GmailApp.sendEmail("[email protected]", emailSubject, '', {htmlBody: emailBody});
}
}
每日配额限制是100/天,我不确定为什么它在10-15封电子邮件后停止工作。现在我在这里做了两件事:
Console.log(MailApp.getRemainingDailyQuota()) //Output: -1
现在我的问题是:
当我只发送 10-15 封电子邮件并且显示
-1
为配额限制时,如何达到配额限制?
为什么10分钟后,当配额限制为
-1
时又开始发送电子邮件?
我真的很感谢您指导如何避免此问题,也许可以通过增加延迟或其他方式?
GmailApp
的每日配额不仅仅指发送的电子邮件数量,还包括执行的操作数量,例如阅读草稿。与 Gmail 服务的每次交互都会计入配额。如果您的脚本对每封电子邮件执行多个操作(例如,读取多个草稿),它可以快速添加。
除了每日发送限制之外,每分钟或每小时可以执行的读写操作数量还有其他限制。超过这些可能会导致暂时暂停,但一旦期限重置,您可以再次开始提出请求。
虽然每天的电子邮件收件人限制设置为 100 个,但这仍会受到其他限制,除非您的域已累计支付至少 100 美元(或等值金额)并且自达到该付款阈值以来已过去至少 60 天。
即使未达到配额,极短时间内的峰值也可能导致配额错误。为了避免将来出现问题,您可以使用指数退避来避免达到每分钟限制。这是一个示例代码片段,您可以使用它来实现指数退避:
function sendEmail() {
var retries = 5; // Max no. of retries
var baseDelay = 1000; // Initial delay in ms
var success = false;
for (var i = 0; i < retries; i++) {
try {
// Insert your code to send email here, for example
// GmailApp.sendEmail(values['Email'], subject, emailBody, mailOptions);
success = true;
break; // Should the operation be successful, exit the loop
} catch (e) {
if (i == retries - 1) {
throw e; // If this is the last retry, rethrow the exception
}
var delay = baseDelay * Math.pow(2, i); // Exponential backoff function
Logger.log('Attempt ' + (i + 1) 'failed. Retrying in ' + delay + 'ms.');
Utilities.sleep(delay);
}
}
if (!success) {
throw new Error('Failed to send email after ' + retries + 'attempts.');
}
}
由于使用限制不同,您可以使用 Gmail 服务而不是 GmailApp。 GmailApp 被设计为在 Google Apps 脚本中非常易于使用。它为发送电子邮件、阅读消息和处理草稿等常见任务提供了简单的方法。另一方面,Gmail 服务本质上是一个库,旨在更方便地与 Gmail API 交互。