This script is designed to clean out the OutlookSecureTempFolder which can cause issues for users trying to launch or save files if this folder already has files with the same name saved there, and/or the folder is filling up. Currently this affects both Microsoft Outlook 2003 and 2007 and there does not appear to be a fix from Microsoft for it yet.
I have supplied links to some MS KB articles that discuss it further.

Deleting these temporary files corrects the issue.


; Error message when you try to open or save an e-mail attachment in Outlook: "Cannot create file" 
; http://support.microsoft.com/kb/305982
; Attachments remain in the Outlook Secure Temporary File folder when you exit Outlook 2003 or Outlook 2007
; http://support.microsoft.com/kb/817878
; OL2000: Attachment Temporary Files Always Stored in Same Location
; http://support.microsoft.com/kb/249793
; OL2000: Error Message Appears When You Open a Word Template That Is in an Outlook Store
; http://support.microsoft.com/kb/296416
; Error message when you try to track an HTML-formatted e-mail message that contains an image in the signature
; in Microsoft Dynamics CRM 3.0: "An error occurred promoting this item to Microsoft CRM"
; http://support.microsoft.com/kb/933234

;*** REQUIRES the following UDF scripts to function correctly.
;*** ClearOutlookTemp (not published but posted here in this script)
;*** CleanDirectory http://www.kixtart.org/forums/ubbthreads.php?ubb=showflat&Number=82624
;*** FullFile http://www.kixtart.org/forums/ubbthreads.php?ubb=showflat&Number=82207
;*** DateMath http://www.scriptlogic.com/kixtart/FunctionLibrary_ViewFunction.aspx?ID=DateMath
;*** SerialDate http://www.scriptlogic.com/kixtart/FunctionLibrary_ViewFunction.aspx?ID=SerialDate

;NOTE: This script was only tested with KiXtart 4.53 it may work with 4.60 but I have not tested it.

;Set environment variables
If Not @LogonMode
Break On
Else
Break Off
EndIf
Dim $SO
$SO=SetOption('Explicit','On')
$SO=SetOption('NoVarsInStrings','On')
$SO=SetOption('NoMacrosInStrings','On')
$SO=SetOption('WrapAtEOL','On')

;Declare the base registry key and a temp var to suppress values returned to the screen
Dim $BaseKey, $RC
;Set the temp folder location as a global to be available to all scripts
Global $OLTempFolder

$BaseKey = 'HKEY_CURRENT_USER\Software\Microsoft\Office\'

;Depending on what Office version is installed we check the key and location and then
;based upon the returned data we then delete the files based on how many days old they are
;Setting the file delete to 1 or 2 days should be sufficient for most users.
Select
Case KeyExist($BaseKey+'12.0\Outlook\Security')
$OLTempFolder = ReadValue($BaseKey+'12.0\Outlook\Security','OutlookSecureTempFolder')
$RC = ClearOutlookTemp(3)
Case KeyExist($BaseKey+'11.0\Outlook\Security')
$OLTempFolder = ReadValue($BaseKey+'11.0\Outlook\Security','OutlookSecureTempFolder')
$RC = ClearOutlookTemp(3)
Case KeyExist($BaseKey+'10.0\Outlook\Security')
$OLTempFolder = ReadValue($BaseKey+'10.0\Outlook\Security','OutlookSecureTempFolder')
$RC = ClearOutlookTemp(3)
Case KeyExist($BaseKey+'9.0\Outlook\Security')
$OLTempFolder = ReadValue($BaseKey+'9.0\Outlook\Security','OutlookSecureTempFolder')
$RC = ClearOutlookTemp(3)
Case 1
;Unable to locate the folder path so exit the script and set error to 3
$OLTempFolder = ""
Exit 3
EndSelect


;*** REQUIRED UDF SCRIPTS - DO NOT MODIFY THESE SCRIPTS BELOW
;*** These UDF scripts are copied here for ease of scripting only
;*** You may want to verify that you have the latest versions of these UDF scripts
;*** However they have been tested on Server 2003, XP, and Terminal Server 2003 and the script
;*** currently works with the these UDF scripts below.

Function ClearOutlookTemp($Days)
Dim $RC
;The $Days value determines how many days old the file must be before it is deleted
;Checks to ensure that the location of the temporary Outlook files is at least 12 characters
;If you have modified the folder location and it is less, then set the length check to that value
;It is there as a safeguard to prevent deleting files from the root down if the var was blank
If Len($OLTempFolder) >12
$RC = CleanDirectory($OLTempFolder,'*.*',$Days)
EndIf
EndFunction

