/** * Copyright (c)2005-2007 Matt Kruse (javascripttoolbox.com) * * Dual licensed under the MIT and GPL licenses. * This basically means you can use this code however you want for * free, but don\\\'t claim to have written it yourself! * Donations always accepted: http://www.JavascriptToolbox.com/donate/ * * Please do not link to the .js files on javascripttoolbox.com from * your site. Copy the files locally to your server instead. * */ // Global objects to keep track of DynamicOptionList objects created on the page var dynamicOptionListCount=0; var dynamicOptionListObjects = new Array();
// Init call to setup lists after page load. One call to this function sets up all lists. function initDynamicOptionLists() { // init each DynamicOptionList object for (var i=0; i
// Find the form associated with this list if (dol.formName!=null) { dol.form = document.forms[dol.formName]; } else if (dol.formIndex!=null) { dol.form = document.forms[dol.formIndex]; } else { // Form wasn\\\'t set manually, so go find it! // Search for the first form element name in the lists var name = dol.fieldNames[0][0]; for (var f=0; f
// Form is found, now set the onchange attributes of each dependent select box for (var j=0; j
// This function populates lists with the preselected values. // It\\\'s pulled out into a separate function so it can be hooked into a \\\'reset\\\' button on a form // Optionally passed a form object which should be the only form reset function resetDynamicOptionLists(theform) { // reset each DynamicOptionList object for (var i=0; i
// An object to represent an Option() but just for data-holding function DOLOption(text,value,defaultSelected,selected) { this.text = text; this.value = value; this.defaultSelected = defaultSelected; this.selected = selected; this.options = new Array(); // To hold sub-options return this; }
// DynamicOptionList CONSTRUCTOR function DynamicOptionList() { this.form = null;// The form this list belongs to this.options = new Array();// Holds the options of dependent lists this.longestString = new Array();// Longest string that is currently a potential option (for Netscape) this.numberOfOptions = new Array();// The total number of options that might be displayed, to build dummy options (for Netscape) this.currentNode = null;// The current node that has been selected with forValue() or forText() this.currentField = null;// The current field that is selected to be used for setValue() this.currentNodeDepth = 0;// How far down the tree the currentNode is this.fieldNames = new Array();// Lists of dependent fields which use this object this.formIndex = null;// The index of the form to associate with this list this.formName = null;// The name of the form to associate with this list this.fieldListIndexes = new Object();// Hold the field lists index where fields exist this.fieldIndexes = new Object();// Hold the index within the list where fields exist this.selectFirstOption = true;// Whether or not to select the first option by default if no options are default or preselected, otherwise set the selectedIndex = -1 this.numberOfOptions = new Array();// Store the max number of options for a given option list this.longestString = new Array();// Store the longest possible string this.values = new Object(); // Will hold the preselected values for fields, by field name
// Optionally pass in the dependent field names if (arguments.length > 0) { // Process arguments and add dependency groups for (var i=0; i this.fieldListIndexes[arguments[i].toString()] = this.fieldNames.length; this.fieldIndexes[arguments[i].toString()] = i; } this.fieldNames[this.fieldNames.length] = arguments; }
// Add this object to the global array of dynamicoptionlist objects this.index = window.dynamicOptionListCount++; window["dynamicOptionListObjects"][this.index] = this; }
// Given an array of Option objects, search for an existing option that matches value, text, or both function DOL_findMatchingOptionInArray(a,text,value,exactMatchRequired) { if (a==null || typeof(a)=="undefined") { return null; } var value_match = null; // Whether or not a value has been matched var text_match = null; // Whether or not a text has been matched for (var i=0; i var opt = a[i]; // If both value and text match, return it right away if (opt.value==value && opt.text==text) { return opt; } if (!exactMatchRequired) { // If value matches, store it until we complete scanning the list if (value_match==null && value!=null && opt.value==value) { value_match = opt; } // If text matches, store it for later if (text_match==null && text!=null && opt.text==text) { text_match = opt; } } } return (value_match!=null)?value_match:text_match; }
// Util function used by forValue and forText function DOL_forX(s,type) { if (this.currentNode==null) { this.currentNodeDepth=0; } var useNode = (this.currentNode==null)?this:this.currentNode; var o = this.findMatchingOptionInArray(useNode["options"],(type=="text")?s:null,(type=="value")?s:null,false); if (o==null) { o = new DOLOption(null,null,false,false); o[type] = s; useNode.options[useNode.options.length] = o; } this.currentNode = o; this.currentNodeDepth++; return this; }
// Set the portion of the list structure that is to be used by a later operation like addOptions function DOL_forValue(s) { return this.forX(s,"value"); }
// Set the portion of the list structure that is to be used by a later operation like addOptions function DOL_forText(s) { return this.forX(s,"text"); }
// Set the field to be used for setValue() calls function DOL_forField(f) { this.currentField = f; return this; }
// Create and add an option to a list, avoiding duplicates function DOL_addNewOptionToList(a, text, value, defaultSelected) { var o = new DOLOption(text,value,defaultSelected,false); // Add the option to the array if (a==null) { a = new Array(); } for (var i=0; i if (a[i].text==o.text && a[i].value==o.value) { if (o.selected) { a[i].selected=true; } if (o.defaultSelected) { a[i].defaultSelected = true; } return a; } } a[a.length] = o; }
// Add sub-options to the currently-selected node, with the same text and value for each option function DOL_addOptions() { if (this.currentNode==null) { this.currentNode = this; } if (this.currentNode["options"] == null) { this.currentNode["options"] = new Array(); } for (var i=0; i var text = arguments[i]; this.addNewOptionToList(this.currentNode.options,text,text,false); if (typeof(this.numberOfOptions[this.currentNodeDepth])=="undefined") { this.numberOfOptions[this.currentNodeDepth]=0; } if (this.currentNode.options.length > this.numberOfOptions[this.currentNodeDepth]) { this.numberOfOptions[this.currentNodeDepth] = this.currentNode.options.length; } if (typeof(this.longestString[this.currentNodeDepth])=="undefined" || (text.length > this.longestString[this.currentNodeDepth].length)) { this.longestString[this.currentNodeDepth] = text; } } this.currentNode = null; this.currentNodeDepth = 0; }
// Add sub-options to the currently-selected node, specifying separate text and values for each option function DOL_addOptionsTextValue() { if (this.currentNode==null) { this.currentNode = this; } if (this.currentNode["options"] == null) { this.currentNode["options"] = new Array(); } for (var i=0; i var text = arguments[i++]; var value = arguments[i]; this.addNewOptionToList(this.currentNode.options,text,value,false); if (typeof(this.numberOfOptions[this.currentNodeDepth])=="undefined") { this.numberOfOptions[this.currentNodeDepth]=0; } if (this.currentNode.options.length > this.numberOfOptions[this.currentNodeDepth]) { this.numberOfOptions[this.currentNodeDepth] = this.currentNode.options.length; } if (typeof(this.longestString[this.currentNodeDepth])=="undefined" || (text.length > this.longestString[this.currentNodeDepth].length)) { this.longestString[this.currentNodeDepth] = text; } } this.currentNode = null; this.currentNodeDepth = 0; }
// Find the first dependent list of a select box // If it\\\'s the last list in a chain, return null because there are no children function DOL_child(obj) { var listIndex = this.fieldListIndexes[obj.name]; var index = this.fieldIndexes[obj.name]; if (index < (this.fieldNames[listIndex].length-1)) { return this.form[this.fieldNames[listIndex][index+1]]; } return null; }
// Set the options which should be selected by default for a certain value in the parent function DOL_setDefaultOptions() { if (this.currentNode==null) { this.currentNode = this; } for (var i=0; i var o = this.findMatchingOptionInArray(this.currentNode.options,null,arguments[i],false); if (o!=null) { o.defaultSelected = true; } } this.currentNode = null; }
// Set the options which should be selected when the page loads. This is different than the default value and ONLY applies when the page LOADS function DOL_setValues() { if (this.currentField==null) { alert("Can\\\'t call setValues() without using forField() first!"); return; } if (typeof(this.values[this.currentField])=="undefined") { this.values[this.currentField] = new Object(); } for (var i=0; i this.values[this.currentField][arguments[i]] = true; } this.currentField = null; }
// Manually set the form for the object using an index function DOL_setFormIndex(i) { this.formIndex = i; }
// Manually set the form for the object using a form name function DOL_setFormName(n) { this.formName = n; }
// Print blank
"; } } ret += "
// Add a list of field names which use this option-mapping object. // A single mapping object may be used by multiple sets of fields function DOL_addDependentFields() { for (var i=0; i this.fieldListIndexes[arguments[i].toString()] = this.fieldNames.length; this.fieldIndexes[arguments[i].toString()] = i; } this.fieldNames[this.fieldNames.length] = arguments; }
// Called when a parent select box is changed. It populates its direct child, then calls change on the child object to continue the population. function DOL_change(obj, usePreselected) { if (usePreselected==null || typeof(usePreselected)=="undefined") { usePreselected = false; } var changedListIndex = this.fieldListIndexes[obj.name]; var changedIndex = this.fieldIndexes[obj.name]; var child = this.child(obj); if (child == null) { return; } // No child, no need to continue if (obj.type == "select-one") { // Treat single-select differently so we don\\\'t have to scan the entire select list, which could potentially speed things up if (child.options!=null) { child.options.length=0; // Erase all the options from the child so we can re-populate } if (obj.options!=null && obj.options.length>0 && obj.selectedIndex>=0) { var o = obj.options[obj.selectedIndex]; this.populateChild(o.DOLOption,child,usePreselected); this.selectChildOptions(child,usePreselected); } } else if (obj.type == "select-multiple") { // For each selected value in the parent, find the options to fill in for this list // Loop through the child list and keep track of options that are currently selected var currentlySelectedOptions = new Array(); if (!usePreselected) { for (var i=0; i
// Once a child select is populated, go back over it to select options which should be selected function DOL_selectChildOptions(obj,usePreselected) { // Look to see if any options are preselected=true. If so, then set then selected if usePreselected=true, otherwise set defaults var values = this.values[obj.name]; var preselectedExists = false; if (usePreselected && values!=null && typeof(values)!="undefined") { for (var i=0; i0) { obj.options[0].selected = true; } else if (!atLeastOneSelected && obj.type=="select-one") { obj.selectedIndex = -1; } }
window.onLoad="initDynamicOptionLists();"
Thank you for considering MPP. We want your trial to be successful so please do not hesitate to contact us with any questions. Remote installation and guided tours of MPP are available.
Trials will mark messages bodies and headers with “scanned by” messages. Please send an email to info@messagepartners.com for a full
trial key that will remove trial markings.Plug-In Support
Fully Integrated Modules, Requires No Additional Installation
Cloudmark (Linux, FreeBSD and Solaris) – Integrated
MailShell (All) – Integrated
Sophos (All) – Integrated
ClamAV
Request Installation Kits from MP
Commtouch Antispam
Kaspersky
Install Kit From Vendors
F-PROT – FPAV for MailServers
Nod32 – NOD32 for Linux MailServers
McAffee – UVScan
Open Source Plug-Ins
SpamAssassin – Installed standard on most OS’s, spamd required
ClamAV – Clamd optional, integrated libclamav support
MPP Manager provides web access to configure and monitor the MPP system as well as access to email archives and spam quarantines. MPP Manager is ideal for service providers because it is multi-doman and has multiple levels of administrators including domain admins, global admins, quarantine/archive admins and user admins.
MPP Manager has three components – MPP Server, an embedded web server, QReview for spam quarantine and email archive access and MPP GUI to configure and monitor MPP.
MPP Core is a smart, high-performance email processing system. At the heart of MPP Core is our flexible policy engine that allows configuration policy to be applied based on sender, recipient, IP or any content within an email.
MPP core can be enhanced with commercial and open source for plug-in modules for spam and virus scanning. Since all configuration options are stored within MPP Core plug-ins can be seamlessly interchanged and layered.
Mailspect Defense offers commercial spam filters and antivirus engines directly from within the Mailspect administration GUI. Pick one or a string of plug-ins to achieve the highest levels of email security.
Cloudmark Antispam Plug-In. Based on Cloudmark Authority, this plug-in is characterized by very high throughput, high accuracy and low false positives. A great all around spam scanner and our most popular.
MDNAAntispam Plug-In. MDNA, excels at image spam and provides a fast response to new attacks. It has great performance and high detection rates.
Mailshell Antispam Plug-In. Mailshell has the widest platform support, including Mac OS X, and has very good detection capabilities. Lots of tuning options make Mailshell great for those who like to tinker. This is the only commercial spam plug-in that supports Mac OS.
SpamAssassin Antispam Plug-In. This Open Source spam engine comes standard with Mailspect Defense, because it is free andoffers reasonable accuracy and throughput. A good starting point.
Antivirus Plug-Ins
Sophos Antivirus Plug-In. The fastest, most complete platform support, great detection and fast updates. Mailspect Defense uses the SAVI library.
F-PROT Antivirus Plug-In. Our affiliate, Rae Internet Inc., is the exclusive distributor of F-Prot in the United States. F-Prot is the price leader for commercial virus scan plug-ins. Wide platform support, world-class performance and fast updates. Mailspect uses F-PROTD.
Kaspersky Antivirus Plug-In. Real fast, legendary engine. We use the API, not the command line scanner.
McAfee UV Scan. The Mailspect Defense interface uses the command line scanner, but it has daemon-like interface to it. This interface makes it far more efficient than other interfaces to the command line scanner. You must have your own licensed copy, we don’t resell this one.
ClamD. Comes standard with Mailspect Defense, because it is free and accurate.
What do you mean by email utility?
MPP is truly a software appliance and as such can be used for a wide range of applications independent of spam filtering or email archival.
What are some examples?
Disclaimers, attachment stripping, attachment blocking, content based routing, content filtering, surveillance, message tracking, content based email routing and more.
What type of attachment controls does MPP have?
MPP can strip attachments that meet your criteria and store them in a file system. Attachments are replaced with links within the emails that can be retrieved from your web or FTP server.
How does the MPP policy engine play into these applications?
The policy engine enables policies to be applied to emails based on address, domain, direction, IP or content.
How does MPP content filtering work?
MPP has its own content filter engine that will find content in email headers or message bodies. MPP can make routing decisions, quarantine, block or forward email based on content matches. MPP supports many types of expressions, international charater and advanced features like per-expression actions. For example, one expression can cause email to be rejected while another causes email to be forwarded to someone for review.
Tell me about MPP’s email surveillance capability
MPP can silently forward email to remote addresses for review or storage. Since email is delivered normally there is no trace of MPP’s forwarding. This capability is ideal to monitor employees, students, sales teams or just keep a handle on your business communications.
Are MPP disclaimers multi-lingual?
Yes, MPP disclaimers understand character set and also message format so that messages are never wrecked by disclaimers.
How is MPP licensed?
MPP is licensed per-user when deployed on your email server. When MPP is deployed on your SMTP gateway and it is not possible to count or estimate the number of users you support we base our prices on message rates.
Why don’t you list your prices on the web?
We only list our upgrade price from MPP Community to MPP Core. The email security and compliance space is hyper-competitive and we are inline with the industry.
How do I get a price quote for MPP?
Please send us an email or contact a local partner or call us.
China
Cemtek Computer Solutions
1602, Yu Feng World Bldg.,
No. 777 West Yan’an Road,
Shanghai, 200050, China
Tel:+86(21)52380606
Fax:+86(21)52381065
Contact Name: Peter Tokei www.cemtek.com
Today we are pleased to announce the release of MPP Manager. MPP Manager is an integrate package with MPP Server, our web platform, MPP GUI, our GUI manager and qReview the manager of spam quarantines and email archives. While this culminates nearly a year of development it is also the first step towards making MPP easier to use, install and manage. It represents a big commitment to GUI controls and the first fruits of this focus. Look for many more refinements and enhancements in our GUI controls this year!
Thanks to all of you who helped so much in this effort!
How does MPP archive email?
MPP will archive email directly from your email server or SMTP gateway, as a journaling agent for MS Exchange, always_bcc with Postfix and other methods.
Can MPP import email from IMAP messages stores?
Yes. MPP can import email from IMAP message stores and can export email back to the message store.
Can MPP import email from file archives?
Yes. Some email servers will store email for archive in a directory and MPP can import email saved in MIME format or mbox format. MPP will strip off envelope information as well.
Can MPP archive MS Exchange Email?
Yes, MPP can accept journaled email from MS Exchange 2000, 2003 and 2007.
Does MPP support full text searching of email?
Yes, MPP can search message contents and headers and the contents of some attachments.
How does MPP store email, are multiple copies of the same email stored?
MPP stores email in a database system and does not duplicate storage of email. MPP can alternately store email as files.
Can I delete from MPP email archives?
The administrator can decide if deletion is allowed. MPP supports no deletion, manual delete or automatic purging of email older than x days.
Does MPP support retention policies?
MPP will support global retention policies.
How do users authenticate to check their email archives?
MPP will authenticate against IMAP, POP or LDAP directories.