为什么我不能将上传的文件附加到电子邮件中?

fro*_*die 7 coldfusion file-upload email-attachments cfmail

我有一个带有文件输入的表单:

<input type="file" id="uploadFile" name="uploadFile" />
Run Code Online (Sandbox Code Playgroud)

我使用JQuery表单插件的ajaxForm方法提交表单.

然后,在处理帖子的代码中,我读取并处理该文件.我使用cfspreadsheet直接从文件输入字段读取文件:

<cfspreadsheet 
  action="read" 
  src="#form.uploadFile#" 
  sheet="1" 
  query="spreadsheetData" 
  headerRow="1" 
  excludeHeaderRow="true"
>
Run Code Online (Sandbox Code Playgroud)

一切正常.

我决定将电子表格通过电子邮件发送给管理员.我想我可以使用包含以下cfmailparam标记的cfmail标记来完成此操作:

<cfmail to="myEmailAddress@email.com" 
        from="fromEmail@email.com" 
        subject="Upload File" type="HTML">
    <cfmailparam file="#form.uploadFile#" />
    File processed successfully
</cfmail>
Run Code Online (Sandbox Code Playgroud)

但是,这不能正常工作 - 电子邮件不会发送.我究竟做错了什么?

Mar*_*ger 9

Leigh的解决方案运行良好,您可能已经在代码中实现了.我以为我会把我的0.02美分用于解释为什么这是一个问题.

上载文件时,文件将放在临时文件夹位置.如果您不对文件执行任何操作以将其放在最终目标中,则文件将被删除 - 可能在您的请求结束时.

同时cfmailparam实际上并没有在运行时附加文件.它留给假脱机程序进程来做到这一点.如果您查看ColdFusion安装"mail/spool"目录,您将看到一个扩展名为.cfmail的文件.如果你不能在发货之前"抓住"一个检查你无法送达的文件夹 - 那里肯定会有一些闲逛.

.cfmail文件用作发送邮件的假脱机程序服务的指令.它有一个主题,从,到服务器地址,正文等.

如果附加文件,您将在此文件的底部看到如下所示的内容:

file:  D:\jrun\temp\blah.tmp
file-type:  application/octet-stream;   name="I am the file you uploaded.tmp"
file-disposition:  attachment
remove:  false
Run Code Online (Sandbox Code Playgroud)

在运行时,CF抓取此文件并执行Leigh建议的操作 - 将其作为二进制文件放置在邮件主体中的mailpart(base64编码)中.所以发生的事情是,当假脱机程序服务试图打开并附加此文件时,文件很久就消失了,因为请求已经结束.我还认为该文件在此临时目录中以".tmp"扩展名存在 - 这显然不是您想要附加的(但可能是CF的先前版本).

要修复它,首先使用带有"upload"操作的cffile将文件放在磁盘上的真实(而不是临时)文件夹中.然后使用cfmailparam附加文件.注意:设置为yes的"remove"属性将导致CF在成功发送邮件后删除该文件 - 这是我认为您正在寻找的效果.

  • 百分之二十分?你的想法比这更值得. (6认同)