You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

旧版Informix中实现合规邮箱验证函数的方案咨询

在旧版Informix中实现邮箱验证函数的修正方案

你的现有代码存在几个关键问题,导致无法正确验证邮箱:

  1. 错误地用NOT LIKE '%__@__%.__%'这类条件过滤了合法的长邮箱(比如abc@def.com会被误判为无效)
  2. 没有检查邮箱中是否包含非法字符(比如逗号、Ü这类)
  3. 部分条件逻辑错误(比如%@%_'无法有效防止域名结尾点的问题)

下面是符合你需求的修正后的函数代码,完全基于Informix的字符串函数和LIKE语法实现:

CREATE FUNCTION is_valid_email(email_param VARCHAR(255))
  RETURNING INTEGER;

  DEFINE is_valid INTEGER;
  DEFINE at_pos INTEGER;
  DEFINE local_part VARCHAR(255);
  DEFINE domain_part VARCHAR(255);

  LET is_valid = 0;
  LET at_pos = INDEX(email_param, '@');

  -- 基础格式检查:存在且仅存在一个@,长度足够,域名至少有一个点,无连续点
  IF at_pos > 1 
    AND at_pos < LENGTH(email_param) - 2  -- 确保@后至少有两个字符(比如x.y)
    AND email_param NOT LIKE '%@%@%'
    AND email_param NOT LIKE '%..%'
    THEN
      LET local_part = SUBSTRING(email_param FROM 1 TO at_pos - 1);
      LET domain_part = SUBSTRING(email_param FROM at_pos + 1);

      -- 检查本地部分仅含字母数字
      IF local_part NOT LIKE '%[^a-zA-Z0-9]%'
        -- 检查域名部分:不以点开头/结尾,仅含字母数字和点,且至少有一个点
        AND domain_part NOT LIKE '.%'
        AND domain_part NOT LIKE '%.'
        AND domain_part LIKE '%.%'
        AND domain_part NOT LIKE '%[^a-zA-Z0-9.]%'
      THEN
        LET is_valid = 1;
      END IF;
  END IF;

  RETURN is_valid;
END FUNCTION;

关键逻辑说明:

  • 基础校验:先确保邮箱有且只有一个@,@不在开头或结尾,且没有连续的点
  • 本地部分校验:用NOT LIKE '%[^a-zA-Z0-9]%'排除所有非字母数字的字符
  • 域名部分校验:
    • 禁止以点开头或结尾
    • 确保至少包含一个点(支持多级域名)
    • 仅允许字母数字和点,排除非法字符(比如逗号、Ü这类不在[a-zA-Z0-9.]范围内的字符)

你可以测试以下场景验证效果:

  • 合法邮箱:user123@domain.com、abc@sub.domain.co.uk
  • 非法邮箱:user@domain.(域名结尾点)、user@..domain(连续点)、user,name@domain.com(含逗号)、Üser@domain.com(含特殊字符)、user@domain(无域名后缀点)

内容的提问来源于stack exchange,提问作者Martí Castell

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 08:52:50