Письмо с подтверждением иногда не отправляется при использовании GMail API Forwarding - PullRequest
0 голосов
/ 09 января 2020

Я настроил служебную учетную запись с делегированием по всему домену, чтобы иметь возможность использовать API-интерфейс GMail для настройки адресов пересылки и автоматической пересылки, как описано здесь. https://developers.google.com/gmail/api/guides/forwarding_settings Я делаю это из скрипта приложения Google внутри проекта (в некоммерческой учетной записи GSuite).

В спецификации говорится, что при добавлении адреса переадресации, который требует Подтверждение, электронное письмо отправляется на этот адрес немедленно, НО это не всегда происходит. Независимо от того, отправлено письмо или нет, это немного непредсказуемо, но в целом, если адрес существовал до этого как адрес пересылки с состоянием «в ожидании», и я удаляю его непосредственно перед повторным добавлением, письмо отправляется. В противном случае почта, как правило, не отправляется. Но не всегда, иногда письмо отправляется с первой попытки.

Интересно, что-то не так или есть ошибка в Gmail API? Есть идеи?

Вот мой код:

function redirectMail(user, destinationMail) {
  var service = getOAuthService(user);
  service.reset();
  if (service.hasAccess()) {
    var autoFwdStatus = getAutoFwdStatus(service, user);
    if (!autoFwdStatus.enabled || 
        autoFwdStatus.emailAddress != destinationMail) {
      var fwdAddress = getFwdAddress(service, user, destinationMail);
      if (fwdAddress.error) {
        // The user has not been sent the message yet
        setFwdAddress(service, user, destinationMail);
        // FOR some reason, we need to do this twice or 
        // the verification mail is not sent
        delFwdAddress(service, user, destinationMail);
        setFwdAddress(service, user, destinationMail);
      } else if (fwdAddress.verificationStatus != "accepted") {
        // The user hasn't verified his email,
        delFwdAddress(service, user, destinationMail);
        setFwdAddress(service, user, destinationMail);
      } else { // The user already has verified his email
        setAutoFwdStatus(service, user, destinationMail);
      }
    }
  }
}

function getAutoFwdStatus(service, user) {
  var url = "https://www.googleapis.com/gmail/v1/users/" + user +
              "/settings/autoForwarding";
  return callApiFromServiceAccount(service, url, 'get', null);
}

function setAutoFwdStatus(service, user, destinationMail) {
  var url = "https://www.googleapis.com/gmail/v1/users/" + user +
              "/settings/autoForwarding";
  var body = {
    "enabled": true,
    "emailAddress": destinationMail,
    "disposition": "leaveInInbox"
  };
  return callApiFromServiceAccount(service, url, 'put', body);
}

function getFwdAddress(service, user, address) {
  var url = "https://www.googleapis.com/gmail/v1/users/" + user + 
            "/settings/forwardingAddresses/" + address;
  return callApiFromServiceAccount(service, url, 'get', null);
}

function setFwdAddress(service, user, address) {
  var url = "https://www.googleapis.com/gmail/v1/users/" + user +
            "/settings/forwardingAddresses";
  var body = {
    "forwardingEmail": address,
    "verificationStatus": "verificationStatusUnspecified"
  };
  return callApiFromServiceAccount(service, url, 'post', body);
}

function delFwdAddress(service, user, address) {
  var url = "https://www.googleapis.com/gmail/v1/users/" + user +
            "/settings/forwardingAddresses/" + address;
  return callApiFromServiceAccount(service, url, 'delete', null);
}

function callApiFromServiceAccount(service, url, method, body) {
  var header = {
    "authorization": 'Bearer ' + service.getAccessToken()
  };
  var options = {
    method: method,
    headers: header,
    muteHttpExceptions: true
  };
  if (body) {
    options.contentType = 'application/json';
    options.payload = JSON.stringify(body);
  }
  var response = UrlFetchApp.fetch(url, options).getContentText();
  if (!response) { response = "{}"; }
  Logger.log(response);
  return JSON.parse(response);
}
...