You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在WordPress的Contact Form7插件邮件中集成ICS文件链接

实现Contact Form7表单生成ICS日历链接并嵌入邮件

核心实现思路

  • 利用Contact Form7的wpcf7_before_send_mail钩子,在邮件发送前处理表单提交数据
  • 通过ICS类生成符合iCalendar标准的事件内容
  • 将ICS文件保存到服务器可公开访问的目录,生成有效链接
  • 将链接插入邮件内容,随表单邮件发送至收件箱

修正并完善后的代码

// 生成ICS文件的工具类
class ICS {
    private $data;
    private $name;

    // 构造函数:接收事件时间、标题、描述、地点参数
    public function __construct($start, $end, $name, $description, $location) {
        $this->name = sanitize_file_name($name);
        // 生成唯一UID,避免日历应用识别冲突
        $uid = uniqid('', true) . '@yourdomain.com';
        
        // 构造符合iCalendar标准的内容
        $this->data = "BEGIN:VCALENDAR
VERSION:2.0
METHOD:PUBLISH
BEGIN:VEVENT
DTSTART:" . date("Ymd\THis\Z", strtotime($start)) . "
DTEND:" . date("Ymd\THis\Z", strtotime($end)) . "
LOCATION:" . htmlspecialchars($location) . "
TRANSP:OPAQUE
SEQUENCE:0
UID:" . $uid . "
DTSTAMP:" . date("Ymd\THis\Z") . "
SUMMARY:" . htmlspecialchars($name) . "
DESCRIPTION:" . htmlspecialchars($description) . "
PRIORITY:1
CLASS:PUBLIC
BEGIN:VALARM
TRIGGER:-PT10080M
ACTION:DISPLAY
DESCRIPTION:Reminder
END:VALARM
END:VEVENT
END:VCALENDAR";
    }

    // 将ICS内容保存到服务器可访问目录并返回公开链接
    public function save() {
        // 定义存储目录:WordPress上传目录下的ics-events子文件夹
        $upload_dir = wp_upload_dir();
        $ics_dir = $upload_dir['basedir'] . '/ics-events';
        
        // 目录不存在则创建
        if (!file_exists($ics_dir)) {
            mkdir($ics_dir, 0755, true);
        }
        
        // 生成唯一文件名,避免重复覆盖
        $file_path = $ics_dir . '/' . $this->name . '-' . uniqid() . '.ics';
        file_put_contents($file_path, $this->data);
        
        // 转换为可访问的URL
        return str_replace($upload_dir['basedir'], $upload_dir['baseurl'], $file_path);
    }

    // 返回ICS原始内容
    public function show() {
        return $this->data;
    }
}

// 挂钩Contact Form7邮件发送前的处理事件
add_action('wpcf7_before_send_mail', 'cf7_generate_ics_link_and_add_to_email');

function cf7_generate_ics_link_and_add_to_email($wpcf7) {
    // 获取表单提交实例
    $submission = WPCF7_Submission::get_instance();
    if (!$submission) return;

    $posted_data = $submission->get_posted_data();

    // 从表单数据中提取字段(请根据你的CF7表单实际字段名修改)
    $start_date = isset($posted_data['start-date']) ? $posted_data['start-date'] : '';
    $end_date = isset($posted_data['end-date']) ? $posted_data['end-date'] : '';
    $event_name = isset($posted_data['event-name']) ? $posted_data['event-name'] : '未命名事件';
    $event_desc = isset($posted_data['event-description']) ? $posted_data['event-description'] : '';
    $event_location = isset($posted_data['event-location']) ? $posted_data['event-location'] : '';

    // 验证必要字段是否完整
    if (empty($start_date) || empty($end_date)) return;

    // 生成ICS文件并获取公开链接
    $ics_event = new ICS($start_date, $end_date, $event_name, $event_desc, $event_location);
    $ics_link = $ics_event->save();

    // 获取并修改邮件内容
    $mail = $wpcf7->prop('mail');
    // 在邮件末尾添加ICS链接(也可替换自定义邮件标签,比如[ics-link])
    $mail['body'] .= "\n\n---\n添加到日历:<a href='$ics_link'>点击下载ICS文件</a>";

    // 更新邮件内容
    $wpcf7->set_prop('mail', $mail);
}

关键注意事项

  1. 字段名适配:请根据你的Contact Form7表单实际字段名,修改$posted_data中的键名(如start-date、event-name等)
  2. 权限配置:确保服务器对wp-content/uploads/ics-events目录有写入权限,否则无法保存ICS文件
  3. UID唯一性:代码中生成的唯一UID是为了避免日历应用识别重复事件,可根据需要修改域名后缀

内容的提问来源于stack exchange,提问作者Myuser03

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 10:02:46