如何为Contact Form 7自动回复添加PDF附件?
解决Contact Form 7自动回复添加PDF附件的问题
看起来你在给CF7的自动回复(Mail 2)加PDF附件时踩了路径验证的坑,自定义钩子代码也没生效——我之前也碰到过类似情况,给你梳理下靠谱的解决步骤:
一、先排查Mail 2附件字段的问题
你说路径正确却提示错误,大概率是相对路径的锅:CF7的附件字段只认服务器绝对路径,不能用/wp-content/这种相对路径,也不能用网站URL。比如你应该填:/home/yourdomain/public/wp-content/uploads/2024/05/your-file.pdf
或者用WordPress常量动态生成(如果主机允许在表单字段执行PHP):<?php echo WP_CONTENT_DIR; ?>/uploads/2024/05/your-file.pdf
另外还要检查两个关键点:
- PDF文件权限:确保服务器的web用户(比如
www-data)有读取权限,权限设为644一般没问题 - 文件存在性:通过FTP或主机文件管理器确认路径和文件名完全一致(Linux服务器区分大小写,别写错字母)
二、修正自定义钩子代码(推荐用这种方式,更灵活)
你的钩子代码没生效,可能是没正确修改邮件对象,或者路径构建错误。试试这个完善后的版本:
add_action( 'wpcf7_before_send_mail', 'cf7_add_pdf_attachment_to_autoresponder' ); function cf7_add_pdf_attachment_to_autoresponder( $contact_form ) { // 只针对ID为872的表单执行 if ( $contact_form->id() !== 872 ) { return; } // 获取自动回复(Mail 2)的邮件对象 $mail = $contact_form->prop( 'mail_2' ); // 构建PDF的绝对路径(替换成你的实际文件路径) $pdf_path = WP_CONTENT_DIR . '/uploads/2024/05/your-document.pdf'; // 检查文件是否存在且可读,避免报错 if ( ! file_exists( $pdf_path ) || ! is_readable( $pdf_path ) ) { error_log( 'CF7 PDF附件错误:文件不存在或不可读 - ' . $pdf_path ); return; } // 添加附件到Mail 2 if ( empty( $mail['attachments'] ) ) { $mail['attachments'] = array( $pdf_path ); } else { // 已有附件时追加,不覆盖原有内容 $mail['attachments'][] = $pdf_path; } // 更新邮件对象,确保附件生效 $contact_form->set_prop( 'mail_2', $mail ); }
代码关键说明:
- 用
$contact_form->id()代替$cf7->id——CF7新版本里,对象方法是id()而非直接调用属性 - 用
WP_CONTENT_DIR常量构建绝对路径,避免主机环境差异导致的路径错误 - 增加了文件存在性检查和错误日志,方便后续排查问题
- 正确更新Mail 2的邮件对象,确保附件被添加到给用户的自动回复里
三、额外注意事项
- 测试时用真实邮箱接收,部分邮件服务商可能会拦截带附件的邮件,或归为垃圾邮件
- 确保WordPress和CF7都是最新版本,旧版本可能存在钩子兼容性问题
- 如果是用户上传的动态文件,逻辑会不同,但你这里是固定PDF,上面的代码完全适用
内容的提问来源于stack exchange,提问作者eMikkelsen
相关产品推荐
相关产品推荐

