verifyMailServer(protocol, host[, port], user, password[, useSSL][, useTLS][, enforceTLS][, timeout][, debug][, logPath][, append])
Last updated July 01, 2010
Version: 1 | Requires: CF6 | Library: NetLib
Description:
Verifies an SMTP, POP3 or IMAP mail server connection using the supplied credentials.
Return Values:
Returns a struct.
Example:
<cfset response = verifyMailServer( host = "pop.gmail.com",
protocol = "pop3",
port = 995,
user = "user@gmail.com",
password = "the password",
useSSL = false
) />
<cfdump var="#response#" label="Verfication Results">
Parameters:
Name | Description | Required |
---|---|---|
protocol | Mail protocol: SMTP, POP3 or IMAP | Yes |
host | Mail server name (Example: pop.gmail.com) | Yes |
port | Mail server port number. Default is -1, meaning use the default port for this protocol) | No |
user | Mail account username | Yes |
password | Mail account password | Yes |
useSSL | If true, use SSL (Secure Sockets Layer). Default is false. | No |
useTLS | If true, use TLS (Transport Level Security). Default to false. | No |
enforceTLS | If true, require TLS support, Default is false. | No |
timeout | Maximum milliseconds to wait for connection. Default is 0 (wait forever) | No |
debug | If true, enable debugging. By default information is sent to is sent to System.out. Default is false. | No |
logPath | Send debugging output to this file. Absolute file path. Has no effect if debugging is disabled. | No |
append | If false, the existing log file will be overwritten. Default is true. | No |
Full UDF Source:
<!---
Verifies a mail server connection.
@param protocol Mail protocol: SMTP, POP3 or IMAP (Required)
@param host Mail server name (Example: pop.gmail.com) (Required)
@param port Mail server port number. Default is -1, meaning use the default port for this protocol) (Optional)
@param user Mail account username (Required)
@param password Mail account password (Required)
@param useSSL If true, use SSL (Secure Sockets Layer). Default is false. (Optional)
@param useTLS If true, use TLS (Transport Level Security). Default to false. (Optional)
@param enforceTLS If true, require TLS support, Default is false. (Optional)
@param timeout Maximum milliseconds to wait for connection. Default is 0 (wait forever) (Optional)
@param debug If true, enable debugging. By default information is sent to is sent to System.out. Default is false. (Optional)
@param logPath Send debugging output to this file. Absolute file path. Has no effect if debugging is disabled. (Optional)
@param append If false, the existing log file will be overwritten. Default is true. (Optional)
@return Returns a struct.
@author Leigh (cfsearching@gmail.com)
@version 1, July 1, 2010
--->
<cffunction name="verifyMailServer" returntype="struct" access="public" output="true">
<cfargument name="protocol" type="string" required="true" hint="Mail protocol: SMTP, POP3 or IMAP" />
<cfargument name="host" type="string" required="true" hint="Mail server name (Example: pop.gmail.com)"/>
<cfargument name="port" type="numeric" default="-1" hint="Mail server port number. Default is -1, meaning use the default port for this protocol)" />
<cfargument name="user" type="string" required="true" hint="Mail account username" />
<cfargument name="password" type="string" required="true" hint="Mail account password" />
<cfargument name="useSSL" type="boolean" default="false" hint="If true, use SSL (Secure Sockets Layer)" >
<cfargument name="useTLS" type="boolean" default="false" hint="If true, use TLS (Transport Level Security)" >
<cfargument name="enforceTLS" type="boolean" default="false" hint="If true, require TLS support" >
<cfargument name="timeout" type="numeric" default="0" hint="Maximum milliseconds to wait for connection. Default is 0 (wait forever)" />
<cfargument name="debug" type="boolean" default="false" hint="If true, enable debugging. By default information is sent to is sent to System.out." >
<cfargument name="logPath" type="string" default="" hint="Send debugging output to this file. Absolute file path. Has no effect if debugging is disabled." >
<cfargument name="append" type="boolean" default="true" hint="If false, the existing log file will be overwritten" >
<cfset var status = structNew() />
<cfset var props = "" />
<cfset var mailSession = "" />
<cfset var store = "" />
<cfset var transport = "" />
<cfset var logFile = "" />
<cfset var fos = "" />
<cfset var ps = "" />
<!--- validate protocol --->
<cfset arguments.protocol = lcase( trim(arguments.protocol) ) />
<cfif not listFindNocase("pop3,smtp,imap", arguments.protocol)>
<cfthrow type="IllegalArgument" message="Invalid protocol. Allowed values: POP3, IMAP and SMTP" />
</cfif>
<cfscript>
// initialize status messages
status.wasVerified = false;
status.errorType = "";
status.errorDetail = "";
try {
props = createObject("java", "java.util.Properties").init();
// enable security settings
if (arguments.useSSL or arguments.useTLS) {
// use the secure protocol
// this will set the property mail.{protocol}.ssl.enable = true
if (arguments.useSSL) {
arguments.protocol = arguments.protocol &"s";
}
// enable identity check (recommended)
props.put("mail."& protocol &".ssl.checkserveridentity", "true");
// enable transport level security and make it mandatory
// so the connection fails if TLS is not supported
if (arguments.useTLS) {
props.put("mail."& protocol &".starttls.required", "true");
props.put("mail."& protocol &".starttls.enable", "true");
}
}
// force authentication command
props.put("mail."& protocol &".auth", "true");
// for simple verifications, apply timeout to both socket connection and I/O
if (structKeyExists(arguments, "timeout")) {
props.put("mail."& protocol &".connectiontimeout", arguments.timeout);
props.put("mail."& protocol &".timeout", arguments.timeout);
}
// create a new mail session
mailSession = createObject("java", "javax.mail.Session").getInstance( props );
// enable debugging
if (arguments.debug) {
mailSession.setDebug( true );
// redirect the output to the given log file
if ( len(trim(arguments.logPath)) ) {
logFile = createObject("java", "java.io.File").init( arguments.logPath );
fos = createObject("java", "java.io.FileOutputStream").init( logFile, arguments.overwrite );
ps = createObject("java", "java.io.PrintStream").init( fos );
mailSession.setDebugOut( ps );
}
}
// Connect to an SMTP server ...
if ( left(arguments.protocol, 4) eq "smtp") {
transport = mailSession.getTransport( protocol );
transport.connect(arguments.host, arguments.port, arguments.user, arguments.password);
transport.close();
// if we reached here, the credentials should be verified
status.wasVerified = true;
}
// Otherwise, it is a POP3 or IMAP server
else {
store = mailSession.getStore( protocol );
store.connect(arguments.host, arguments.port, arguments.user, arguments.password);
store.close();
// if we reached here, the credentials should be verified
status.wasVerified = true;
}
}
//for authentication failures
catch(javax.mail.AuthenticationFailedException e) {
status.errorType = "Authentication";
status.errorDetail = e;
}
// some other failure occurred like a javax.mail.MessagingException
catch(Any e) {
status.errorType = "Other";
status.errorDetail = e;
}
// always close the stream ( messy work-around for lack of finally clause prior to CF9...)
if ( not IsSimpleValue(ps) ) {
ps.close();
}
return status;
</cfscript>
</cffunction>
Search CFLib.org
Latest Additions
Raymond Camden added
QueryDeleteRows
November 04, 2017
Leigh added
nullPad
May 11, 2016
Raymond Camden added
stripHTML
May 10, 2016
Kevin Cotton added
date2ExcelDate
May 05, 2016
Raymond Camden added
CapFirst
April 25, 2016