Проверка правильности электронной почты в скрипте Google Apps

Я использую встроенный API-интерфейс для написания сценариев для электронных таблиц Google, чтобы отправлять подтверждения бронирования, и в настоящее время мой сценарий ломается, если кто-то ввел неверный адрес электронной почты. Я бы хотел, чтобы он просто сохранял некоторые данные в список гостей, которые не были уведомлены, а затем продолжал циклический просмотр бронирований.

Это мой текущий код (упрощенный):

// The variables email, subject and msg are populated.
// I've tested that using Browser.msgBox(), and the correct column values are
// found and used

// The script breaks here, if an incorrect email address has been filled in
MailApp.sendEmail(email, subject, msg)

Согласно документации, в классе MailApp есть только два метода: отправка электронных писем и проверьте дневную квоту - ничего о проверке действительных адресов электронной почты - поэтому я действительно не знаю, какие критерии должны быть выполнены, чтобы класс принял запрос, и поэтому не могу написать процедуру проверки.


person Tomas Aschan    schedule 24.10.2010    source источник
comment
Как насчет использования простого регулярного выражения для проверки электронной почты? \b[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b   -  person rkg    schedule 24.10.2010
comment
@Ravi: Я мог бы сделать что-то подобное, но поскольку вызов API обрывается на недопустимом адресе, мне бы очень хотелось точно знать, какому критерию должно соответствовать электронное письмо, и иметь возможность проверить это заранее...   -  person Tomas Aschan    schedule 29.10.2010
comment
Хм... так делает ли sendEmail какое-то конкретное исключение, если это недействительный адрес электронной почты?   -  person rkg    schedule 29.10.2010
comment
Эта вики-страница, похоже, исчерпывающе рассматривает этот вопрос. Если sendMail терпит неудачу в любом из «законно» разрешенных форматов, то об этом следует сообщать как о запросе функции. РЕДАКТИРОВАТЬ: Вы также можете попробовать обойти его и сохранить адрес электронной почты, вызвавший ошибку.   -  person Anton Soradoi    schedule 07.04.2012


Ответы (3)


Сохраняйте спокойствие, поймайте и зарегистрируйте исключение и продолжайте:

try {
  // do stuff, including send email
  MailApp.sendEmail(email, subject, msg)
} catch(e) {
  Logger.log("Error with email (" + email + "). " + e);
}
person Peter H    schedule 18.05.2012
comment
Эта проблема устарела - все электронные письма, которые мне нужно было отправить с помощью этого приложения, уже отправлены. Но если мне придется сделать это снова, я определенно сделаю это именно так. - person Tomas Aschan; 18.05.2012
comment
Я думаю, вы не можете указать тип исключения для перехвата в JavaScript - person CaptainNemo; 20.12.2014
comment
Какое исключение это вызывает? Если вы отправите слишком много писем на недействительные адреса, вы будете забанены. - person User; 27.04.2017
comment
Проблема в том, что другие исключения, такие как Service invoked too many times for one day: email., классифицируются как адрес электронной почты с неправильным форматированием. - person User; 26.10.2017
comment
Вот некоторые исключения, которые я поймал: Failed to send email: no recipient и Invalid email: abc@abc Кроме того, чтобы избежать перегрузки по квоте, вы можете использовать MailApp.getRemainingDailyQuota() - person flo5783; 26.05.2018

Если вам нужно заранее проверить адреса электронной почты, создайте пустую электронную таблицу на своем диске. Затем запустите приведенную ниже функцию, изменив переменную testSheet так, чтобы она указывала на созданную вами электронную таблицу. Функция выполнит простой тест регулярных выражений, чтобы отловить неправильно сформированные адреса, а затем проверит, действительно ли адрес действителен, попытавшись временно добавить его в качестве средства просмотра в электронной таблице. Если адрес можно добавить, он должен быть действительным.

function validateEmail(email) {
  var re = /\S+@\S+\.\S+/;
  if (!re.test(email)) {
    return false;
  } else {
    var testSheet = SpreadsheetApp.openById(arbitrarySpreadsheetInYourDrive);
    try {
      testSheet.addViewer(email);
    } catch(e) {
      return false;
    }
    testSheet.removeViewer(email);
    return true;
  }
}

регулярное выражение из Как проверить адрес электронной почты в JavaScript?

person remitnotpaucity    schedule 05.10.2017
comment
Я думал об использовании аналогичного решения, но я использовал службу привода DriveApp вместо службы электронных таблиц SpreadhseetApp, а использование службы DriveApp привело к отправке уведомления по электронной почте зрителю. Однако, просмотрев этот ответ, я обнаружил, что SpreadsheetApp не отправляет уведомление по электронной почте. Хороший ответ! - person alejandro; 03.03.2020
comment
Вы также можете создать временную электронную таблицу, а затем удалить ее, а не оставлять электронную таблицу на Диске только для этой цели. - person Janine White; 29.10.2020

С другой стороны, избегайте проверки электронной почты в сценарии и избавляйтесь от потери квоты или попытки поймать и т. д. Я использовал это, чтобы получить действительное электронное письмо, когда пользователь пытается отправить электронное письмо, подписывая его в электронном письме и получая это электронное письмо:

private void handleSignInResult(Task<GoogleSignInAccount> completedTask) {
    try {
        GoogleSignInAccount account = completedTask.getResult(ApiException.class);

       String s = account.getEmail(); // here is the valid email.
                       
    } catch (ApiException e) {
        // The ApiException status code indicates the detailed failure reason.
        // Please refer to the GoogleSignInStatusCodes class reference for more information.
        Log.w(TAG, "signInResult:failed code=" + e.getStatusCode());
       
    }
}

Полная процедура здесь.

person Noor Hossain    schedule 18.12.2020