如何在Puppet中验证邮箱域名是否属于数组域名或其子域名?
解决方案
问题分析
你之前用in操作符出错,是因为直接判断包含关系会导致误匹配(比如'main.com'会被误判为匹配'support.randomain.com'),且反向判断时无法区分子域名和字符串部分重叠的情况。正确逻辑应该是后缀匹配:邮箱域名要么和数组内域名完全一致,要么是该域名的子域名(即邮箱域名以'.目标域名'结尾)。
实现步骤
- 从邮箱字符串中提取
@符号后的域名部分; - 遍历域名数组,对每个域名检查两种情况:
- 邮箱域名与当前域名完全相等;
- 邮箱域名以
.当前域名结尾;
- 只要有一个域名满足任一条件,返回
True;遍历结束无匹配则返回False。
代码实现
def check_domain(email, domain_list): # 提取邮箱的域名部分 email_domain = email.split('@')[1] for domain in domain_list: # 检查完全匹配或子域名后缀匹配 if email_domain == domain or email_domain.endswith(f'.{domain}'): return True return False # 测试你的示例 str_email = 'call@support.randomain.com' arr_domains = ['randomain.com', 'test.com', 'support.com'] print(check_domain(str_email, arr_domains)) # 输出: True
测试说明
- 你的示例中,邮箱域名
support.randomain.com以.randomain.com结尾,符合子域名条件,返回True; - 若邮箱为
user@test.com,会直接匹配数组内的test.com,返回True; - 若邮箱为
user@abc.test.com,会匹配test.com(子域名),返回True; - 若邮箱为
user@randomain.com.cn,不会匹配randomain.com(结尾为.com.cn而非.randomain.com),返回False。
内容的提问来源于stack exchange,提问作者Fulliautomatix
相关产品推荐
相关产品推荐

