Advertisement
Guest User

denstar

a guest
Nov 13th, 2009
199
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <cfcomponent>
  2.         <!--- I think this is where most the code came from: http://www.opensourcecf.com/CFOpenMail/imapcfc_view.cfm --->
  3.     <!--- no need to recreate these every time, only using them for static vars and methods --->
  4.     <cfset variables.mimeUtil = createObject("java","javax.mail.internet.MimeUtility")>
  5.     <cfset variables.objFlag = CreateObject("Java", "javax.mail.Flags$Flag")>
  6.     <cfset variables.objRecipientType = CreateObject("Java", "javax.mail.Message$RecipientType")>
  7.     <cfset variables.fProfileItem = createObject("java","javax.mail.UIDFolder$FetchProfileItem")>
  8.     <cfset variables.byteArray = repeatString(" ", 1000).getBytes()>
  9.     <cfset variables.showTextHtmlAttachmentsInline = false>
  10.     <!--- this is set here because I'm too lazy right now to figure
  11.        out how to get it to work properly in the recursive function
  12.        GetFolderStructure() and folderList()
  13.        --->
  14.     <cfset variables.sortOrder = 0>
  15.  
  16.         <cffunction name="dumpvar">
  17.           <cfargument name="var" default="blank">
  18.           <cfargument name="abort" default="true">
  19.           <cftry>
  20.               <cfdump var="#var#">
  21.             <cfcatch>
  22.               <cfset writeoutput(cfcatch.Message & " " & cfcatch.Detail & " " & cfcatch.TagContext[1].line & " " & cfcatch.stacktrace) />
  23.             </cfcatch>
  24.             </cftry>
  25.             <cfif arguments.abort>
  26.               <cfabort />
  27.             </cfif>
  28.         </cffunction>
  29.  
  30.  
  31.     <cffunction name="Init" access="public" output="No" returnType="boolean"
  32.        hint="Initialize this component and open a connection.">
  33.         <cfargument name="protocol" type="string" required="Yes">
  34.         <cfargument name="username" type="string" required="Yes">
  35.         <cfargument name="password" type="string" required="Yes">
  36.         <cfargument name="mailServer" type="string" required="Yes">
  37.         <cfargument name="port" type="numeric" required="No" default="0">
  38.         <cfargument name="timeout" type="numeric" required="No" default="60">
  39.  
  40.         <!--- store these outside of this object --->
  41.         <cfset session.username = arguments.username>
  42.         <cfset session.password = arguments.password>
  43.         <cfset session.mailServer = trim(arguments.mailServer)>
  44.         <cfset session.protocol = trim(arguments.protocol)>
  45.         <cfset session.imapPort = trim(arguments.port)>
  46.         <cfset session.protocolTimeout = trim(arguments.timeout * 1000)>
  47.        
  48.         <cfset getConnectedMailStore()>
  49.         <cfreturn session.connection.isConnected()>
  50.  
  51.     </cffunction>
  52.  
  53.     <cffunction name="getFolderInfo" access="public" output="No" returntype="Struct"
  54.        hint="Get information about a specific folder.">
  55.         <cfargument name="folder" required="Yes" type="string">
  56.         <cfset var objStore = getConnectedMailStore()>
  57.         <cfset var objFolder = "">
  58.         <Cfset var folderInfo = structNew()>
  59.         <cftry>
  60.             <cfset objFolder = OpenFolder(objStore, arguments.folder)>
  61.             <cfset folderInfo.fullName = objFolder.getFullName()>
  62.             <cfset folderInfo.name = objFolder.getName()>
  63.             <cfset folderInfo.type = objFolder.getType()>
  64.             <cfif folderInfo.type eq objFolder.HOLDS_FOLDERS>
  65.                 <cfset folderInfo.messageCount = 0>
  66.                 <cfset folderInfo.deletedMessageCount = 0>
  67.                 <cfset folderInfo.newMessageCount = 0>
  68.                 <cfset folderInfo.unreadMessageCount = 0>
  69.                 <cfset folderInfo.hasNewMessages = 0>
  70.             <cfelse>
  71.                 <cfset folderInfo.messageCount = objFolder.getMessageCount()>
  72.                 <cfset folderInfo.deletedMessageCount = objFolder.getDeletedMessageCount()>
  73.                 <cfset folderInfo.newMessageCount = objFolder.getNewMessageCount()>
  74.                 <cfset folderInfo.unreadMessageCount = objFolder.getUnreadMessageCount()>
  75.                 <cfset folderInfo.hasNewMessages = objFolder.hasNewMessages()>
  76.             </cfif>
  77.             <cfset objFolder.close(false)>
  78.             <cfcatch type="any">
  79.                 <cfset folderInfo.fullName = arguments.folder>
  80.                 <cfset folderInfo.name = arguments.folder>
  81.                 <cfset folderInfo.messageCount = 0>
  82.                 <cfset folderInfo.deletedMessageCount = 0>
  83.                 <cfset folderInfo.newMessageCount = 0>
  84.                 <cfset folderInfo.unreadMessageCount = 0>
  85.                 <cfset folderInfo.hasNewMessages = false>
  86.             </cfcatch>
  87.         </cftry>
  88.         <cfreturn folderInfo>
  89.     </cffunction>
  90.  
  91.     <cffunction name="folderList" access="public" output="No" returnType="query"
  92.        hint="Get a list of folders.">
  93.         <cfargument name="folder" required="No" default="INBOX" type="string">
  94.  
  95.         <cfset var objStore = getConnectedMailStore()>
  96.         <cfset var columns = "foldername,foldertype,parent,msgcount,newmsgcount,unreadmsgcount,folderlevel,sortorder">
  97.         <cfset var columnTypes = "varchar,integer,varchar,integer,integer,integer,integer,integer">
  98.         <cfset var list = QueryNew(columns,columnTypes)>
  99.         <cfset var objFolder = OpenFolder(objStore, arguments.folder, 0)>
  100.  
  101.         <cfset list = getFolderStructure(objFolder, "", list, 0)>
  102.         <cfset variables.sortorder = 0>
  103.         <cftry>
  104.             <cfset objFolder.close(false)>
  105.             <cfcatch type="any"></cfcatch>
  106.         </cftry>
  107.         <cfreturn list>
  108.     </cffunction>
  109.    
  110.     <cffunction name="copyMessages" access="public" output="No" returnType="boolean"
  111.        hint="Copy messages from one folder to another.">
  112.         <cfargument name="folder" required="Yes" type="string">
  113.         <cfargument name="messageNumber" required="Yes" type="string">
  114.         <cfargument name="newFolder" required="Yes" type="string">
  115.  
  116.         <cfset var objStore = getConnectedMailStore()>
  117.         <cfset var objFolder = OpenFolder(objStore, arguments.folder, true)>
  118.         <cfset var Messages = GetMessages(objFolder, arguments.messageNumber)>
  119.         <cfset var destFolder = objStore.getFolder(arguments.newFolder)>
  120.  
  121.         <cfif NOT destFolder.exists()>
  122.             <!--- destination folder does not exist --->
  123.             <cfset objFolder.close(true)>
  124.             <cfthrow message="Unable to copy messages" detail="The destination folder, #arguments.newFolder#, does not exist.">
  125.         <cfelseif destFolder.getType() eq destFolder.HOLDS_FOLDERS>
  126.             <!--- destination folder cannot hold messages --->
  127.             <cfset objFolder.close(true)>
  128.             <cfthrow message="Unable to copy messages" detail="The destination folder, #arguments.newfolder#, cannot contain messages.">
  129.         <cfelse>
  130.             <cfset objFolder.copyMessages(Messages, destFolder)>
  131.             <cfset objFolder.close(true)>
  132.             <cfreturn "Yes">
  133.         </cfif>
  134.     </cffunction>
  135.        
  136.     <cffunction name="folderDelete" access="public" output="No" returntype="boolean"
  137.        hint="Delete a folder.">
  138.         <cfargument name="folder" required="Yes" type="string">
  139.         <cfargument name="recurse" required="No" type="boolean" default="false">
  140.         <cfset var objFolder = getConnectedMailStore().getFolder(arguments.Folder)>
  141.         <cfset objFolder.delete(arguments.recurse)>
  142.         <cfreturn not objFolder.exists()>
  143.     </cffunction>
  144.  
  145.     <cffunction name="folderCreate" access="public" output="No" returntype="boolean"
  146.        hint="Create a folder.">
  147.         <cfargument name="folder" required="Yes" type="string">
  148.         <cfset getConnectedMailStore().getFolder(arguments.Folder).create(true)>
  149.         <cfreturn true>
  150.     </cffunction>
  151.  
  152.     <cffunction name="folderRename" access="public" output="No" returntype="boolean"
  153.        hint="Rename a folder.">
  154.         <cfargument name="folder" required="Yes" type="string">
  155.         <cfargument name="renameTo" required="Yes" type="string">
  156.  
  157.         <cfset var objStore = getConnectedMailStore()>
  158.         <cfset var objFolder = OpenFolder(objStore, arguments.folder, true)>
  159.  
  160.         <cfset objFolder.close(true)>
  161.         <cfreturn objFolder.renameTo(objStore.getFolder(arguments.renameTo))>
  162.     </cffunction>
  163.    
  164.     <cffunction name="getMessageCount" access="public" output="No" returnType="numeric"
  165.        hint="Returns the number of messages in a folder.">
  166.         <cfargument name="folder" required="No" default="Inbox" type="string">
  167.  
  168.         <cfset var objStore = getConnectedMailStore()>
  169.         <cfset var objFolder = OpenFolder(objStore, arguments.folder, 0)>
  170.                 <cfset var messageCount = objFolder.getMessageCount()>
  171.         <cfset objFolder.close(false)>
  172.         <cfreturn messageCount />
  173.     </cffunction>
  174.  
  175.     <cffunction name="listMessages" access="public" output="No" returnType="query"
  176.        hint="Lists messages within a specified folder.">
  177.         <cfargument name="folder" required="No" default="Inbox" type="string">
  178.         <cfargument name="MessageNumber" default="" type="string">
  179.         <cfargument name="startMessageNumber" default="1" type="numeric">
  180.         <cfargument name="messageCount" default="0" type="numeric">
  181.  
  182.         <cfset var objStore = getConnectedMailStore()>
  183.         <cfset var objFolder = OpenFolder(objStore, arguments.folder, 0)>
  184.         <cfset var Messages = GetMessages(objFolder, arguments.MessageNumber,arguments.startMessageNumber,arguments.messageCount)>
  185.         <cfset var Columns = "id,sent,recvdate,from,messagenumber,replyto,subject,recipients,cc,bcc,to,body,txtBody,seen,answered,deleted,draft,flagged,recent,user,attach,html,size">
  186.         <cfset var ColumnTypes = "integer,date,date,varchar,integer,varchar,varchar,varchar,varchar,varchar,varchar,varchar,varchar,bit,bit,bit,bit,bit,bit,bit,varchar,bit,integer">
  187.         <cfset var qry_Messages = QueryNew(Columns,columnTypes)>
  188.  
  189.         <cfset var objMessage = "">
  190.                 <cfset var recipients = "">
  191.         <cfset var msgFrom = "">
  192.         <cfset var msgTo = "">
  193.         <cfset var msgCC = "">
  194.         <cfset var msgBCC = "">
  195.         <cfset var msgFlags = "">
  196.         <cfset var fp = createObject("java","javax.mail.FetchProfile")>
  197.                 <cfset var x = 0>
  198.        
  199.         <cfset fp.init()>
  200.         <cfset fp.add(variables.fProfileItem.ENVELOPE)>
  201.         <cfset fp.add(variables.fProfileItem.FLAGS)>
  202.         <Cfset objFolder.fetch(Messages,fp)>
  203.  
  204.         <cfloop from="1" to="#arrayLen(Messages)#" step="1" index="index">
  205.             <cfset objMessage = Messages[index]>
  206.             <cfset msgFrom = objMessage.getFrom()>
  207.             <cfset msgTo = objMessage.getRecipients(variables.objRecipientType.TO)>
  208.                 <cfset msgCC = objMessage.getRecipients(variables.objRecipientType.CC)>
  209.                 <cfset msgBCC = objMessage.getRecipients(variables.objRecipientType.BCC)>
  210.                 <cfif NOT isDefined("msgCC")>
  211.                           <cfset msgCC = arrayNew(1) />
  212.                         </cfif>
  213.                 <cfif NOT isDefined("msgBCC")>
  214.                           <cfset msgBCC = arrayNew(1) />
  215.                         </cfif>
  216.                 <cfif NOT isArray(msgCC)>
  217.                           <cfset msgCC = listToArray(msgCC) />
  218.                         </cfif>
  219.                 <cfif NOT isArray(msgBCC)>
  220.                           <cfset msgBCC = listToArray(msgBCC) />
  221.                         </cfif>
  222.             <cfif not isdefined("msgTo")>
  223.                 <cfset msgTo = ArrayNew(1)>
  224.             </cfif>
  225.                       <cfset recipients = listAppend(recipients,arrayToList(msgTo))>
  226.                       <cfset recipients = listAppend(recipients,arrayToList(msgCC))>
  227.                       <cfset recipients = listAppend(recipients,arrayToList(msgBCC))>
  228.  
  229.             <cfset msgFlags = objMessage.getFlags().getSystemFlags()>
  230.  
  231.             <cfset queryAddRow(qry_Messages)>
  232.             <cfset querySetCell(qry_Messages,"id", index)>
  233.             <cfset querySetCell(qry_Messages,"sent", objMessage.getSentDate())>
  234.             <cfset querySetCell(qry_Messages,"recvdate", objMessage.getReceivedDate())>
  235.             <cfset querySetCell(qry_Messages,"from", arrayToList(msgFrom))>
  236.             <cfset querySetCell(qry_Messages,"messagenumber", objMessage.getMessageNumber())>
  237.             <cfset querySetCell(qry_Messages,"subject", objMessage.getSubject())>
  238.             <cfset querySetCell(qry_Messages,"recipients", recipients)>                    
  239.             <cfset querySetCell(qry_Messages,"cc", arrayToList(msgCC))>
  240.             <cfset querySetCell(qry_Messages,"bcc", arrayToList(msgBCC))>
  241.             <cfset querySetCell(qry_Messages,"to", arrayToList(msgTo))>
  242.             <cfset querySetCell(qry_Messages,"size", objMessage.getSize())>
  243.             <cfset querySetCell(qry_Messages,"seen", false)>
  244.             <cfset querySetCell(qry_Messages,"answered", false)>
  245.             <cfset querySetCell(qry_Messages,"deleted", false)>
  246.             <cfset querySetCell(qry_Messages,"draft", false)>
  247.             <cfset querySetCell(qry_Messages,"flagged", false)>
  248.             <cfset querySetCell(qry_Messages,"user", false)>
  249.             <cfset querySetCell(qry_Messages,"recent", false)>
  250.             <cfloop from="1" to="#arrayLen(msgFlags)#" step="1" index="i">
  251.                 <cfif msgFlags[i].equals(variables.objFlag.SEEN)>
  252.                     <cfset querySetCell(qry_Messages,"seen", true)>
  253.                 <cfelseif msgFlags[i].equals(variables.objFlag.ANSWERED)>
  254.                     <cfset querySetCell(qry_Messages,"answered", true)>
  255.                 <cfelseif msgFlags[i].equals(variables.objFlag.DELETED)>
  256.                     <cfset querySetCell(qry_Messages,"deleted", true)>
  257.                 <cfelseif msgFlags[i].equals(variables.objFlag.DRAFT)>
  258.                     <cfset querySetCell(qry_Messages,"draft", true)>
  259.                 <cfelseif msgFlags[i].equals(variables.objFlag.FLAGGED)>
  260.                     <cfset querySetCell(qry_Messages,"flagged", true)>
  261.                 <cfelseif msgFlags[i].equals(variables.objFlag.USER)>
  262.                     <cfset querySetCell(qry_Messages,"user", true)>
  263.                 <cfelseif msgFlags[i].equals(variables.objFlag.RECENT)>
  264.                     <cfset querySetCell(qry_Messages,"recent", true)>
  265.                 </cfif>
  266.             </cfloop>
  267.         </cfloop>
  268.         <cfset objFolder.close(false)>
  269.         <cfquery dbtype="query" name="qry_Messages">
  270.             select * from qry_Messages
  271.             order by id desc
  272.         </cfquery>
  273.         <cfreturn qry_Messages>
  274.     </cffunction>
  275.  
  276.     <cffunction name="getMessage" access="public" output="Yes"
  277.        hint="Get a specific message from a folder.">
  278.         <cfargument name="folder" required="No" default="Inbox" type="string">
  279.         <cfargument name="MessageNumber" required="No" default="1" type="numeric">
  280.         <cfargument name="text" required="No" default="false" type="boolean">
  281.  
  282.         <cfset var objStore = getConnectedMailStore()> <!--- javax.mail.Store --->
  283.         <cfset var objFolder = OpenFolder(objStore, arguments.folder, 0)> <!--- javax.mail.folder --->
  284.         <cfset var Messages = GetMessages(objFolder, arguments.MessageNumber)><!--- array of com.sun.mail.imap.IMAPMessage (javax.mail.Message) --->
  285.         <cfset var objMessage = "">
  286.  
  287.         <cfset var Columns = "id,sent,recvdate,from,messagenumber,replyto,subject,recipients,cc,bcc,to,body,txtBody,seen,answered,deleted,draft,flagged,recent,user,attach,html,size">
  288.         <cfset var ColumnTypes = "integer,date,date,varchar,integer,varchar,varchar,varchar,varchar,varchar,varchar,varchar,varchar,bit,bit,bit,bit,bit,bit,bit,varchar,bit,integer">
  289.         <cfset var qry_Messages = QueryNew(Columns,columnTypes)>
  290.         <cfset var recipients = "">
  291.         <cfset var msgFrom = "">
  292.         <cfset var msgTo = "">
  293.         <cfset var msgCC = "">
  294.         <cfset var msgBCC = "">
  295.         <cfset var msgReplyTo = "">
  296.         <cfset var msgFlags = "">
  297.         <cfset var msgBody = "">
  298.         <cfset var msgTxtBody = "">
  299.         <cfset var msgAttachments = "">
  300.         <cfset var msgIsHTML = false>
  301.        
  302.         <cfset var parts = arrayNew(2)>
  303.         <cfset var i = 0>
  304.  
  305.         <cfif arrayLen(Messages) is 0>
  306.             <Cfthrow message="Message Not Found" detail="The specified message number was not found in the specified folder.">
  307.         </cfif>
  308.        
  309.         <cfset objMessage = Messages[1]><!--- com.sun.mail.imap.IMAPMessage (javax.mail.Message) --->
  310.        
  311.         <!--- envelope details and flags --->
  312.         <cfset msgFrom = objMessage.getFrom()>
  313.         <cfset msgTo = objMessage.getRecipients(variables.objRecipientType.TO)>
  314.         <cfset msgCC = objMessage.getRecipients(variables.objRecipientType.CC)>
  315.         <cfset msgReplyTo = objMessage.getReplyTo()>
  316.         <cfset msgFlags = objMessage.getFlags().getSystemFlags()>
  317.         <cfset msgBCC = objMessage.getRecipients(variables.objRecipientType.BCC)>
  318.         <cfif NOT isDefined("msgCC")>
  319.                   <cfset msgCC = arrayNew(1) />
  320.                 </cfif>
  321.         <cfif NOT isDefined("msgBCC")>
  322.                   <cfset msgBCC = arrayNew(1) />
  323.                 </cfif>
  324.         <cfif NOT isArray(msgCC)>
  325.                   <cfset msgCC = listToArray(msgCC) />
  326.                 </cfif>
  327.         <cfif NOT isArray(msgBCC)>
  328.                   <cfset msgBCC = listToArray(msgBCC) />
  329.                 </cfif>
  330.         <cfif not isdefined("msgTo")>
  331.              <cfset msgTo = ArrayNew(1)>
  332.         </cfif>
  333.               <cfset recipients = listAppend(recipients,arrayToList(msgTo))>
  334.               <cfset recipients = listAppend(recipients,arrayToList(msgCC))>
  335.               <cfset recipients = listAppend(recipients,arrayToList(msgBCC))>
  336.  
  337.         <cfif (objMessage.isMimeType("text/*") AND NOT objMessage.isMimeType("text/rfc822-headers")) OR isSimpleValue(objMessage.getContent())>
  338.             <!--- it is NOT a multipart message --->
  339.             <cfset encoding = objMessage.getEncoding()>
  340.             <!--- look for quoted-printable --->
  341.             <cfset content = objMessage.getContent()>
  342.             <cfset parts[1][1] = content>
  343.             <cfif refindnocase("<html[0-9a-zA-Z= ""/:.]*>", content)>
  344.                 <cfset parts[1][2] = 2>
  345.             <cfelse>
  346.                 <cfset parts[1][2] = 1>
  347.             </cfif>        
  348.         <cfelse>
  349.             <cfset getPartsResult = getParts(objMessage)>
  350.             <cfset parts = getPartsResult.parts>
  351.             <cfset msgAttachments = getPartsResult.attachments>
  352.         </cfif>
  353.  
  354.         <!--- compile the parts --->
  355.         <!--- are there any HTML parts? --->
  356.         <cfloop from="1" to="#arraylen(parts)#" index="i">
  357.             <cfif parts[i][2] is 2>
  358.                 <cfset msgIsHtml = true>
  359.             </cfif>
  360.         </cfloop>
  361.         <!--- compile the message body --->
  362.         <cfloop from="1" to="#arraylen(parts)#" index="i">
  363.             <cfif parts[i][2] is 2>
  364.                 <!--- only add HTML parts to the body --->
  365.                 <cfset msgBody = msgBody & parts[i][1]>
  366.                 <cfif arraylen(parts) gt i>
  367.                     <cfset msgBody = msgBody & "<hr>">
  368.                 </cfif>
  369.             <cfelse>
  370.                 <!--- only add text parts to txtBody --->
  371.                 <cfset msgTxtBody = msgTxtBody & htmlEditFormat(parts[i][1])>
  372.             </cfif>
  373.         </cfloop>
  374.         <!--- add message to the return query --->
  375.         <cfset queryAddRow(qry_Messages)>
  376.         <cfset querySetCell(qry_Messages,"id", 1)>
  377.         <cfset querySetCell(qry_Messages,"size", objMessage.getSize())>
  378.         <cfset querySetCell(qry_Messages,"replyto", msgReplyTo)>
  379.         <cfset querySetCell(qry_Messages,"sent", objMessage.getSentDate())>
  380.         <cfset querySetCell(qry_Messages,"recvdate", objMessage.getReceivedDate())>
  381.         <cfset querySetCell(qry_Messages,"from", arrayToList(msgFrom))>
  382.         <cfset querySetCell(qry_Messages,"messagenumber", objMessage.getMessageNumber())>
  383.         <cfset querySetCell(qry_Messages,"subject", objMessage.getSubject())>
  384.         <cfset querySetCell(qry_Messages,"to", arrayToList(msgTo))>
  385.         <cfset querySetCell(qry_Messages,"recipients", recipients)>                    
  386.         <cfset querySetCell(qry_Messages,"cc", arrayToList(msgCC))>
  387.         <cfset querySetCell(qry_Messages,"bcc", arrayToList(msgBCC))>
  388.         <cfset querySetCell(qry_Messages,"body", msgBody)>
  389.         <cfset querySetCell(qry_Messages,"txtBody", msgTxtBody)>
  390.         <cfset querySetCell(qry_Messages,"html", msgIsHtml)>
  391.         <cfset querySetCell(qry_Messages,"attach", msgAttachments)>
  392.         <cfset querySetCell(qry_Messages,"seen", false)>
  393.         <cfset querySetCell(qry_Messages,"answered", false)>
  394.         <cfset querySetCell(qry_Messages,"deleted", false)>
  395.         <cfset querySetCell(qry_Messages,"draft", false)>
  396.         <cfset querySetCell(qry_Messages,"flagged", false)>
  397.         <cfset querySetCell(qry_Messages,"user", false)>
  398.         <cfset querySetCell(qry_Messages,"recent", false)>
  399.         <cfloop from="1" to="#arrayLen(msgFlags)#" step="1" index="i">
  400.             <cfif msgFlags[i] eq variables.objFlag.SEEN>
  401.                 <cfset querySetCell(qry_Messages,"seen", true)>
  402.             <cfelseif msgFlags[i] eq variables.objFlag.ANSWERED>
  403.                 <cfset querySetCell(qry_Messages,"answered", true)>
  404.             <cfelseif msgFlags[i] eq variables.objFlag.DELETED>
  405.                 <cfset querySetCell(qry_Messages,"deleted", true)>
  406.             <cfelseif msgFlags[i] eq variables.objFlag.DRAFT>
  407.                 <cfset querySetCell(qry_Messages,"draft", true)>
  408.             <cfelseif msgFlags[i] eq variables.objFlag.FLAGGED>
  409.                 <cfset querySetCell(qry_Messages,"flagged", true)>
  410.             <cfelseif msgFlags[i] eq variables.objFlag.USER>
  411.                 <cfset querySetCell(qry_Messages,"user", true)>
  412.             <cfelseif msgFlags[i] eq variables.objFlag.RECENT>
  413.                 <cfset querySetCell(qry_Messages,"recent", true)>
  414.             </cfif>
  415.         </cfloop>
  416.         <cfset objFolder.close(false)>
  417.         <cfreturn qry_Messages>
  418.     </cffunction>
  419.  
  420.     <cffunction name="expunge" access="public" output="No" returntype="boolean"
  421.        hint="Expunge deleted messages from a folder.">
  422.         <cfargument name="folder" required="Yes" type="string">
  423.         <cfset var objStore = getConnectedMailStore()>
  424.         <cfset var objFolder = "">
  425.  
  426.         <cftry>
  427.             <cfset objFolder = OpenFolder(objStore, arguments.folder, true)>
  428.             <cfset objFolder.expunge()>
  429.             <cfset objFolder.close(false)>
  430.             <cfcatch type="any">
  431.                 <!--- folder cannot be expunged --->
  432.             </cfcatch>
  433.         </cftry>
  434.         <cfreturn true>
  435.     </cffunction>
  436.    
  437.     <cffunction name="delete" access="public" output="No" returntype="boolean"
  438.        hint="Sets the message's DELETED flag.">
  439.         <cfargument name="folder" required="Yes" type="string">
  440.         <cfargument name="messageNumber" required="Yes" type="string">
  441.         <cfargument name="value" required="Yes" type="boolean">
  442.  
  443.         <cfset var msgnum = 0>
  444.         <cfset var objStore = getConnectedMailStore()>
  445.         <cfset var objFolder = OpenFolder(objStore, arguments.folder, true)>
  446.        
  447.         <cfloop list="#listSort(messagenumber,"numeric","desc")#" index="msgnum">
  448.             <cfif isNumeric(msgnum) and msgnum gt 0>
  449.                 <cfset setFlag(objFolder, msgnum, "DELETED", arguments.value)>
  450.             </cfif>
  451.         </cfloop>
  452.         <cfset objFolder.close(false)>
  453.         <cfreturn true>
  454.     </cffunction>
  455.  
  456.     <cffunction name="setAnswered" access="public" output="No" returntype="boolean"
  457.        hint="Sets the message's ANSWERED flag.">
  458.         <cfargument name="folder" required="Yes" type="string">
  459.         <cfargument name="messageNumber" required="Yes" type="string">
  460.         <cfargument name="value" required="Yes" type="boolean">
  461.  
  462.         <cfset var objStore = getConnectedMailStore()>
  463.         <cfset var objFolder = OpenFolder(objStore, arguments.folder, false)>
  464.  
  465.         <cfset setFlag(objFolder, arguments.messageNumber, "ANSWERED", arguments.value)>
  466.         <cfset objFolder.close(false)>
  467.         <cfreturn true>
  468.     </cffunction>
  469.  
  470.     <cffunction name="setSeen" access="public" output="No" returntype="boolean"
  471.        hint="Sets the message's SEEN flag.">
  472.         <cfargument name="folder" required="Yes" type="string">
  473.         <cfargument name="messageNumber" required="Yes" type="string">
  474.         <cfargument name="value" required="Yes" type="boolean">
  475.  
  476.         <cfset var objStore = getConnectedMailStore()>
  477.         <cfset var objFolder = OpenFolder(objStore, arguments.folder, false)>
  478.  
  479.         <cfset setFlag(objFolder, arguments.messageNumber, "SEEN", arguments.value)>
  480.         <cfset objFolder.close(false)>
  481.         <cfreturn true>
  482.     </cffunction>
  483.  
  484.     <cffunction name="setDraft" access="public" output="No" returntype="boolean"
  485.        hint="Sets the message's DRAFT flag.">
  486.         <cfargument name="folder" required="Yes" type="string">
  487.         <cfargument name="messageNumber" required="Yes" type="string">
  488.         <cfargument name="value" required="Yes" type="boolean">
  489.  
  490.         <cfset var objStore = getConnectedMailStore()>
  491.         <cfset var objFolder = OpenFolder(objStore, arguments.folder, false)>
  492.  
  493.         <cfset setFlag(objFolder, arguments.messageNumber, "DRAFT", arguments.value)>
  494.         <cfset objFolder.close(false)>
  495.         <cfreturn true>
  496.     </cffunction>
  497.  
  498.     <cffunction name="setFlagged" access="public" output="No" returntype="boolean"
  499.        hint="Sets the message's FLAGGED flag.">
  500.         <cfargument name="folder" required="Yes" type="string">
  501.         <cfargument name="messageNumber" required="Yes" type="string">
  502.         <cfargument name="value" required="Yes" type="boolean">
  503.  
  504.         <cfset var objStore = getConnectedMailStore()>
  505.         <cfset var objFolder = OpenFolder(objStore, arguments.folder, false)>
  506.  
  507.         <cfset setFlag(objFolder, arguments.messageNumber, "FLAGGED", arguments.value)>
  508.         <cfset objFolder.close(false)>
  509.         <cfreturn true>
  510.     </cffunction>
  511.  
  512.     <cffunction name="setRecent" access="public" output="No" returntype="boolean"
  513.        hint="Sets the message's RECENT flag.">
  514.         <cfargument name="folder" required="Yes" type="string">
  515.         <cfargument name="messageNumber" required="Yes" type="string">
  516.         <cfargument name="value" required="Yes" type="boolean">
  517.  
  518.         <cfset var objStore = getConnectedMailStore()>
  519.         <cfset var objFolder = OpenFolder(objStore, arguments.folder, false)>
  520.  
  521.         <cfset setFlag(objFolder, arguments.messageNumber, "RECENT", arguments.value)>
  522.         <cfset objFolder.close(false)>
  523.         <cfreturn true>
  524.     </cffunction>
  525.  
  526.     <cffunction name="setUser" access="public" output="No" returntype="boolean"
  527.        hint="Sets the message's USER flag.">
  528.         <cfargument name="folder" required="Yes" type="string">
  529.         <cfargument name="messageNumber" required="Yes" type="string">
  530.         <cfargument name="value" required="Yes" type="boolean">
  531.  
  532.         <cfset var objStore = getConnectedMailStore()>
  533.         <cfset var objFolder = OpenFolder(objStore, arguments.folder, false)>
  534.        
  535.         <cfset setFlag(objFolder, arguments.messageNumber, "USER", arguments.value)>
  536.         <cfset objFolder.close(false)>
  537.         <cfreturn true>
  538.     </cffunction>
  539.    
  540.     <cffunction name="send" access="public" output="No" returntype="boolean">
  541.         <cfargument name="to" required="Yes" type="string">
  542.         <cfargument name="cc" required="Yes" type="string">
  543.         <cfargument name="bcc" required="Yes" type="string">
  544.         <cfargument name="subject" required="Yes" type="string">
  545.         <cfargument name="body" required="Yes" type="string">
  546.         <cfargument name="attachments" required="No" type="string" default="">
  547.  
  548.         <cfset var msg = CreateObject("Java", "javax.mail.internet.MimeMessage")>
  549.         <cfset var mmp = CreateObject("Java", "javax.mail.internet.MimeMultipart")>
  550.         <cfset var mbp = CreateObject("Java", "javax.mail.internet.MimeBodyPart")>
  551.         <cfset var dhl = CreateObject("Java", "javax.activation.DataHandler")>
  552.         <cfset var fds = CreateObject("Java", "javax.activation.FileDataSource")>
  553.         <cfset var add = CreateObject("Java", "javax.mail.internet.InternetAddress")>
  554.         <cfset var trn = CreateObject("Java", "javax.mail.Transport")>
  555.         <cfset var Timeout = application.protocolTimeout * 1000>
  556.         <cfset var index = "">
  557.         <cfset var objFolder = "">
  558.         <cfset var Messages = "">
  559.        
  560.         <cfset objStore = getConnectedMailStore()>
  561.         <cfset msg.init(objSession)>
  562.         <cfset msg.setFrom(add.init(session.username))>
  563.         <cfset msg.addRecipients(variables.objRecipientType.TO, add.parse(replace(arguments.to, ";", ", ", "ALL"), false))>
  564.         <cfset msg.addRecipients(variables.objRecipientType.CC, add.parse(replace(arguments.cc, ";", ", ", "ALL"), false))>
  565.         <cfset msg.addRecipients(variables.objRecipientType.BCC, add.parse(replace(arguments.bcc, ";", ", ", "ALL"), false))>
  566.         <cfset msg.setSubject(arguments.subject)>
  567.         <cfset msg.setText(arguments.body)>
  568.         <cfset msg.setHeader("X-Mailer", "Koolwired IMAP Web Client (http://www.koolwired.com)")>
  569.         <cfset msg.setSentDate(now())>
  570.         <cfif len(arguments.attachments)>
  571.             <cfset mbp.init()>
  572.             <cfset mbp.setText(arguments.body)>
  573.             <cfset mmp.addBodyPart(mbp)>
  574.             <cfloop list="#arguments.attachments#" index="index">
  575.                 <cfset fds.init(getTempDirectory() & index)>
  576.                 <cfset mbp.init()>
  577.                 <cfset mbp.setDataHandler(dhl.init(fds))>
  578.                 <cfset mbp.setFileName(fds.getName())>
  579.                 <cfset mmp.addBodyPart(mbp)>
  580.             </cfloop>
  581.             <cfset msg.setContent(mmp)>
  582.         </cfif>
  583.         <cfset objFolder = OpenFolder(objStore, "Inbox.Sent", true, true)>
  584.         <cfset Messages = ArrayNew(1)>
  585.         <cfset Messages[1] = msg>
  586.         <cfset objFolder.appendMessages(Messages)>
  587.         <cfreturn true>
  588.     </cffunction>
  589.    
  590.     <cffunction name="download" access="public" output="Yes"
  591.        hint="Take a specific attachment from a message and return the details - along with the binary data.">
  592.         <cfargument name="folder" required="Yes" type="string">
  593.         <cfargument name="MessageNumber" required="Yes" type="numeric">
  594.         <cfargument name="Attach" required="Yes" type="string">
  595.         <cfargument name="includeData" required="no" type="boolean" default="true">
  596.         <!---
  597.            I think it's worth mentioning that this may not be very efficient for
  598.            really big files because you end up writing the files twice.
  599.        --->
  600.         <cfset var objStore = getConnectedMailStore()>
  601.         <cfset var objFolder = OpenFolder(objStore, arguments.folder, 0)>
  602.         <cfset var Messages = GetMessages(objFolder, arguments.MessageNumber)>
  603.         <cfset var attachment = StructNew()>
  604.         <cfset var byteArray = repeatString(" ", 1000).getBytes()>
  605.         <cfset var part = CreateObject("Java", "javax.mail.Part")>
  606.         <cfset var i = 0>
  607.         <cfset var fo = "">
  608.         <cfset var fso = "">
  609.         <cfset var in = "">
  610.         <cfset var tempFile = "">
  611.         <cfset var j = "">
  612.         <cfset var fileContents = "">
  613.         <cfset var messageParts = Messages[1].getContent()>
  614.         <cfset var listfiles = "">
  615.        
  616.         <cfloop from="0" to="#messageParts.getCount() - 1#" index="i">
  617.             <cfset part = messageParts.getBodyPart(javacast("int", i))>
  618.             <cfif not(findnocase("text/text", part.getContentType())) and part.getFileName() is arguments.Attach>
  619.                 <cfset StructInsert(attachment, "name", part.getFileName())>
  620.                 <cfset StructInsert(attachment, "type", part.getContentType())>
  621.                 <cfset fo = createObject("Java", "java.io.File")>
  622.                 <cfset fso = createObject("Java", "java.io.FileOutputStream")>
  623.                 <cfset in = part.getInputStream()>
  624.                 <cfset randomize(second(now()) + minute(now()) * 60)>
  625.                 <cfset tempFile = getTempDirectory() & session.SessionID & "-" & randrange(1,100) & "-" & part.getFileName()>
  626.                 <cfset fo.init(tempFile)>
  627.                 <cfset fso.init(fo)>
  628.                 <cfset j = in.read(byteArray)>
  629.                 <cfloop condition="not(j is -1)">
  630.                     <cfset fso.write(byteArray, 0, j)>
  631.                     <cfset j = in.read(byteArray)>
  632.                 </cfloop>
  633.                 <cfset fso.close()>
  634.                 <cfif includeData>
  635.                     <cffile action="READBINARY" file="#tempFile#" variable="fileContents">
  636.                     <cffile action="DELETE" file="#tempFile#">
  637.                     <cfset StructInsert(attachment, "data", fileContents)>
  638.                     <cfset StructInsert(attachment, "length", ArrayLen(fileContents))>
  639.                 <cfelse>
  640.                     <cfdirectory action="LIST" directory="#getDirectoryFromPath(tempFile)#" name="listFiles" filter="#getFileFromPath(tempFile)#">
  641.                     <cfloop query="listfiles">
  642.                         <cfif listFiles.name eq getFileFromPath(tempfile)>
  643.                             <cfset StructInsert(attachment, "data", '')>
  644.                             <cfset StructInsert(attachment, "length", size)>
  645.                         </cfif>
  646.                     </cfloop>
  647.                 </cfif>
  648.             </cfif>
  649.         </cfloop>
  650.         <cfset objFolder.close(false)>
  651.         <cfreturn attachment>
  652.     </cffunction>
  653.  
  654.  
  655. <!--- ################################################## --->
  656. <!--- ################################################## --->
  657. <!---                                                    --->
  658. <!---                   PRIVATE METHODS                  --->
  659. <!---                                                    --->
  660. <!--- ################################################## --->
  661. <!--- ################################################## --->
  662.  
  663.     <cffunction name="getConnectedMailStore" access="private" output="No"
  664.        hint="Returns the existing mail store object that is in memory as long as the connection properties (username, server, port) are the same, or creates a new connected mail store object.">
  665.         <cfset var connectionProperties = session.username & session.mailServer & session.imapPort>
  666.  
  667.         <cfif
  668.            isDefined("session.connectionProperties")
  669.            and session.connectionProperties eq connectionProperties
  670.            and isDefined("session.connection")
  671.            and not isSimpleValue(session.connection)
  672.            and session.connection.isConnected()>
  673.             <!---
  674.                We have connection properties in session.
  675.                They are the same as the connection properties we passed in.
  676.                session.connection already exists
  677.                and it's a mail store object
  678.                and it's connected
  679.                
  680.                So, return the existing connection from the session scope.
  681.            --->
  682.             <cfreturn session.connection>
  683.         <cfelse>
  684.             <!--- get a new connected mail store and put it in the session scope --->
  685.             <cfset session.connection = GetStore()>
  686.             <!--- put the connection properties into the session scope --->
  687.             <cfset session.connectionProperties = connectionProperties>
  688.             <!--- return the new mail store --->
  689.             <cfreturn session.connection>
  690.         </cfif>
  691.     </cffunction>
  692.  
  693.     <cffunction name="GetStore" access="private" output="No"
  694.        hint="Gets a connected mail store object (ie, connect to server, authenticate, etc)">
  695.  
  696.         <cfset var clsSession = createObject("Java", "javax.mail.Session")>
  697.         <cfset var objProperties = createObject("Java", "java.util.Properties")>
  698.         <cfset var objStore = createObject("Java", "javax.mail.Store")>
  699.                 <cfset var protocol = session.protocol />
  700.  
  701.         <cfif not structKeyExists(session,"username")>
  702.             <!--- we're out of session! --->
  703.             <cfthrow message="Session Time Out" detail="Your session has timed out and you are no longer connected.  Please log in again.">
  704.         </cfif>
  705.         <!--- set up the type of connection --->
  706.         <cfset objProperties.init()>
  707.  
  708.                 <!--- handle ssl connections --->
  709.                 <cfif protocol eq "imaps">
  710.                     <cfset objProperties.put("mail.imap.socketFactory.class", "javax.net.ssl.SSLSocketFactory")/>
  711.                     <cfset objProperties.put("mail.imap.socketFactory.fallback", false)/>
  712.             <cfset objProperties.put("mail.store.protocol", "imaps")>
  713.             <cfif session.imapPort neq 0>
  714.                         <cfset objProperties.put("mail.imap.socketFactory.port", session.imapPort)/>
  715.                 <cfset objProperties.put("mail.imap.port", session.imapPort)>
  716.                </cfif>
  717.             <cfset objProperties.put("mail.imap.connectiontimeout", session.protocolTimeout)><!--- milliseconds --->
  718.             <cfset objProperties.put("mail.imap.timeout", session.protocolTimeout)><!--- milliseconds --->
  719.  
  720.                 <cfelseif protocol eq "imap">
  721.             <cfset objProperties.put("mail.store.protocol", "imap")>
  722.             <cfif session.imapPort neq 0>
  723.                         <cfset objProperties.put("mail.imap.socketFactory.port", session.imapPort)/>
  724.                 <cfset objProperties.put("mail.imap.port", session.imapPort)>
  725.                     </cfif>
  726.             <cfset objProperties.put("mail.imap.connectiontimeout", session.protocolTimeout)><!--- milliseconds --->
  727.             <cfset objProperties.put("mail.imap.timeout", session.protocolTimeout)><!--- milliseconds --->
  728.  
  729.                 <cfelseif protocol eq "pop">
  730.                     <cfscript>
  731.                         if(session.imapPort neq 0) {
  732.                             objProperties.setProperty("mail.pop.socketFactory.port", session.imapPort);
  733.                             objProperties.setProperty("mail.pop.port",  session.imapPort);
  734.                         }
  735.                 objProperties.setProperty("mail.store.protocol", "pop")>
  736.                         objProperties.setProperty("mail.pop.socketFactory.fallback", "false");
  737.                         objProperties.setProperty("mail.pop.connectiontimeout",  session.protocolTimeout);
  738.                         objProperties.setProperty("mail.pop.timeout",  session.protocolTimeout);
  739.                     </cfscript>
  740.  
  741.                 <cfelseif protocol eq "pop3">
  742.                     <cfscript>
  743.                         if(session.imapPort neq 0) {
  744.                             objProperties.setProperty("mail.pop3.socketFactory.port", session.imapPort);
  745.                             objProperties.setProperty("mail.pop3.port",  session.imapPort);
  746.                         }
  747.                 objProperties.setProperty("mail.store.protocol", "pop3")>
  748.                         objProperties.setProperty("mail.pop3.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
  749.                         objProperties.setProperty("mail.pop3.socketFactory.fallback", "false");
  750.                         objProperties.setProperty("mail.pop3.connectiontimeout",  session.protocolTimeout);
  751.                         objProperties.setProperty("mail.pop3.timeout",  session.protocolTimeout);
  752.                     </cfscript>
  753.                 <cfelse>
  754.                     <cfthrow type="cfjavamail.unknown.protocol" message="Unrecognized protocol: #protocol#" detail="Unrecognized protocol: #protocol#" />
  755.                 </cfif>
  756.         <!--- start the session --->
  757.         <cfset objSession = clssession.getInstance(objProperties)>
  758.         <!--- start the mailstore --->
  759.         <cfset objStore = objsession.getStore()>
  760.         <!--- connect and authenticate --->
  761.                 <cftry>
  762.             <cfset objStore.connect(session.mailServer, session.username, session.password)>
  763.                     <cfcatch>
  764.             <cfthrow type="imap.connection.error" message="Unable to connect" detail="unable to connect to specified host.  Please verify the host name.">
  765.                     </cfcatch>
  766.                 </cftry>
  767.         <cfreturn objStore>
  768.     </cffunction>
  769.    
  770.     <cffunction name="OpenFolder" access="private" output="No"
  771.        hint="Opens a folder within a mail store and returns the folder object.">
  772.         <cfargument name="objStore" required="Yes" type="any">
  773.         <cfargument name="Folder" required="Yes" type="string">
  774.         <cfargument name="ReadWrite" required="No" type="boolean" default="false">
  775.         <cfargument name="Create" required="No" type="boolean" default="false">
  776.  
  777.         <cfset var objFolder = arguments.objStore.getFolder(arguments.Folder)>
  778.  
  779.         <cftry>
  780.             <cfif NOT objFolder.exists() AND arguments.create>
  781.                 <cfset objFolder.create(true)>
  782.             </cfif>
  783.             <cfif ReadWrite>
  784.                 <cfset objFolder.open(objFolder.READ_WRITE)>
  785.             <cfelse>
  786.                 <cfset objFolder.open(objFolder.READ_ONLY)>
  787.             </cfif>
  788.             <cfcatch type="any">
  789.                 <!--- folder cannot be opened --->
  790.             </cfcatch>
  791.         </cftry>
  792.         <cfreturn objFolder>
  793.     </cffunction>
  794.  
  795.     <cffunction name="GetMessages" access="private" output="No" returnType="array"
  796.        hint="Retrieves messages from a folder, given a folder object and an optional comma separated list of message numbers.">
  797.         <cfargument name="objFolder" required="Yes" type="any">
  798.         <cfargument name="messageNumber" required="no" default="">
  799.         <cfargument name="startMessageNumber" default="1" type="numeric">
  800.         <cfargument name="messageCount" default="0" type="numeric">
  801.  
  802.         <cfset var Messages = ArrayNew(1)>
  803.         <cftry>
  804.                    
  805.             <cfif ListLen(arguments.messageNumber) gt 0>
  806.                 <cfset Messages = arguments.objFolder.getMessages(ListToArray(arguments.messageNumber))>
  807.             <cfelseif val(arguments.messageCount) neq 0>
  808.                             <cftry>
  809.                 <cfset Messages = arguments.objFolder.getMessages(javacast("int",arguments.startMessageNumber),javacast("int",arguments.messageCount))>
  810.                                 <cfcatch>
  811.                     <!--- <cfset Messages = arguments.objFolder.getMessages(javacast("int",arguments.startMessageNumber),(arguments.objFolder.getMessageCount()-arguments.startMessageNumber))> --->
  812.                     <cfset Messages = arguments.objFolder.getMessages()>
  813.                                 </cfcatch>
  814.                             </cftry>
  815.             <cfelse>
  816.                 <cfset Messages = arguments.objFolder.getMessages()>
  817.             </cfif>
  818.             <cfcatch type="any">
  819.                 <!--- folder probably isn't allowed to cotnain messages --->
  820.             </cfcatch>
  821.         </cftry>
  822.         <!--- array of javax.mail.Message --->
  823.         <cfreturn Messages>
  824.     </cffunction>
  825.  
  826.     <cffunction name="GetMessagesByRange" access="private" output="No" returnType="array"
  827.        hint="Retrieves range of messages from a folder, given a folder object and range.">
  828.         <cfargument name="objFolder" required="Yes" type="any">
  829.         <cfargument name="messageNumber" required="no" default="">
  830.  
  831.         <cfset var Messages = ArrayNew(1)>
  832.         <cftry>
  833.            <cfset Messages = arguments.objFolder.getMessages(javacast("int",arguments.startMessageNumber),javacast("int",arguments.messageCount))>
  834.             <cfcatch type="any">
  835.                 <!--- folder probably isn't allowed to cotnain messages --->
  836.             </cfcatch>
  837.         </cftry>
  838.         <!--- array of javax.mail.Message --->
  839.         <cfreturn Messages>
  840.     </cffunction>
  841.  
  842.     <cffunction name="getFolderStructure" access="private" output="Yes" returntype="query"
  843.        hint="Recursive method for returning the structure of a folder (including all subfolders).">
  844.         <cfargument name="objFolder" required="Yes" type="any">
  845.         <cfargument name="folder" required="yes" type="string">
  846.         <cfargument name="list" required="yes" type="query">
  847.         <cfargument name="level" required="Yes" type="numeric">
  848.         <cfargument name="stack" required="no" type="array" default="#ArrayNew(1)#">
  849.        
  850.         <cfset var Folders = "">
  851.         <cfset var i = "">
  852.         <cfset var path = "">
  853.         <cfset var msgcount = 0>
  854.         <cfset var newmsgcount = 0>
  855.         <cfset var unreadmsgcount = 0>
  856.        
  857.         <cfset variables.sortOrder = variables.sortOrder + 1>
  858.         <cfif len(arguments.folder)>
  859.             <!--- use the folder name to get the folder object --->
  860.             <cfset arguments.objFolder = arguments.objFolder.getFolder(arguments.folder)>
  861.         </cfif>
  862.                 <cfset request.debug(arguments.objFolder.getFullname())>
  863.                 <cfset request.debug(arguments.objFolder.getType())>
  864.                 <cfset request.debug(arguments.objFolder)>
  865.                 <cfif NOT arguments.objFolder.exists()>
  866.                     <cfthrow type="cfjavamail.folder.not.there" message="the folder: #arguments.objFolder.getName()# does not exist!" detail="the folder: #arguments.objFolder.getName()# does not exist!">
  867.                 </cfif>
  868.                 <cfif lcase(left(session.protocol,3)) eq "pop">
  869.                     <!--- POP apparently only has one folder, the INBOX --->
  870.                     <cfset queryAddRow(arguments.list)>
  871.                     <cfset querySetCell(arguments.list, "foldername", arguments.objFolder.getName())>
  872.                     <cfset querySetCell(arguments.list, "foldertype", arguments.objFolder.getType())>
  873.                     <cfset querySetCell(arguments.list, "parent", path & arguments.objFolder.getParent().getName())>
  874.                     <cfset querySetCell(arguments.list, "folderlevel", arguments.level)>
  875.                     <cfset querySetCell(arguments.list, "sortorder", variables.sortorder)>
  876.                     <cfreturn arguments.list />
  877.                 <cfelse>
  878.             <cfset Folders = arguments.objFolder.list() />
  879.                 </cfif>
  880.         <cfloop from="1" to="#ArrayLen(Folders)#" step="1" index="i">
  881.             <cftry>
  882.                 <cfset path = arraytolist(arguments.stack, ".")>
  883.                 <cfif len(path)>
  884.                     <cfset path = path & ".">
  885.                 </cfif>
  886.                 <cfset queryAddRow(arguments.list)>
  887.                 <cfset querySetCell(arguments.list, "foldername", Folders[i].getName())>
  888.                 <cfset querySetCell(arguments.list, "foldertype", Folders[i].getType())>
  889.                 <cfset querySetCell(arguments.list, "parent", path & Folders[i].getParent().getName())>
  890.                 <cfset querySetCell(arguments.list, "folderlevel", arguments.level)>
  891.                 <cfset querySetCell(arguments.list, "sortorder", variables.sortorder)>
  892.                 <cfif Folders[i].getType() eq Folders[i].HOLDS_FOLDERS>
  893.                     <!--- folder doesn't contain messages --->
  894.                     <cfset querySetCell(arguments.list, "msgcount", 0)>
  895.                     <cfset querySetCell(arguments.list, "newmsgcount", 0)>
  896.                     <cfset querySetCell(arguments.list, "unreadmsgcount", 0)>
  897.                 <cfelse>
  898.                     <cftry>
  899.                         <cfset msgcount = Folders[i].getMessageCount()>
  900.                         <cfcatch type="any"><cfset msgcount = 0></cfcatch>
  901.                     </cftry>
  902.                     <cfset querySetCell(arguments.list, "msgcount", msgcount)>
  903.                     <cfif msgcount lte 0>
  904.                         <!--- if there are no messages, there won't be any
  905.                            new or unread messages --->
  906.                         <cfset querySetCell(arguments.list, "newmsgcount", 0)>
  907.                         <cfset querySetCell(arguments.list, "unreadmsgcount", 0)>
  908.                     <cfelse>
  909.                         <cftry>
  910.                             <cfset newmsgcount = Folders[i].getNewMessageCount()>
  911.                             <cfcatch type="any"><cfset newmsgcount = 0></cfcatch>
  912.                         </cftry>
  913.                         <cfset querySetCell(arguments.list, "msgcount", newmsgcount)>
  914.                         <cftry>
  915.                             <cfset unreadmsgcount = Folders[i].getUnreadMessageCount()>
  916.                             <cfcatch type="any"><cfset unreadmsgcount = 0></cfcatch>
  917.                         </cftry>
  918.                         <cfset querySetCell(arguments.list, "msgcount", unreadmsgcount)>
  919.                     </cfif>
  920.                 </cfif>
  921.                 <cfcatch></cfcatch>
  922.             </cftry>
  923.             <cfset arguments.stack = push(arguments.stack, Folders[i].getParent().getName())>
  924.             <cfset arguments.list = getFolderStructure(objFolder, Folders[i].getName(), arguments.list, arguments.level + 1, arguments.stack)>
  925.             <cfset Folders = arguments.objFolder.list()>
  926.             <cfset arguments.stack = pop(arguments.stack)>
  927.         </cfloop>
  928.         <cfreturn arguments.list>
  929.     </cffunction>
  930.    
  931.     <cffunction name="setFlag" access="private" output="No"
  932.        hint="Set an IMAP flag for a specific message or range of messages within the specified folder.">
  933.         <cfargument name="objFolder" required="Yes" type="string">
  934.         <cfargument name="messageNumber" required="Yes" type="string">
  935.         <cfargument name="flag" required="Yes" type="string">
  936.         <cfargument name="value" required="Yes" type="boolean">
  937.  
  938.         <cfset var Messages = GetMessages(arguments.objFolder, arguments.messageNumber)>
  939.         <cfset var flags = CreateObject("Java", "javax.mail.Flags$Flag")>
  940.         <cfset var i = 0>
  941.         <cfset var objMessage = "">
  942.        
  943.         <cfloop from="1" to="#arrayLen(Messages)#" step="1" index="i">
  944.             <cfset objMessage = Messages[i]>
  945.             <cfset objMessage.setFlag(flags[flag], value)>
  946.         </cfloop>
  947.         <cfreturn true>
  948.     </cffunction>
  949.  
  950.     <cffunction name="getParts" access="private" output="false" returnType="struct"
  951.        hint="Get the parts of a message.">
  952.         <cfargument name="objMultipart" type="any" required="yes">
  953.  
  954.         <cfset var retVal = structNew()>    
  955.         <cfset var messageParts = objMultipart.getContent()>
  956.         <cfset var i = 0>
  957.         <cfset var j = 0>
  958.         <cfset var partIndex = 0>
  959.         <cfset var thisPart = "">
  960.         <cfset var disposition = "">
  961.         <cfset var contentType = "">
  962.         <cfset var fo = "">
  963.         <cfset var fso = "">
  964.         <cfset var in = "">
  965.         <cfset var tempFile = "">
  966.        
  967.         <cfset retVal.parts = ArrayNew(2)>
  968.         <cfset retVal.attachments = "">
  969.        
  970.  
  971.         <!--- get all the parts and put it into an array --->
  972.         <!--- [1] = content, [2] = type --->
  973.         <!--- type, 1=text, 2=html, 3=attachment --->
  974.         <cfloop from="0" to="#messageParts.getCount() - 1#" index="i">
  975.             <cfset partIndex = arraylen(retVal.parts) + 1>
  976.             <cfset thisPart = messageParts.getBodyPart(javacast("int", i))>
  977.             <!--- show all attachments as such --->
  978.             <cfif len(thisPart.getFileName())>
  979.                 <cfset retVal.attachments = listappend(retVal.attachments, thisPart.getFileName(),chr(1))>
  980.             </cfif>
  981.  
  982.             <cfif thisPart.isMimeType("multipart/*")>
  983.                 <cfset recurseResults = getParts(thisPart)>
  984.                 <cfset retVal.parts = push(retVal.parts, recurseResults.parts)>
  985.                 <cfset retVal.attachments = listAppend(retVal.attachments, recurseResults.attachments,chr(1))>
  986.             <cfelse>
  987.                 <cfset disposition = thisPart.getDisposition()>
  988.                 <cfif not isdefined("disposition")> <!--- is javacast("null", "")> --->
  989.                     <cfset contentType = thisPart.getContentType().toString()>
  990.                     <cfif findNoCase("text/plain",contentType) is 1>
  991.                         <cfset retVal.parts[partIndex][1] = thisPart.getContent()>
  992.                         <cfset retVal.parts[partIndex][2] = "1">
  993.                     <cfelseif findNoCase("text/html",contentType) is 1>
  994.                         <!--- This shouldnt happen, at least i dont think --->
  995.                         <!--- note, this should never happen because disposition WILL be defined for HTML parts --->
  996.                         <cfset retVal.parts[partIndex][1] = thisPart.getContent()>
  997.                         <cfset retVal.parts[partIndex][2] = "2">
  998.                     <cfelse>
  999.                         <!--- <cfdump var="other">
  1000.                        <cfset retVal.parts[i + 1][1] = "Other Content Type:" & contentType.toString() & "<br>" & part.getContent()>
  1001.                        <cfset retVal.parts[i + 1][2] = "3"> --->
  1002.                         <cfset fo = createObject("Java", "java.io.File")>
  1003.                         <cfset fso = createObject("Java", "java.io.FileOutputStream")>
  1004.                         <cfset in = thisPart.getInputStream()>
  1005.                         <cfset tempFile = getTempDirectory() & session.SessionID>
  1006.                         <cfset fo.init(tempFile)>
  1007.                         <cfset fso.init(fo)>
  1008.                         <cfset j = in.read(variables.byteArray)>
  1009.                         <cfloop condition="not(j is -1)">
  1010.                             <cfset fso.write(variables.byteArray, 0, j)>
  1011.                             <cfset j = in.read(variables.byteArray)>
  1012.                         </cfloop>
  1013.                         <cfset fso.close()>
  1014.  
  1015.                         <cffile action="READ" file="#tempFile#" variable="fileContents">
  1016.                         <cffile action="DELETE" file="#tempFile#">
  1017.                         <cfif findnocase("text/html", fileContents)>
  1018.                             <cfset theText = right(fileContents, len(fileContents) - refindnocase("\r\n\r\n", fileContents, findnocase("text/html", fileContents)))>
  1019.                             <cfif refind("--+=\S+--", theText)>
  1020.                                 <cfset theText = left(theText, refind("--+=\S+--", theText) -1)>
  1021.                             </cfif>
  1022.                             <cfset retVal.parts[partIndex][1] = theText> <!--- replace(theText, "=20#chr(13)#", "~", "ALL")> --->
  1023.                             <cfset retVal.parts[partIndex][2] = "2">
  1024.                         <cfelse>
  1025.                             <cfset retVal.parts[partIndex][1] = fileContents>
  1026.                             <cfset retVal.parts[partIndex][2] = "3">
  1027.                             <!--- <cfdump var="#thisPart.getContentType()#  name='#thisPart.getFileName()#' #fileContents#"> --->
  1028.                         </cfif>
  1029.                     </cfif>
  1030.                 <cfelseif variables.showTextHtmlAttachmentsInline>
  1031.                     <!---
  1032.                        inline attachments... we already put the filename in
  1033.                        the attachments list above, if there was one.  The
  1034.                        purpose of this section is to put inline text and HTML
  1035.                        attachments INLINE.  I'm personally against this, so
  1036.                        I added a "show text and html attachments inline" option.
  1037.                    --->
  1038.                     <cfif disposition.equalsIgnoreCase(thisPart.INLINE)>
  1039.                         <cfset contentType = thisPart.getContentType().toString()>
  1040.                         <cfif findNoCase("text/plain",contentType)>
  1041.                             <cfset retVal.parts[partIndex][1] = thisPart.getContent()>
  1042.                             <cfset retVal.parts[partIndex][2] = "1">
  1043.                         <cfelseif findNoCase("text/html",contentType)>
  1044.                             <!--- This shouldnt happen, at least i dont think --->
  1045.                             <cfset retVal.parts[partIndex][1] = thisPart.getContent()>
  1046.                             <cfset retVal.parts[partIndex][2] = "2">
  1047.                         <cfelse>
  1048.                             <!--- can't do inline attachments right now --->
  1049.                         </cfif>
  1050.                     <cfelse>
  1051.                         <!--- <cfset body = body & "<p>Other: " & disposition & "</p>"> --->
  1052.                     </cfif>
  1053.                 <cfelse>
  1054.                     <!---
  1055.                        disposition is set, so it's an attachment,
  1056.                        but we're not putting *ANY* attachments inline
  1057.                        so don't do anything here
  1058.                    --->
  1059.                 </cfif>
  1060.             </cfif>
  1061.         </cfloop>
  1062.         <cfreturn retVal>
  1063.     </cffunction>
  1064.  
  1065.     <cffunction name="push" access="private" output="yes"
  1066.        hint="Add a new item to the end of an array.">
  1067.         <cfargument name="stack" type="array" required="yes">
  1068.         <cfargument name="value" required="Yes" type="any">
  1069.  
  1070.         <cfset var retVal = arguments.stack>
  1071.         <cfset var i = 1>
  1072.        
  1073.         <cfif isArray(arguments.value)>
  1074.             <cfloop from="1" to="#arrayLen(arguments.value)#" step="1" index="i">
  1075.                 <cfset arrayAppend(retVal, arguments.value[i])>
  1076.             </cfloop>
  1077.             <cfreturn retVal>
  1078.         <cfelse>
  1079.             <cfset arrayAppend(retVal, arguments.value)>
  1080.             <cfreturn retVal>
  1081.         </cfif>
  1082.     </cffunction>
  1083.  
  1084.     <cffunction name="pop" access="private" output="yes"
  1085.        hint="Remove the last item from an array.">
  1086.         <cfargument name="stack" type="array" required="yes">
  1087.  
  1088.         <cfset var retVal = stack>
  1089.        
  1090.         <cfif arraylen(retVal) gt 0>
  1091.             <cfset arraydeleteat(retVal, arraylen(retVal))>
  1092.         </cfif>
  1093.         <cfreturn retVal>
  1094.     </cffunction>
  1095.  
  1096. </cfcomponent>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement