After much fidgeting with this, I gave up on CFFTP. I don't think I was doing anything wrong, the code was right, the credentials were OK, nothing was blocking access to the FTP account through the firewall.
Instead, I found a Java library at edtftpj which worked fine. It's LGPL open source and its API is pretty easy to figure out.
So, I first downloaded the JAR file form their website, put it in the [ColdFusion Install Folder]/bin folder, restarted CF, and then used this code:
<!--- page variables --->
<cfparam name="VARIABLES.ftp" type="any" default="" />
<cfparam name="VARIABLES.aFiles" type="array" default="#arrayNew(1)#" />
<cfparam name="VARIABLES.index" type="numeric" default="1" />
<cfparam name="VARIABLES.cLocalFolder" type="string" default="#expandPath('/integrations/buy/txt/queue/')#" />
<cfparam name="VARIABLES.cLocalFile" type="string" default="" />
<cfparam name="VARIABLES.cFileName" type="string" default="" />
<!--- create instance of edtftpj.jar custom FTP --->
<cfset VARIABLES.ftp = createObject( "java", "com.enterprisedt.net.ftp.FileTransferClient" ) />
<!--- connect with custom java object and get the contents of the 'Orders' folder --->
<cfset VARIABLES.ftp.setRemoteHost( "trade.marketplace.buy.com" ) />
<cfset VARIABLES.ftp.setUserName( "*************" ) />
<cfset VARIABLES.ftp.setPassword( "*************" ) />
<cfset VARIABLES.ftp.connect() />
<cfset VARIABLES.ftp.changeDirectory('/Orders') />
<cfset VARIABLES.aFiles = ftp.directoryList(".") />
<!--- Proceed only if folder has contents --->
<cfif arrayLen(VARIABLES.aFiles)>
<!--- Loop through ftp directory contents (files and folders) --->
<cfloop from="1" to="#arrayLen(VARIABLES.aFiles)#" step="1" index="VARIABLES.index">
<!--- Download only files and not folders --->
<cfif VARIABLES.aFiles[VARIABLES.index].isFile()>
<!--- Set the local file name and download to it --->
<cfset VARIABLES.cFileName = aFiles[VARIABLES.index].getName() />
<cfset VARIABLES.cLocalFile = VARIABLES.cLocalFolder & VARIABLES.cFileName />
<cfset VARIABLES.ftp.downloadFile( VARIABLES.cLocalFile, VARIABLES.cFileName ) />
</cfif>
</cfloop>
</cfif>
<!--- Disconnect --->
<cfset VARIABLES.ftp.disconnect() />
I should write a blog post about this :)