Function CleanDirectory($directories, $filter, optional $olderas, optional $countonly)
Dim $rc, $timediff, $filename, $filefilter, $tempdir
Dim $filecount, $dircount
$dircount=0
$filecount=0
$olderas=IIf(Val($olderas)>0,Val($olderas),0)
$countonly=IIf(Val($countonly),1,0)
If Not (VarType($directories) & 8192)
$directories=Split($directories,'')
EndIf
If Not (VarType($filter) & 8192)
$filter=IIf(Trim($filter),$filter,'*.*')
$filter=Split($filter,'')
EndIf
For Each $tempdir In $directories
If $tempdir<>'' And Exist($tempdir)
For Each $filefilter In $filter
If $filefilter<>''
$filefilter=fullfile($tempdir,$filefilter)
$filename=Dir($filefilter,1)
While $filename<>'' And @ERROR = 0
If $filename<>'.' And $filename<>'..'
$filename=fullfile($tempdir,$filename)
If GetFileAttr($filename) & 16
$rc=cleandirectory($filename,$filter,$olderas,$countonly)
If InStr($rc,',')
$rc=Split($rc,',')
$dircount=$dircount+$rc[0]
$filecount=$filecount+$rc[1]
EndIf
$rc=SetFileAttr($filename,128)
If Not $countonly
RD $filename
If Not @ERROR
$dircount=$dircount+1
EndIf
EndIf
Else
$timediff=datemath(@DATE,Left(GetFileTime($filename),10))
If $timediff>=$olderas
If $countonly
$filecount=$filecount+1
Else
$rc=SetFileAttr($filename,128)
Del $filename /c /f /h
If Not @ERROR
$filecount=$filecount+1
EndIf
EndIf
EndIf
EndIf
EndIf
$filename=Dir('',1)
Loop
EndIf
Next
EndIf
Next
$cleandirectory=''+$dircount+','+$filecount
EndFunction

Function FullFile($path1, optional $path2)
Dim $a, $path3
$a=UBound($path1)
if $a>0
$path3=$path1[$a]
ReDim Preserve $path1[$a-1]
$path1=fullfile($path1,$path3)
EndIf
If UBound($path1)=0
$path1=$path1[0]
EndIf
If Right($path1,1)='\'
$path1=Left($path1,Len($path1)-1)
EndIf
If $path2
If Left($path2,1)='\'
$path2=Right($path2,Len($path2)-1)
EndIf
$fullfile=LCase($path1+'\'+$path2)
Else
$fullfile=$path1
EndIf
EndFunction

Function DateMath($ExpD1,$ExpD2)
Select
Case InStr($ExpD1,'/') And InStr($ExpD2,'/')
; two date passed - return daysbetween integer
$DateMath=SerialDate($ExpD1)-SerialDate($ExpD2)
If $DateMath<0
$DateMath=$DateMath*-1
EndIf
Case InStr($ExpD1,'/') and 1-InStr($ExpD2,'/')
; date and a number passed - return date
$ExpD2=0+$ExpD2
$Datemath=SerialDate(SerialDate($ExpD1)+$ExpD2)
Case 1 ; incorrect parameters passed
EndSelect
EndFunction

Function SerialDate($ExpD)
Dim $z,$h,$a,$b,$c,$y,$m,$d
If InStr($ExpD,'/') ; date passed
$y=Val(SubStr($ExpD,1,4))
$m=Val(SubStr($ExpD,6,2))
$d=Val(SubStr($ExpD,9,2))
If $m<3
$m=$m+12
$y=$y-1
EndIf
; return an integer
$SerialDate=$d+(153*$m-457)/5+365*$y+$y/4-$y/100+$y/400-306
Else ; integer passed
$z=0+$ExpD+306 ; cast numeric
$h=100*$z-25
$a=$h/3652425
$b=$a-$a/4
$y=(100*$b+$h)/36525
$c=$b+$z-365*$y-$y/4
$m=(5*$c+456)/153
$d=$c-(153*$m-457)/5
If $m>12
$y=$y+1
$m=$m-12
EndIf
$m=Right('0'+$m,2)
$d=Right('0'+$d,2)
; return a string date
$SerialDate=''+$y+'/'+$m+'/'+$d
EndIf
EndFunction


.