Hi there,
I'm aware there is a constraint on the email address field on the Recipient table (aka a data policy) that only allows a "valid format" email address to be stored in this field.
Does anyone know where the "rules" of the constraint is documented?
I'd like to be able to replicate the logic when exporting data from a CRM system that exports data to Adobe Campaign, so these records can be filtered at source.
Thanks
David
Hi,
The dataPolicy rules are undocumented, but if you're implementing validation it should hew to rfc 5322 compliance anyway:
Thanks,
-Jon
Hi David,
You can find it under Administration>Configuration> Javascript codes
it's called dataPolicy.js
Thanks
David
That's a subset of the dataPolicy functionality (missing emailOrScript, hyphenIdentifier), looks like part of interaction module's js xtk implementation. I wonder if the c++ xtk matches, and why they didn't just copy the rfc regex..
Hi davidk23955130 - I just tested that code you highlighted above with an invalid email address - "blah23/2456@gmail.com" - it passes those tests but you can't insert it into the recipient table. The email addresses passes all RFC5322 tests I have thrown at it.
Can anyone tell us the exact data policy that Adobe Campaign uses to validate an email? We need this.
email is defined as string using constraint on data policy.
If you need to use any of the special characters literally, you must escape it by putting a backslash in front of it e.g /a\*b/ to escape '*'. ACC's regex in the data policy doesn't have the escaping special characters capability as it's using an old javascript regex.
Thanks
David
Hi David - I tried what you said and escaped the special characters in the email, but the recipient write still fails. Here is my test code:
var email = "blah23\/2456@gmail.com";
var firstName = "Ford";
var lastName = "Prefect";
var mobile = "0000888999"
//RFC5322 email regex
var regexEmail = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
var pattEmail = new RegExp(regexEmail);
//this will pass
if(pattEmail.test(email)) {
var recipientId = xtk.session.GetNewIds(1);
//this will fail
xtk.session.Write(
<recipient _operation="insert"
xtkschema="nms:recipient"
id={recipientId}
email={email}
firstName={firstName}
lastName={lastName}
mobilePhone={mobile} >
<folder name="nmsRootRecipient"/>
</recipient>
);
} else {
logWarning("Bad email: " + email);
}
Views
Replies
Total Likes
And again using Adobe dataPolicy.js email test instead of the RFC5322 regex:
var email = "blah23\/2456@gmail.com";
var firstName = "Ford";
var lastName = "Prefect";
var mobile = "0000888999"
var testResult = null;
//dataPolicy.js email test
var aPart = email.split("@");
if (aPart.length === 2 && aPart[0].match(/^[\S]+$/) &&
aPart[1].match(/^([\w\-]+\.)+[\w\-]+$/)) {
testResult = email.toLowerCase();
} else {
// TODO shouldn't we return an empty string?
testResult = null;
}
logInfo("Result of Adobe email test: " + testResult);
//this will pass
if(testResult) {
var recipientId = xtk.session.GetNewIds(1);
//this will fail
xtk.session.Write(
<recipient _operation="insert"
xtkschema="nms:recipient"
id={recipientId}
email={email}
firstName={firstName}
lastName={lastName}
mobilePhone={mobile} >
<folder name="nmsRootRecipient"/>
</recipient>
);
} else {
logWarning("Bad email: " + email);
}
it's normal because your attribute in your recipient schema is still using the default dataPolicy
Thanks
David
So what is the exact test for an invalid email where the recipient schema uses the default dataPolicy? I need to be able to capture these invalid emails before it gets to the write stage
So another piece to this puzzle (provided by Support) is the option value for the valid characters in an email address XtkEmail_Characters. I tested this value and this Option value is definitely being used by the mystery validation function to check for valid characters in the email before the write happens.
What they couldn't confirm was how this was applied to the email address (local-part or domain or both). Nor could they confirm what other checks were being performed before the recipient Write was attempted.
OK - I finally have an answer on how ACC determines a valid email. It took way more effort than I expected but we got an answer:
So I am assuming that the first part of this response is the dataPolicy check and the second is a regex against the XtkEmail_Characters option. e.g. something like this
loadLibrary("xtk:shared/nl.js");
loadLibrary("xtk:shared/dataPolicy.js");
var email = "blah232456@gmail.com";
/**
*
* Function to determine if an email is valid for the Adobe Campaign
* database checks. This process checks using the default email dataPolicy
* and the option value XtkEmail_Characters.
*
* @param email {string} email address to test
* @return true(valid) | false(invalid)
*
**/
function isValidAdobeEmail( email ) {
var patt = "[^@" + getOption('XtkEmail_Characters').replace(/[.*+?\-^${}()|[\]\\]/g, '\\\$&') + "]";
//logInfo("EmailFunctions.js::isValidAdobeEmail() - Escaped XtkEmail_Characters: " + patt);
var regex = new RegExp(patt, "g");
var testFlag = !regex.test(email);
//logInfo("Result of XtkEmail_Characters test: " + ((testFlag)?"valid":"invalid"));
var dataPolicyResult = !NL.isEmpty(NL.DataPolicy.filter("email", email));
//logInfo("Result of dataPolicy email test: " + ((!NL.isEmpty(dataPolicyResult))?"valid":"invalid"));
return testFlag && dataPolicyResult;
}
//Test the email
if( isValidAdobeEmail(email) ) {
//email address is valid
} else {
//email is invalid
}
Edit: minimised the code
Views
Replies
Total Likes
Hi,
No there is no regex here. The code is matching characters after splitting the string into @ and .
Pseudocode in js would be:
str.split(/[@.]/).filter(function(_){
return _.match(/^[XtkEmail_Characters as a character class]+$/);
}).length >= 3
Thanks,
-Jon
Views
Replies
Total Likes
Views
Likes
Replies
Views
Likes
Replies
Views
Likes
Replies
Views
Likes
Replies