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

时间:2012-07-02 21:11:30

标签: file-upload coldfusion email-attachments cfmail

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

<input type="file" id="uploadFile" name="uploadFile" />

我使用JQuery form plugin的ajaxForm方法提交表单。

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

<cfspreadsheet 
  action="read" 
  src="#form.uploadFile#" 
  sheet="1" 
  query="spreadsheetData" 
  headerRow="1" 
  excludeHeaderRow="true"
>

这一切都正常。

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

<cfmail to="myEmailAddress@email.com" 
        from="fromEmail@email.com" 
        subject="Upload File" type="HTML">
    <cfmailparam file="#form.uploadFile#" />
    File processed successfully
</cfmail>

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

1 个答案:

答案 0 :(得分:9)

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

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

同时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

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

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