Search code examples
coldfusioncfmlcoldfusion-2016

CFMail attachment filename broken in ColdFusion 2016 on Windows server


I'm moving a site from CF10 on Linux to CF2016 on Windows, and have run into an issue with file attachments with cfmail.

I'm attaching the file in cfmail with;

<cfmailparam file="#FileName#">

and have also tried variations with and without disposition and type like:

<cfmailparam file="#FileName#" disposition="attachment; 
         filename=""#FileName#""" 
         type="#ContentType#/#ContentSubType#">

But no matter what, on CF2016 on Windows, my attachments names in Outlook come through as ATT00160.dat (without type set) or ATT00169.xlsx (with type set)

It seems filenames over a certain length cause the issue. A filename of 64 characters will break it, but a smaller filename, of say 49 characters, won't.

Viewing the message source in Outlook, from the cfmail sent from Windows, I see the value below. Notice under content-type the name has been split?

Content-Type: application/octet-stream; 
    name*0=BLAH_BLAH1_Ownership_Database_Issue_2018-01_In_Development2.; 
    name*1=xlsx
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename*0=BLAH_BLAH1_Ownership_Database_Is;
 filename*1=sue_2018-01_In_Development2.xlsx

The same attachment sent with cfmail, from Linux, gives me:

Content-Type: application/octet-stream; 
    name=BLAH_BLAH1_Ownership_Database_Issue_2018-01_In_Development2.xlsx
Content-Transfer-Encoding: base64
Content-Disposition: attachment;
 filename*0=BLAH_BLAH1_Ownership_Database_Is;
 filename*1=sue_2018-01_In_Development2.xlsx

Note the content-type name has not been split.

Anyone have any ideas on how to fix this issue?


Solution

  • So, I finally sorted it. You need to manually put the file name in the type:

    <cfmailparam file="#FileName#" 
          type="#ContentType#/#ContentSubType#;name=""#FileName#""">
    

    I've never needed to do that previously. I don't know if this is a Windows server, CF2016 or SmarterMail (our mail server) thing, but if you run into the same issue, the above worked for me.