valid/invalid ColdFusion 和 PHP 之间的电子邮件格式策略差异
valid/invalid Email format policy difference between ColdFusion and PHP
我来这里既不是要在 PHP 和 ColdFusion 人员之间进行 war,也不是要找出哪种语言比其他语言更好。所以请针对这一点给出合理的论据。
我也不确定这种问题是否符合Whosebug的政策。但这里是
如果您在 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
创建您自己的包装器。我的 isEmail() UDF 根据 IP 使用特殊规则 including/excluding 测试电子邮件地址。 (我必须允许一些特定的 IP 进行测试。)我还添加了第二个参数来指示验证类型...ColdFusion 的 BIF isValid("email") 是默认值,然后是正则表达式,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 class 有一个 PHP 版本可用。通过使用它,ColdFusion、PHP 和 C# 结果将是一致的。
https://code.google.com/p/isemail/downloads/list
如果您想尝试使用 ColdFusion 实现 Java,请查看:
这是我在此处发布的一些示例代码:
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 标准,但更接近电子邮件最有可能包含的一般概念:
- 一个@
- a FQDN - 完全限定的域名(即@mydomain.com)
- 一个 TLD - 顶级域(即 .com)
- 字母数字+非space字边界用户名(即john.doe@...)
(Coldfusion 确实拥有所有这些以及更多,正如您的示例所指出的)
我来这里既不是要在 PHP 和 ColdFusion 人员之间进行 war,也不是要找出哪种语言比其他语言更好。所以请针对这一点给出合理的论据。
我也不确定这种问题是否符合Whosebug的政策。但这里是
如果您在 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
创建您自己的包装器。我的 isEmail() UDF 根据 IP 使用特殊规则 including/excluding 测试电子邮件地址。 (我必须允许一些特定的 IP 进行测试。)我还添加了第二个参数来指示验证类型...ColdFusion 的 BIF isValid("email") 是默认值,然后是正则表达式,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 class 有一个 PHP 版本可用。通过使用它,ColdFusion、PHP 和 C# 结果将是一致的。
https://code.google.com/p/isemail/downloads/list
如果您想尝试使用 ColdFusion 实现 Java,请查看:
这是我在此处发布的一些示例代码:
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 标准,但更接近电子邮件最有可能包含的一般概念:
- 一个@
- a FQDN - 完全限定的域名(即@mydomain.com)
- 一个 TLD - 顶级域(即 .com)
- 字母数字+非space字边界用户名(即john.doe@...)
(Coldfusion 确实拥有所有这些以及更多,正如您的示例所指出的)