独特的电子邮件地址验证(xpages)

时间:2017-07-18 02:38:20

标签: xpages xpages-ssjs

案例:为用户创建数据库(系统)以请求发送电子邮件并在names.nsf中更新。

发现问题,假设我们无法编辑names.nsf视图或创建新视图只是为了检查Internet地址的唯一性。

示例:用户的InternetAddress(电子邮件地址)字段为:TestUser1@brooke.com.my

我不能仅仅使用选择器验证器来验证电子邮件地址的唯一性,因为没有视图,并且不允许在names.nsf中创建视图,只是为了对其进行排序并将其用于验证,我想知道另一种方式做验证〜?

arr

中的示例值

array

2017年7月19日新增编码

var setdoc:NotesDocument = database.getProfileDocument("System Setting", "");
var server = setdoc.getItemValueString("DBSvr");
var DName = setdoc.getItemValueString("DbPath");
var db:NotesDatabase = session.getDatabase(server, DName, false);

var vw:NotesView = db.getView("($VIMPeopleByLastName)")
var doc:NotesDocument = vw.getFirstDocument();

var arr = [];       

while (doc != null) {
    var tmpdoc = vw.getNextDocument(doc);
    arr.push(doc.getItemValueString("InternetAddress"));
    doc.recycle();  //  to prevent IBM Notes Crash use recycle  //  The recycle method unconditionally destroys an object // and returns its memory to the system.
    doc = tmpdoc;
}

value=getComponent("mail11").getValue() +"@devsvr1.pcs.com.my"

return @IsMember(value, arr);

Error

较新的测试结果:

enter image description here

- 该领域的属性

enter image description here

-validation property field

enter image description here

编码部分

<xp:this.expression><![CDATA[#{javascript:
var setdoc:NotesDocument = database.getProfileDocument("System Setting", "");
var server = setdoc.getItemValueString("DBSvr");
var DName = setdoc.getItemValueString("DbPath");
var db:NotesDatabase = session.getDatabase(server, DName, false);

var vw:NotesView = db.getView("($VIMPeopleByLastName)")
var doc:NotesDocument = vw.getFirstDocument();

var arr = [];       

while (doc != null) {
    var tmpdoc = vw.getNextDocument(doc);

        arr.push(doc.getItemValueString("InternetAddress"));

    doc.recycle();
    doc = tmpdoc;
}

value=getComponent("mail11").getValue() +"@devsvr1.pcs.com.my"

return @IsMember(value, arr);
}]]></xp:this.expression>

2 个答案:

答案 0 :(得分:2)

我看到三种可能性,无需更改names.nsf:

即可查找互联网地址
  1. &#34;步行&#34;通过隐藏视图&#34;($ Users)&#34;并将您的互联网地址与列InternetAddress
  2. 进行比较
  3. 使用database.search()

  4. 如果names.nsf是全文索引的,请使用database.FTSearch()

  5. search的示例:

    var formula = 'InternetAddress="TestUser1@brooke.com.my":"TestUser2@brooke.com.my";
    var dc:NotesDocumentCollection = database.search(formula);
    if (dc.getCount() > 0) {
       // read documents' InternetAddresses and tell user which are used already
    }
    

    FTsearch的示例:

    var search = '[InternetAddress]="TestUser1@brooke.com.my";
    var dc:NotesDocumentCollection = database.FTsearch(search);
    if (dc.getCount() > 0) {
       // tell user internet address is used already
    }
    

    将您的代码放入例如表达式验证器:

    <xp:inputText
        id="inputMail1">
        <xp:this.validators>
            <xp:validateExpression
                message="Your Error message">
                <xp:this.expression><![CDATA[#{javascript:
                    ... your code ...
                    return @IsMember(value, arr);
                }]]></xp:this.expression>
            </xp:validateExpression>
        </xp:this.validators>
    </xp:inputText>
    <xp:message
        id="message1"
        for="inputMail1">
    </xp:message>
    

    value包含要验证的字段值。不要忘记一个消息控件来向用户显示错误消息。

答案 1 :(得分:2)

以下是 SSJS 功能,可检查具有特定 ID 的用户是否存在于任何可用的地址簿中:

function isDominoUser(id) {
    try {
        var db,vw,doc,itr;

        itr=sessionAsSigner.getAddressBooks().iterator();
        while (itr.hasNext()) {
            db=itr.next();
            try {
                if (!db.open()) continue;
                vw=db.getView("($Users)");
                doc=vw.getDocumentByKey(id,true);
                if (doc) {
                    doc.recycle();
                    vw.recycle();
                    return true;
                }
                vw.recycle();
            } catch(err1) {}
        }

    } catch(err) {
        java.lang.System.out.println("ERROR: "+err.toString()+" [isDominoUser]");
    }
    return false;
}

由于($ Users)视图还包含邮件地址,因此您可以使用该功能查明用户是否已使用某个地址注册。

根据您发布的代码示例,您的验证表达式将如下所示:

return isDominoUser(getComponent("mail11").getValue()+"@devsvr1.pcs.com.my");

PS:您必须确保签名者至少具有对地址簿的读取权限。