валидация — действительная / недействительная разница в политике формата электронной почты между ColdFusion и переполнением стека

Я здесь не для того, чтобы вести войну между людьми, работающими с PHP и ColdFusion, и не выяснять, какой язык лучше других. Поэтому, пожалуйста, приведите разумные аргументы по этому конкретному вопросу.

Я также не уверен, вписывается ли этот вопрос в политику stackoverflow. Но вот оно

Если вы подтвердите адрес электронной почты тест @ 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

7

Решение

Создайте свою собственную обертку. My isEmail () UDF использует специальные правила для включения / исключения тестовых адресов электронной почты в зависимости от IP. (Я должен был разрешить некоторые конкретные IP-адреса для тестирования.) Я также добавил 2-й параметр, чтобы указать тип проверки … BIF ColdFusion isValid («электронная почта») является значением по умолчанию, а затем есть регулярное выражение, Java с DNS (который учитывает DNS TTL) и Java без DNS.

Вот регулярное выражение UDF от CFLib.org:

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

Если вы хотите попробовать реализацию Java с ColdFusion, проверьте:

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>
1

Другие решения

PHP дальше от стандарта RFC, чем Coldfusion, но ближе к общему представлению о том, что электронная почта, скорее всего, будет иметь:

  • ан @
  • полное доменное имя — полностью определенное доменное имя (i.e @ mydomain.com)
  • домен верхнего уровня — домен верхнего уровня (т.е. .com)
  • буквенно-цифровое + непустое слово границы имени пользователя (например, john.doe @ …)

(У Coldfusion есть все это, а также больше, как показывает ваш пример)

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector