It seems that a problem has existed with the CFPOP delete action for a number of versions and it has not been fixed. The problem occurs when trying to delete a single email (or a list of emails) from the mail server where the mail server has included a comma in the UID. eg “1382396111.12731.mydomain.net,S=965”
The CF docs for the CFPOP Delete action says: “UID or a comma-separated list of UIDs to get or delete. Invalid UIDs are ignored.”
So, the abovementioned UID gets split into 2 uids (notice that it has a comma in it) and of course the email is not located so cant be deleted. CFPOP does not include a DELIMITERS parameter to use with the UID paramater which would solve the problem, I think. eg
<cfset myUIDlist = "1382051456.15221.mydomain.net,S=965|1382051456.18000.mydomain.net,S=966" /> <cfpop server = "********" username = "********" password = "******** action = "Delete" uid="#myUIDlist#" delimiter="|" >
Fortunately, there is a solution – use POP CFC instead of CFPOP! Thanks to Paul Vernon.
So, here is a sample page to demonstrate a way to use POP CFC.
<cfscript> /** * Example of reading, processing then deleting individual emails from the pop mail server * using the POP CFC custom component. * http://popcfc.riaforge.org/ */ // To make it easier to rescope this example (local, variables ... whatever) variables.s = {}; // Initialise the custom POP CFC component. Used instead of CFPOP // Set your values here s.popAccount = createObject("component", "pop").init(myPopServerHostname, myUsername, myPassword) // Specify a non-comma separator for the UID lists. // You must do this in order for the list functionality // of POP CFC to work (including deletions) s.mySeparator = "|"; s.popAccount.setProperty("separator",s.mySeparator); // Get an array of the UIDs of the messages in the mail account. // ie retrieve them from the mail server // This is a necessary step to solve the comma-in-uid problem s.UIDArray = s.popAccount.getUIDList(); if (arrayLen(s.UIDArray)) { // Convert the array to a list // Keep the list to use for deletions s.UIDList = ArrayToList(s.UIDArray, s.mySeparator); // Get an array of the raw messages - one entry per UID supplied // This gets the raw email data from the pop server for whichever // emails are in the UIDList s.msgSrcArray = s.popAccount.GetRawMessageByUID(s.UIDList); // Turn the array into a query of email structures s.messagesQry = s.popAccount.parseRawMessage(s.msgSrcArray); // Loop over the array of email messages for( s.i=1; s.i <= s.messagesQry.recordcount; s.i=s.i+1) { // Process the message as you wish // .... writeOutput("<br/>" & s.messagesQry.subject[s.i]); // Now, delete this email from the server // Note: you can also delete all the emails in your query // in one go after the loop. See below. // The UID is NOT present in the messagesQry. Therefore, // you need to look up the UID by list position. // Obviously, you can also selectively delete single messages // based on your criteria. s.uid = listGetAt(s.UIDList, s.i, s.mySeparator); s.popAccount.deleteMessagesByUID(s.uid); } // Uncomment to delete all messages in the list in one go, // instead of one by one as above //s.popAccount.deleteMessagesByUID(s.UIDList); } </cfscript>
POP CFC has lots of other useful functions too.
Cheers,
Murray