使用PHPWord生成邮件附件出错:附件损坏仅1KB,求正确方案
问题分析与解决方案
你的问题出在邮件附件的参数传递错误:你传给addAttachment的第二个参数是临时文件的路径,但多数邮件库的addAttachment方法第二个参数需要的是文件的内容字符串,而非文件路径。这就导致邮件附件实际存储的是路径文本,而非Word文件内容,所以附件只有1KB且损坏。
修复步骤
- 读取生成好的Word临时文件内容
- 将文件内容作为参数传入
addAttachment
修改后的代码:
$fileName = 'file.docx'; $fileAttachment = tempnam(sys_get_temp_dir(), 'PHPWord'); $template->saveAs($fileAttachment); // 读取文件内容 $fileContent = file_get_contents($fileAttachment); // 删除临时文件(可选,避免临时文件堆积) unlink($fileAttachment); // 使用更精确的Word文档MIME类型 $contentType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document"; $notification ->setTemplate("template", $templateParams) ->setSubject($this->_('Email subject')) ->addRecipient("to", $email, $email) ->addAttachment($fileName, $fileContent, $contentType);
额外优化点
- 替换通用的
application/octet-stream为Word文档专属的MIME类型,邮件客户端能更准确识别文件类型 - 生成附件后删除临时文件,避免服务器临时目录堆积无用文件
内容的提问来源于stack exchange,提问作者AlesSvetina
相关产品推荐
相关产品推荐

