【问题标题】:valid/invalid Email format policy difference between ColdFusion and PHPColdFusion 和 PHP 之间的有效/无效电子邮件格式策略差异
【发布时间】:2015-02-26 08:59:51
【问题描述】:

我在这里既不是要在 PHP 和 ColdFusion 人之间开战,也不是要找出哪种语言比其他语言更好。所以请就这一点给出合理的论据。

我也不确定这种问题是否符合stackoverflow的政策。但是这里是

如果您在 ColdFusion 中验证电子邮件地址 test@testdomain,则表明它是有效的电子邮件地址。但是如果你在 PHP 中测试电子邮件地址,它会说它是一个无效的电子邮件地址。

根据wikipedia,这是有效的电子邮件地址。请搜索词 admin@mailserver1(没有 TLD 的本地域名)

我的问题是,为什么在实现上存在差异以及背后的原因。

ColdFusion 代码

<cfdump var="#isValid("email","test@testdomain")#">

输出

Yes

PHP 代码

<?php
$email = "test@testdomain";
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
  $emailErr = "Invalid"; 
}
else
{
 $emailErr = "valid";
}

echo $emailErr; 
?>

输出

Invalid

【问题讨论】:

  • 我认为 PHP 只是在帮助开发人员,因为在大多数情况下,您希望验证第三方的电子邮件。他们很可能(如 99.9% 肯定)在本地服务器之外有电子邮件,或者即使在本地,也可以通过 TLD 范围内的某个域访问。这只是我的理论,但我个人对 PHP 验证很满意,即使它没有遵循标准化的电子邮件规范。
  • @Forien,我还认为在 99.9% 的情况下,您必须使用 TLD 验证电子邮件。几个小时前,我什至不知道可以有没有 TLD 的电子邮件地址。
  • 我理解你的问题,并且会对答案感兴趣......但我建议任何使用正则表达式或内置语言功能来测试电子邮件有效性的人,只是不要。如今,任何人都可以购买自己的“TLD”,几年前针对常见嫌疑人进行验证的日子已经一去不复返了。
  • 非常肯定,唯一能回答为什么存在差异以及为什么每个人都选择他们所做方式的人是 Adob​​e 的工程师和那些为 PHP 贡献代码的人。
  • 不确定这种问题是否符合stackoverflow的政策 可能不。虽然“有效”电子邮件的剖析是一个有趣的话题,但任何关于实施的答案都只是猜测/意见。

标签: php validation coldfusion


【解决方案1】:

创建您自己的包装器。我的 isEmail() UDF 使用特殊规则来包括/排除测试电子邮件地址,具体取决于 IP。 (我必须允许一些特定的 IP 进行测试。)我还添加了第二个参数来指示验证类型...... ColdFusion 的 BIF isValid("email") 是默认设置,然后是正则表达式,Java w/DNS(尊重 DNS TTL)和没有 DNS 的 Java。

这是来自 CFLib.org 的正则表达式 UDF:

http://www.cflib.org/udf/isEmail

function isEmail(str) {
    return (REFindNoCase("^['_a-z0-9-\+]+(\.['_a-z0-9-\+]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*\.(([a-z]{2,3})|(aero|asia|biz|cat|coop|info|museum|name|jobs|post|pro|tel|travel|mobi))$",
arguments.str) AND len(listGetAt(arguments.str, 1, "@")) LTE 64 AND
len(listGetAt(arguments.str, 2, "@")) LTE 255) IS 1;
}

我更喜欢使用 Java,因为它具有更多功能、更好的失败消息、可选地使用 DNS(用于 TLD 验证和 MX 记录检查)并且可以安装在 ColdFusion 8-11 上。 (我发现当前支持的 ColdFusion 版本中报告的错误仅在最新或即将发布的版本中得到修复。)

有一个 PHP 版本的 java 类可用。通过使用它,ColdFusion、PHP 和 C# 的结果将是一致的。

https://code.google.com/p/isemail/downloads/list

如果您想尝试使用 ColdFusion 实现 Java,请查看:

http://isemail.info/

这是我在博客中写到的一些示例代码:

http://gamesover2600.tumblr.com/post/93979011009/better-coldfusion-email-validation-using-java

<cfscript>
/* Copy IsEMail.jar to java path. Download from https://code.google.com/p/isemail/downloads/list */
emails = ["test@test.com",
    "valid_but_no_mx@fake-domain.com",
    "valid_but_no_dns@fake-domain2.com",
    """much.more unusual""@example.com",
    "john.smith@example.com(comment)",
    """first\last""@iana.org",
    "first.last@com",
    """Joe.\Blow""@iana.org",
    "foobar@192.168.0.1",
    "first.last@-xample.com",
    "first.last@exampl-.com",
    "first.last@x234567890123456789012345678901234567890123456789012345678901234.iana.org"];

/* Set DNS server to prevent ColdFusion error:
   javax.naming.ConfigurationException: localhost:2932 is not a valid DNS pseudo-URL */
sys = createObject("java", "java.lang.System");
sys.setProperty("java.naming.provider.url","dns:/YOUR_DNS_SERVER");

isEmailObj = CreateObject("java", "com.dominicsayers.isemail.IsEMail");
check_DNS = true;
responseLabels = ListToArray("Email,isValid,Status,Rule ID,Rule Name,SMTP SMTP Code");

function checkEmail(e, useDNS){
    var check = isEmailObj.is_email_verbose(e, Check_DNS);
    var response =  structNew();
    response["Email"] = e;
    response["isValid"] = check.getState().isValid();
    response["Status"] = check.getStatusTextExplanatory();
    response["Rule ID"] = check.getId();
    response["Rule Name"] = check.getConstantName();
    response["SMTP"] = "N/A";
    response["SMTP Code"] = "N/A";
    if (useDNS){
        response["SMTP"] = check.getSmtpCode();
        response["SMTP Code"] = check.getSmtpCodeText();
    }
    return response;
}

for(i=1; i LTE ArrayLen(emails); i=i+1){
    writeoutput('<h2>#emails[i]#</h2>');
    temp = checkEmail(emails[i], check_DNS);
    for(a=1; a LTE ArrayLen(responseLabels); a=a+1){
        if (StructKeyExists(temp, responseLabels[a])){
            writeoutput('<div><b>#responseLabels[a]#:</b> #Temp[responseLabels[a]]#</div>');
        }
    }
    writeoutput('<hr>');
}
</cfscript>

【讨论】:

  • 答案出乎我的意料,但这是最有用的答案。所以我将其标记为已接受。谢谢你的回答。
【解决方案2】:

PHP 比 Coldfusion 更远离 RFC 标准,但更接近电子邮件最可能包含的内容的一般概念:

  • 一个@
  • FQDN - 完全限定域名(即@mydomain.com)
  • TLD - 顶级域(即 .com)
  • 字母数字 + 非空格字边界用户名(即 john.doe@...)

(正如您的示例所指出的,Coldfusion 确实拥有所有这些以及更多)

【讨论】:

  • 从 ColdFusion 11 开始,“显示名称”现在成为有效电子邮件地址的一部分。我非常希望这是一个长期未报告的错误,因为 CF2018u3 仍在执行此操作。在此评论中,以下字符串在针对 isValid("email") 进行测试时被评估为“true”,即使它们可能无法路由:test@test;测试@1.2.3.4; “测试”
猜你喜欢
  • 1970-01-01
  • 2020-10-30
  • 1970-01-01
  • 2012-12-10
  • 2014-04-14
  • 2015-06-03
  • 2022-10-14
  • 2012-05-28
  • 2022-08-21
相关资源
最近更新 更多