ColdFusion和PHP之间的有效/无效电子邮件格式策略差异


valid/invalid Email format policy difference between ColdFusion and PHP

我来这里既不是为了在PHP和ColdFusion之间开战,也不是为了找出哪种语言比其他语言更好。因此,请为这一点提供合理的论据。

我也不确定这类问题是否符合斯塔克夫弗洛的政策。但这里是

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

根据维基百科的说法,这是一个有效的电子邮件地址。请搜索术语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

创建自己的包装器。我的isEmail()UDF根据IP使用特殊规则来包括/排除测试电子邮件地址。(我必须允许一些特定的IP进行测试。)我还添加了第二个参数来指示验证类型。。。ColdFusion的BIF isValid("电子邮件")是默认值,然后是regex、Java w/DNS(尊重DNS TTL)和Java w/o DNS。

以下是来自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版本中报告的错误仅在最新或即将推出的版本中得到修复。)

java类有一个PHP版本。通过使用它,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>

PHP比Coldfusion更接近RFC标准,但更接近电子邮件最可能具有的一般概念:

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

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