在 Google Apps 脚本中检查电子邮件是不是有效

Posted

技术标签:

【中文标题】在 Google Apps 脚本中检查电子邮件是不是有效【英文标题】:Checking if an email is valid in Google Apps Script在 Google Apps 脚本中检查电子邮件是否有效 【发布时间】:2011-04-29 20:59:01 【问题描述】:

我正在使用内置 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)

根据documentation,MailApp 类中仅有的两种方法是发送电子邮件和检查每日配额——与检查有效电子邮件地址无关——所以我真的不知道必须满足哪些标准接受请求的类,因此无法编写验证例程。

【问题讨论】:

使用简单的电子邮件验证正则表达式怎么样? \b[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]2,4\b @Ravi:我可以这样做,但是由于 API 调用在无效地址上中断,我非常想知道电子​​邮件必须满足什么标准,并且能够验证事先... Hmm..so sendEmail 如果它是无效的电子邮件,是否会抛出一些特定的异常? 这个Wiki page 似乎非常详尽地解决了这个问题。如果 sendMail 在任何“合法”允许的格式上失败,则应将其报告为功能请求。编辑:您也可以围绕它进行尝试并存储导致错误的电子邮件地址。 【参考方案1】:

另一方面,避免在脚本中检查电子邮件并摆脱丢失配额或 try-catch 等。我曾经在用户尝试发送电子邮件时收到一封有效的电子邮件,方法是让他在电子邮件中签名并收到该电子邮件:

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

Full procedure Here.

【讨论】:

【参考方案2】:

如果您需要事先验证电子邮件地址,请在您的驱动器中创建一个空白电子表格。然后,运行下面的函数,将 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;
  

来自How to validate email address in javascript?的正则表达式

【讨论】:

我正在考虑使用类似的解决方案,但我使用的是驱动器服务 DriveApp 而不是电子表格服务 SpreadhseetApp,并且使用 DriveApp 服务导致通知电子邮件被发送到观众。但是看了this answer之后发现SpreadsheetApp没有发送邮件通知。好答案! 您也可以创建一个临时电子表格,然后将其丢弃,而不是为此目的将电子表格留在云端硬盘中。【参考方案3】:

保持冷静,捕捉并记录异常并继续:

try 
  // do stuff, including send email
  MailApp.sendEmail(email, subject, msg)
 catch(e) 
  Logger.log("Error with email (" + email + "). " + e);

【讨论】:

这个问题已经过时了——我需要使用该应用程序发送的所有电子邮件都已发送。但如果我必须再次这样做,我肯定会这样做。 我认为您不能指定要在 JavaScript 中捕获的异常类型 这会导致什么样的异常?如果您向无效电子邮件发送过多的电子邮件,您将被禁止。 这个问题是像Service invoked too many times for one day: email.这样的其他例外被归类为格式错误的电子邮件地址。 以下是我发现的一些异常:Failed to send email: no recipientInvalid email: abc@abc 另外,为避免配额超载,您可以使用 MailApp.getRemainingDailyQuota()

以上是关于在 Google Apps 脚本中检查电子邮件是不是有效的主要内容,如果未能解决你的问题,请参考以下文章

Google 电子表格脚本:检查单元格是不是为空

Google Apps脚本未检测到当前行

在 Google Apps 脚本中使用 BigQuery 连接到 Google 电子表格

Google 表格中的 Google Apps 脚本是不是有类似悬停的触发器?

仅通过 Google Apps 脚本值修改 Google 电子表格

Google Apps脚本 - 电子邮件库存通知?