### Install openCRX Server using IzPack Installer Source: https://context7.com/opencrx/opencrx-documentation/llms.txt Details the steps for installing the openCRX Server using the IzPack installer, suitable for evaluation and testing. It lists prerequisites (JDK 21, Apache Ant) and provides commands for running the installer and starting/stopping the server on Linux and Windows. ```bash # Prerequisites: JDK 21, Apache Ant # Download and run installer java -jar opencrxServer-6.0.0-installer.jre-21.jar # Start openCRX Server (Linux) cd ./opencrxServer/apache-tomee-plus-10.0.0/bin ./opencrx.sh run # Start openCRX Server (Windows) cd .\opencrxServer\apache-tomee-plus-10.0.0\bin opencrx.bat run # Access openCRX # URL: http://localhost:8080/opencrx-core-CRX/ # Stop openCRX Server (Linux) ./opencrx.sh stop ``` -------------------------------- ### Server Installation Source: https://context7.com/opencrx/opencrx-documentation/llms.txt Install openCRX Server using the IzPack installer for evaluation and testing environments. This section details prerequisites and commands to start/stop the server. ```APIDOC ## Server Installation Install openCRX Server using the IzPack installer for evaluation and testing environments. ### Prerequisites: JDK 21, Apache Ant ### Download and run installer ```bash java -jar opencrxServer-6.0.0-installer.jre-21.jar ``` ### Start openCRX Server (Linux) ```bash cd ./opencrxServer/apache-tomee-plus-10.0.0/bin ./opencrx.sh run ``` ### Start openCRX Server (Windows) ```bash cd .\opencrxServer\apache-tomee-plus-10.0.0\bin opencrx.bat run ``` ### Access openCRX - **URL**: http://localhost:8080/opencrx-core-CRX/ ### Stop openCRX Server (Linux) ```bash ./opencrx.sh stop ``` ``` -------------------------------- ### Account Queries Source: https://github.com/opencrx/opencrx-documentation/blob/master/Sdk/Rest.md Examples of how to query accounts using the REST API, demonstrating filtering, sorting, and pagination. ```APIDOC ## Account Queries ### Description Examples of how to query accounts using the REST API, demonstrating filtering, sorting, and pagination. ### Endpoint `/org.opencrx.kernel.account1/provider/{providerName}/segment/{segmentName}/account` ### Query Examples 1. **Basic Account Retrieval:** ``` http://localhost:8080/opencrx-rest-CRX/org.opencrx.kernel.account1/provider/CRX/segment/Standard/account ``` 2. **Filtered and Sorted Account Retrieval:** Retrieve contacts modified between two dates, sorted by first name. ``` http://localhost:8080/opencrx-rest-CRX/org.opencrx.kernel.account1/provider/CRX/segment/Standard/account?position=0&size=50&queryType=org:opencrx:kernel:account1:Contact&query=modifiedAt().between(:datetime:20080101T000000.000Z,:datetime:20101001T000000.000Z);orderByFirstName().ascending() ``` 3. **Query with `greaterThan` condition:** ``` http://localhost:8080/opencrx-rest-CRX/org.opencrx.kernel.account1/provider/CRX/segment/Standard/account?position=0&size=50&queryType=org:opencrx:kernel:account1:Contact&query=thereExistsNumberOfChildren().greaterThan(:integer:-1);orderByFirstName().ascending() ``` 4. **Query with `lessThan` condition:** ``` http://localhost:8080/opencrx-rest-CRX/org.opencrx.kernel.account1/provider/CRX/segment/Standard/account?position=0&size=50&queryType=org:opencrx:kernel:account1:Contact&query=thereExistsNumberOfChildren().lessThan(0);orderByFirstName().ascending() ``` 5. **Query with `lessThan` condition (different value):** ``` http://localhost:8080/opencrx-rest-CRX/org.opencrx.kernel.account1/provider/CRX/segment/Standard/account?position=0&size=50&queryType=org:opencrx:kernel:account1:Contact&query=thereExistsNumberOfChildren().lessThan(3);orderByFirstName().ascending() ``` 6. **Query with `like` condition:** Find accounts where the full name matches a pattern. ``` http://localhost:8080/opencrx-rest-CRX/org.opencrx.kernel.account1/provider/CRX/segment/Standard/account?position=0&size=50&queryType=org:opencrx:kernel:account1:Contact&query=thereExistsFullName().like(%22.*Test.*%22);orderByFirstName().ascending() ``` 7. **Query with `equalTo` condition and sorting:** Find contacts with a specific first name and sort by last name. ``` http://localhost:8080/opencrx-rest-CRX/org.opencrx.kernel.account1/provider/CRX/segment/Standard/account?position=0&size=50&queryType=org:opencrx:kernel:account1:Contact&query=thereExistsFirstName().equalTo(%22Guest%22);orderByLastName().ascending() ``` 8. **Query with `equalTo` condition:** Find contacts with a specific first name. ``` http://localhost:8080/opencrx-rest-CRX/org.opencrx.kernel.account1/provider/CRX/segment/Standard/account?position=0&size=50&queryType=org:opencrx:kernel:account1:Contact&query=thereExistsFirstName().equalTo(%22Guest%22) ``` ``` -------------------------------- ### Configure Workflow Controller Auto-startup (XML) Source: https://github.com/opencrx/opencrx-documentation/blob/master/Admin/AutomatedWorkflows.md This snippet shows how to configure the Workflow Controller to start automatically when the application server starts. It involves modifying the web.xml file and setting the 'load-on-startup' parameter to control the servlet initialization order. ```xml WorkflowController org.opencrx.kernel.workflow.servlet.WorkflowControllerServlet ... 10 ``` -------------------------------- ### Connect LDAP Clients to openCRX for Directory Lookups Source: https://context7.com/opencrx/opencrx-documentation/llms.txt Provides instructions and examples for connecting LDAP clients to openCRX for address book lookups and contact searches. It outlines connection parameters and demonstrates an example search using `ldapsearch`. ```bash # LDAP connection parameters # Host: localhost (or openCRX server hostname) # Port: 1389 (default, or 1689 for SSL) # BaseDN: ou=filter/,ou=Persons # BindDN: @ # Example LDAP search using ldapsearch ldapsearch -x -H ldap://localhost:1389 \ -b "ou=filter/All Accounts,ou=Persons" \ -D "guest@Standard" \ -w "opencrx" \ "(cn=*Smith*)" # Thunderbird LDAP configuration # Name: openCRX-Standard # Hostname: localhost # Base DN: ou=filter/All Accounts,ou=Persons # Port: 1389 # Bind DN: guest@Standard ``` -------------------------------- ### Example Regex for DbCopy String Search and Replace Source: https://github.com/opencrx/opencrx-documentation/blob/master/Admin/DatabaseManagement.md This snippet demonstrates how to use regular expression patterns in the openCRX DbCopy wizard for searching and replacing string values within database tables during data migration. It shows an example of replacing 'TEST' with 'MYCOMPANY'. ```regex 'TEST' 'MYCOMPANY' ``` -------------------------------- ### Native Java Client Setup Source: https://context7.com/opencrx/opencrx-documentation/llms.txt This section describes how to create a native Java client that connects directly to the openCRX database for enhanced performance. It involves embedding the openCRX instance within your Java application. ```APIDOC ## Native Java Client Setup ### Description Create a native Java client with direct database access for maximum performance. This approach embeds openCRX in-process. ### Method N/A (Java Code Example) ### Endpoint N/A (Direct Database Access) ### Parameters N/A ### Request Example ```java // SampleNativeClient.java package org.opencrx.application.client; import javax.jdo.*; import org.opencrx.kernel.account1.jmi1.*; import org.opencrx.kernel.generic.SecurityKeys; public class SampleNativeClient { private static final String PROVIDER_NAME = "CRX"; private static final String SEGMENT_NAME = "Standard"; public static void main(String[] args) { try { // Setup openMDX lightweight container (skip in J2EE environment) org.openmdx.kernel.lightweight.naming.NonManagedInitialContextFactoryBuilder.install(); // Initialize persistence manager factory PersistenceManagerFactory pmf = JDOHelper.getPersistenceManagerFactory( "EntityManagerFactory", SampleNativeClient.class.getClassLoader() ); // Get persistence manager with admin credentials PersistenceManager pm = pmf.getPersistenceManager( SecurityKeys.ADMIN_PRINCIPAL + SecurityKeys.ID_SEPARATOR + SEGMENT_NAME, null ); // Get account segment org.opencrx.kernel.account1.jmi1.Segment accountSegment = (org.opencrx.kernel.account1.jmi1.Segment) pm.getObjectById( new org.openmdx.base.naming.Path( "xri://@openmdx*org.opencrx.kernel.account1/provider/" + PROVIDER_NAME + "/segment/" + SEGMENT_NAME ) ); // Query and display contacts ContactQuery query = (ContactQuery) pm.newQuery(Contact.class); query.orderByFullName().ascending(); for (Account account : accountSegment.getAccount(query)) { if (account instanceof Contact) { System.out.println("Found: " + ((Contact) account).getFullName()); } } pm.close(); } catch (Exception e) { e.printStackTrace(); } } } ``` ### Response N/A (Java Code Execution) ``` -------------------------------- ### Database Configuration Source: https://context7.com/opencrx/opencrx-documentation/llms.txt Configure database connections for different database management systems using `tomee.xml` resource definitions. Examples for HSQLDB, PostgreSQL, MySQL, Oracle, and SQL Server are provided. ```APIDOC ## Database Configuration Configure database connections for different database management systems. ### tomee.xml database connector configuration #### HSQLDB (default) ```xml JdbcDriver org.hsqldb.jdbcDriver JdbcUrl jdbc:hsqldb:hsql://127.0.0.1:9001/CRX UserName sa Password manager99 JtaManaged true ``` #### PostgreSQL ```xml JdbcDriver org.postgresql.Driver JdbcUrl jdbc:postgresql://localhost/CRX UserName crx Password crxpassword JtaManaged true ``` #### MySQL ```xml JdbcDriver com.mysql.jdbc.Driver JdbcUrl jdbc:mysql://localhost:3306/CRX?sessionVariables=sql_mode=ANSI UserName crx Password crxpassword JtaManaged true ``` #### Oracle ```xml JdbcDriver oracle.jdbc.driver.OracleDriver JdbcUrl jdbc:oracle:thin:@localhost:1521:XE UserName CRX Password crxpassword JtaManaged true ``` #### SQL Server ```xml JdbcDriver com.microsoft.sqlserver.jdbc.SQLServerDriver JdbcUrl jdbc:sqlserver://localhost:1433;databaseName=CRX;selectMethod=cursor UserName crx Password crxpassword JtaManaged true ``` ``` -------------------------------- ### Begin Unit of Work (REST API) Source: https://github.com/opencrx/opencrx-documentation/blob/master/Sdk/Rest.md Starts a new Unit of Work (UOW) by retrieving the persistence manager and initiating a transaction. The client must retain the transaction ID for commit and rollback operations. This operation requires the 'org.openmdx.kernel.UnitOfWork' type in the request body. ```HTTP http://localhost:8080/opencrx-rest-CRX/org:openmdx:kernel/transaction ``` ```HTTP Method POST ``` ```XML Request Body ``` ```XML Response Body ``` -------------------------------- ### Deactivate a Root Object in web.xml (XML) Source: https://github.com/opencrx/opencrx-documentation/blob/master/Admin/Miscellaneous.md This example shows how to deactivate a root object by commenting out its init-param in web.xml. After deactivation, renumber subsequent root objects to maintain consecutive numbering starting from 0. ```xml ... rootObject[6] xri:@openmdx:org.opencrx.kernel.document1/provider/CRX/segment/${SEGMENT} ... ``` -------------------------------- ### Import Mail Server Certificate (keytool) Source: https://github.com/opencrx/opencrx-documentation/blob/master/Admin/EMailServices.md Command to import the mail server's public key into the JRE's cacerts file to enable TLS/SSL connections. Replace 'mailserver.cer' with the actual certificate file. ```bash keytool -keystore cacerts -import -storepass changeit -file mailserver.cer ``` -------------------------------- ### SSL Certificate Generation and Conversion (Bash) Source: https://context7.com/opencrx/opencrx-documentation/llms.txt Demonstrates bash commands for creating SSL certificates using OpenSSL, converting them to PEM format, and notes on importing them into a Java keystore. ```bash # Create SSL certificates with OpenSSL openssl req -x509 -newkey rsa:4096 -keyout server.key -out server.crt -days 365 # Convert to PEM format openssl rsa -in server.key -out server-key.pem -outform PEM openssl x509 -in server.crt -out server-cert.pem -outform PEM # Import to Java keystore using Portecle or KeyTool IUI # SSL ports: LDAP 1689, IMAP 1443 ``` -------------------------------- ### Start Grinder TCPProxy for Debugging Source: https://github.com/opencrx/opencrx-documentation/blob/master/Sdk/Rest.md Starts the Grinder TCPProxy tool to act as a proxy between a native openCRX client and the server. This allows inspection of REST interactions, which is useful for debugging complex requests. The proxy listens on a local port and forwards traffic to the specified remote host and port. ```Shell java -cp lib/grinder.jar net.grinder.TCPProxy -console -responsefilter NONE -localhost 127.0.0.1 -localport 7180 -remotehost http://127.0.0.1 -remoteport 8080 ``` -------------------------------- ### Start Virtual Connection (REST API) Source: https://github.com/opencrx/opencrx-documentation/blob/master/Sdk/Rest.md Initiates a virtual connection to the REST servlet, enabling non auto-commit mode for Unit of Work (UOW) handling. This attaches a persistence manager to the servlet session for subsequent transaction operations. The UserName parameter must match the authenticated user. ```HTTP http://localhost:8080/opencrx-rest-CRX/org:openmdx:kernel/connection?UserName=guest ``` ```HTTP Method POST ``` ```XML Request Body ``` -------------------------------- ### Building from Source Source: https://context7.com/opencrx/opencrx-documentation/llms.txt Build openCRX from source using Gradle. This section provides commands for cloning the repository, checking out a release version, and building the project. ```APIDOC ## Building from Source Build openCRX from source using Gradle. ### Clone repository ```bash git clone https://github.com/opencrx/opencrx.git opencrx cd opencrx ``` ### Checkout release version ```bash git checkout opencrx-v6.0.0 ``` ### Build ```bash ./gradlew clean ./gradlew assemble ``` ### Generate Eclipse project files ```bash ./gradlew eclipse ``` ``` -------------------------------- ### Build openCRX Polymer Client using Ant Source: https://github.com/opencrx/opencrx-documentation/blob/master/Sdk/PolymerClient.md This command sequence builds the 'MyContact' Polymer application. It navigates to the application's directory, updates its dependencies using Bower, and then executes the Ant build script to assemble the application into a WAR file. ```bash cd ./opencrx4-custom/sample/src/war/opencrx-sample-mycontact.war bower update cd ../../.. ant assemble ``` -------------------------------- ### Example Regex for DbCopy Table Inclusion/Exclusion Source: https://github.com/opencrx/opencrx-documentation/blob/master/Admin/DatabaseManagement.md This snippet provides examples of regular expression patterns used in the openCRX DbCopy wizard for specifying which tables to include or exclude during data migration. The pattern '.*' is used to copy all tables, while specific table names can be excluded. ```regex '.*' '_OOCKE1_AUDITENTRY_' ``` -------------------------------- ### Build APK using Ant in Shell Source: https://github.com/opencrx/opencrx-documentation/blob/master/Sdk/RemoteAndroidClient.md This shell command demonstrates how to build the openCRX Android client APK using the Ant build tool. It requires navigating to the project directory and setting the ANDROID_HOME environment variable. ```bash cd ./opencrx4-custom/sample/src/apk/opencrx-sample-android ant release ``` -------------------------------- ### Query Accounts and Log Exceptions in Java Source: https://github.com/opencrx/opencrx-documentation/blob/master/Sdk/RemoteAndroidClient.md This Java code snippet demonstrates how to query accounts from an openCRX server using a PersistenceManager. It includes logic to create a segment if it doesn't exist and handles potential exceptions during the process. It also defines a helper method for logging exceptions with detailed stack traces. ```java .getPersistenceManagerFactory(entityManagerConfiguration); final PersistenceManager pm = pmf.getPersistenceManager(login, password); PersistenceHelper.currentUnitOfWork(pm).begin(); org.opencrx.sample.client1.jmi1.Segment segment; try { segment = (org.opencrx.sample.client1.jmi1.Segment) pm .getObjectById(new Path("xri://@openmdx*org.opencrx.sample.client1/provider/CRX/segment/Standard")); } catch (Exception e) { final Provider provider = (Provider) pm .getObjectById(new Path("xri://@openmdx*org.opencrx.sample.client1/provider/CRX")); segment = pm.newInstance(org.opencrx.sample.client1.jmi1.Segment.class); provider.addSegment("Standard", segment); Log.i(TAG, "Segment created"); } final List> members = new ArrayList>(); if (this.queryName != null) { members.add(Datatypes.member(QueryAccountParams.Member.name, this.queryName)); } if (this.queryCity != null) { members.add(Datatypes.member(QueryAccountParams.Member.postalCity, this.queryCity)); } final QueryAccountParams params = Structures.create(QueryAccountParams.class, members); final QueryAccountResult result = segment.queryAccounts(params); PersistenceHelper.currentUnitOfWork(pm).commit(); List accounts = result.getAccounts(); for (AccountT account : accounts) { accountItems.add(new AccountItem(account.getFullName(), account.getPostalCity())); } pm.close(); } catch (Throwable e) { log(TAG, e); } Log.d(TAG, "found " + accountItems.size() + " accounts"); return accountItems; } public static void log( String tag, Throwable e) { Log.e(TAG, "Exception " + (e.getMessage() != null ? e.getMessage() : "NULL"), e); final CharArrayWriter w = new CharArrayWriter(); PrintWriter pw = new PrintWriter(w); e.printStackTrace(pw); final String msg = w.toString(); final int length = msg.length(); for (int i = 0; i < length; i += 1024) { if (i + 1024 < length) Log.w(tag, msg.substring(i, i + 1024)); else Log.w(tag, msg.substring(i, length)); } } public static final class AccountItem { protected AccountItem( String fullName, String city) { super(); this.fullName = fullName; this.city = city; } private final String fullName; private final String city; @Override public String toString() { if (city != null) { return fullName + ", " + city; } else { return fullName; } } public String getFullName() { return fullName; } public String getCity() { return city; } } } ``` -------------------------------- ### Configure Nullmailer Remote Relay Source: https://github.com/opencrx/opencrx-documentation/blob/master/Admin/EMailServices.md Example configuration for nullmailer to use a smart MTA as a relay. This involves editing the /etc/nullmailer/remotes file with your mail server details, port, and authentication credentials. ```bash smtp.domain.org smtp --port=25 --starttls --insecure --user=... --pass=... ``` -------------------------------- ### User Management - Bulk Import Formats Source: https://context7.com/opencrx/opencrx-documentation/llms.txt Defines the file formats for importing subjects, principals, and users in bulk. It specifies the required fields and their order for each entity type, along with example data. ```bash # File format for Subjects and Principals (import as admin-Root) # Subject;; # Principal;;;; # Example: subjects-principals.txt Subject;joe;Doe, Joe Subject;mark;Ferguson, Mark Subject;peter;Lagerfeld, Peter Principal;joe;Doe, Joe;joe;Users,Administrators Principal;mark;Ferguson, Mark;mark;Users Principal;peter;Lagerfeld, Peter;peter;Users # File format for Users (import as admin-Standard) # User;;;;;[;[;[;]]] # Example: users.txt User;joe;JD;Doe, Joe;Users;secretPass123;MGMT,SALES;joe@company.com;America/New_York User;mark;Fergi;Ferguson, Mark;-;markPass456;MGMT;mark@company.com;Europe/London User;peter;-;Lagerfeld, Peter;-;peterPass789;SALES;peter@company.com;Europe/Zurich # Note: "-" means use default value (e.g., primary group defaults to .Group) ``` -------------------------------- ### Compile SampleRemoteClient.java using Java Source: https://github.com/opencrx/opencrx-documentation/blob/master/Sdk/RemoteJavaClient.md This command compiles the SampleRemoteClient.java file. It specifies the output directory for compiled classes (-d bin) and sets the classpath to include the 'bin' directory and all JAR files in the 'lib' directory. This is necessary to resolve dependencies for compilation. ```bash javac -d bin -cp "bin:lib/*" src/main/java/org/opencrx/kernel/client/SampleRemoteClient.java ``` -------------------------------- ### LDAP Directory Integration Source: https://context7.com/opencrx/opencrx-documentation/llms.txt Connect LDAP clients to openCRX for address book lookups and contact searches. This section outlines connection parameters and provides an example using `ldapsearch` and Thunderbird configuration. ```APIDOC ## LDAP Directory Integration Connect LDAP clients to openCRX for address book lookups and contact searches. ### LDAP connection parameters - **Host**: localhost (or openCRX server hostname) - **Port**: 1389 (default, or 1689 for SSL) - **BaseDN**: ou=filter/,ou=Persons - **BindDN**: @ ### Example LDAP search using ldapsearch ```bash ldapsearch -x -H ldap://localhost:1389 \ -b "ou=filter/All Accounts,ou=Persons" \ -D "guest@Standard" \ -w "opencrx" \ "(cn=*Smith*)" ``` ### Thunderbird LDAP configuration - **Name**: openCRX-Standard - **Hostname**: localhost - **Base DN**: ou=filter/All Accounts,ou=Persons - **Port**: 1389 - **Bind DN**: guest@Standard ``` -------------------------------- ### Configure Database Connector for Apache TomEE Source: https://github.com/opencrx/opencrx-documentation/blob/master/Admin/DatabaseManagement.md This snippet shows how to configure the database connector in the `tomee.xml` file for Apache TomEE. It includes examples for HSQLDB, PostgreSQL, MySQL, DB/2, Oracle, and SQL Server. Ensure the JdbcDriver and JdbcUrl are set according to your database. ```xml JdbcDriver org.hsqldb.jdbcDriver JdbcUrl jdbc:hsqldb:hsql://127.0.0.1:9001/CRX UserName sa Password manager99 JtaManaged true ``` ```xml JdbcDriver org.postgresql.Driver JdbcUrl jdbc:postgresql://localhost/CRX ``` ```xml JdbcDriver com.mysql.jdbc.Driver JdbcUrl jdbc:mysql://localhost:3306/CRX?sessionVariables=sql_mode=ANSI ``` ```xml JdbcDriver com.ibm.db2.jcc.DB2Driver JdbcUrl jdbc:db2://localhost:50000/CRX ``` ```xml JdbcDriver oracle.jdbc.driver.OracleDriver JdbcUrl jdbc:oracle:thin:@localhost:1521:XE UserName CRX ``` ```xml JdbcDriver com.microsoft.sqlserver.jdbc.SQLServerDriver JdbcUrl jdbc:sqlserver://localhost:1433;databaseName=CRX;selectMethod=cursor ``` -------------------------------- ### POST /opencrx-rest-CRX/org:openmdx:kernel/connection Source: https://github.com/opencrx/opencrx-documentation/blob/master/Sdk/Rest.md Starts a virtual connection to the REST servlet, putting it in non-auto-commit mode and attaching a persistence manager for subsequent UOW operations. The UserName parameter must match the authenticated user. ```APIDOC ## POST /opencrx-rest-CRX/org:openmdx:kernel/connection ### Description Starts a virtual connection to the REST servlet, enabling non-auto-commit mode and associating a persistence manager with the servlet session for Unit of Work (UOW) management. This is a prerequisite for manual UOW control. ### Method POST ### Endpoint `http://localhost:8080/opencrx-rest-CRX/org:openmdx:kernel/connection?UserName=` ### Parameters #### Query Parameters - **UserName** (string) - Optional - The name of the authenticated user. Required in versions prior to openCRX 2.9.1+. #### Request Body - **org.openmdx.base.Void** - N/A - An empty XML element representing the void type. ### Request Example ```xml ``` ### Response #### Success Response (200) (No specific response body is documented for this operation, indicating success by the absence of errors.) #### Response Example ```xml ``` ``` -------------------------------- ### Configure IMAPServlet init-param for SSL in web.xml Source: https://github.com/opencrx/opencrx-documentation/blob/master/Admin/GroupwareServices.md Configures the IMAPServlet within the web.xml file to enable SSL support by specifying the keystore file, type, and passwords. These parameters are crucial for the server to establish secure IMAP connections. ```xml sslKeystoreFile /var/ssl/keystore.jks sslKeystoreType JKS sslKeystorePass changeit sslKeyPass changeit ``` -------------------------------- ### IMAP Email Integration Source: https://context7.com/opencrx/opencrx-documentation/llms.txt Access openCRX email activities through standard IMAP clients. Activity groups map to IMAP folders. This section provides connection parameters and an example configuration for mail clients. ```APIDOC ## IMAP Email Integration Access openCRX email activities through standard IMAP clients. Activity groups map to IMAP folders. ### IMAP connection parameters - **Host**: localhost (or openCRX server hostname) - **Port**: 1143 (default, or 1443 for SSL) - **Username**: @ - **Password**: openCRX password ### Example configuration for mail client: - **Server**: localhost - **Port**: 1143 - **Username**: guest@Standard - **Password**: opencrx - **Security**: None (or SSL on port 1443) ### SQL to check for duplicate email addresses (run against openCRX database) ```sql SELECT email_address, count(*) FROM OOCKE1_ADDRESS GROUP BY email_address HAVING count(*) > 1 ``` ```