To check if its permissions, run as the underlying java server service and attempt to manually obtain the file. In Linux it's SUDO in Windows there is RUNAS. As for the performance side, I can say there are major performance gains to be had using OS operations to mount S3 buckets as file systems. As for your code, instead of using s3/bucketname/file I would use cfcurl or cfhttp and get the file via
https://s3.yhourRegion.amazon-aws.com/yourBucketName/file and temporarily copy it to a temp filename/location then email it.