Alex-Yablonsky/frappe-contact-form

GitHub: Alex-Yablonsky/frappe-contact-form

一款基于 Frappe Framework 的轻量级 SMTP 联系表单应用,默认不创建 CRM 记录,内置验证码与多层反垃圾保护,适合需要简洁公开联系入口的站点。

Stars: 0 | Forks: 0

# Frappe Contact Form App **Frappe Contact Form App** 是一个轻量级的、仅基于 SMTP 的联系表单应用,专为 Frappe Framework 设计。 当前版本:**v1.0.3** 由 [Yablonsky.io](https://yablonsky.io/) 开发和维护。 它提供了一个可嵌入的公开联系表单,通过 Frappe 的传出邮件系统以电子邮件形式发送消息,默认情况下不会创建 CRM 线索、Web Form 提交记录、Communications,也不会将邮件正文存储在数据库中。 ## 为什么开发这款应用 Frappe 拥有强大的 Web Forms 和 CRM 表单,但对于一个简单的公开联系表单来说,它们通常显得过于笨重。 对于许多网站来说,联系表单只需要做一件事: 这款应用通过将简单的联系表单与 CRM 工作流分离开来,解决了这个问题。 在以下情况使用它: * 用于 Frappe 网站的公开联系表单; * 仅使用 SMTP 进行消息发送; * 默认不创建 CRM Lead; * 默认不存储 Web Form 提交记录; * 在服务端配置内部收件人电子邮件; * 支持一个或多个内部收件人电子邮件地址; * 基于访问者提交的电子邮件实现回复行为; * 可选择向发件人发送确认副本; * 支持 Cloudflare Turnstile; * 支持 Google reCAPTCHA v2; * 支持 Google reCAPTCHA v3; * 支持速率限制和蜜罐保护; * 一个可重复使用、可嵌入,并且可由各个网站自定义样式的表单。 ## 主要功能 ### 仅基于 SMTP 的联系表单 消息通过 `frappe.sendmail()` 并使用 Frappe 配置的传出邮件系统发送。 收件人电子邮件在 **Frappe Contact Form Settings** 中于服务端进行配置,绝不接受来自前端请求的收件人。 ### 默认不进行 CRM 提交 该应用默认不会创建 CRM Lead、Web Form 提交记录、Communications 或其他 CRM 记录。 这使得联系表单与业务工作流保持分离,除非站点所有者以后明确构建额外的逻辑。 ### 多个内部收件人 **Recipient Email(s)** 设置可以包含一个或多个内部收件人电子邮件地址。 支持的分割符: * 逗号; * 分号; * 换行符。 示例: ``` admin@example.com, sales@example.com ``` 或者: ``` admin@example.com sales@example.com support@example.com ``` ### 发送给发件人的副本 该应用可以向表单中提交的电子邮件地址发送确认副本。 这非常有用,因为: * 网站所有者收到了咨询; * 访问者收到了他们提交内容的副本; * 访问者可以准确记住他们询问了什么; * 回复路径保持清晰。 内部收件人电子邮件使用: ``` Reply-To: visitor email submitted in the form ``` 发件人副本电子邮件使用: ``` Reply-To: first configured internal recipient email ``` ### CAPTCHA 提供商选择 该应用一次仅支持一个选定的 CAPTCHA 提供商: * `None` * `Cloudflare Turnstile` * `Google reCAPTCHA v2` * `Google reCAPTCHA v3` 选定的提供商在 **Frappe Contact Form Settings** 中进行配置。 仅加载选定的前端脚本。如果 CAPTCHA Provider 为 `None`,则不会加载任何 Cloudflare 或 Google CAPTCHA 脚本。 ### 防垃圾信息保护 该应用包括: * 蜜罐保护; * 基于单个 IP 的速率限制; * 基于提交电子邮件的速率限制; * 最短提交时间验证; * 可选的 CAPTCHA 验证; * 主题和消息长度限制; * 可选的来源允许列表。 ## 要求 * Frappe Framework v16。 * 一个正常工作的 Frappe bench 和站点。 * 在 Frappe 中配置好传出邮件。 * 拥有 Desk / Admin 的访问权限以进行应用设置。 * 可选的 Cloudflare Turnstile 密钥。 * 可选的 Google reCAPTCHA v2 或 v3 密钥。 不需要外部数据库、SaaS 后端或第三方表单服务。 ## 兼容性 ### 已测试于 * Frappe Framework v16.18.x。 * 基于 Ubuntu 的生产 bench 环境。 * Frappe 网站和自定义网站页面。 ### ERPNext 兼容性 **不要求**使用 ERPNext。 该应用预计可以在运行于 Frappe Framework v16 的 ERPNext v16 站点上运行,因为它工作在 Frappe 网站/电子邮件层,且不依赖于 ERPNext 特定的 DocType 或模块。 ### Frappe Builder 兼容性 Frappe Builder 是可选的。 该表单可以嵌入到常规的 Frappe 页面、自定义 HTML 块、Builder 页面,或者任何可以添加所需 HTML 容器和脚本的页面中。 ## 安装 在你的 Frappe bench 中: ``` bench get-app frappe_contact_form https://github.com/Alex-Yablonsky/frappe-contact-form bench --site your-site.example.com install-app frappe_contact_form bench --site your-site.example.com migrate bench build --app frappe_contact_form bench --site your-site.example.com clear-cache bench --site your-site.example.com clear-website-cache ``` 如有需要,重启你的 Web 进程: ``` sudo supervisorctl restart your-bench-name-web: ``` ## 管理员访问权限 打开 Desk 并搜索: ``` Frappe Contact Form Settings ``` 直接的管理 URL 通常类似于: ``` /app/frappe-contact-form-settings ``` 或者: ``` /desk/frappe-contact-form-settings ``` 设置页面用于控制收件人、公开消息、CAPTCHA 提供商、反垃圾规则、同意文本和调试模式。 ## 配置 在 **Frappe Contact Form Settings** 中配置以下字段。 ### 常规 | 字段 | 描述 | | -------------------------- | ------------------------------------------------------------------------------------------ | | Enabled | 打开或关闭公开表单。 | | Recipient Email(s) | 一个或多个内部收件人电子邮件地址。使用逗号、分号,或每行一个邮箱。公开请求无法覆盖此值。 | | Send Copy to Sender | 向表单中提交的电子邮件地址发送确认副本。对于正常的联系表单,建议开启。 | | Sender Copy Subject Prefix | 发件人确认邮件的主题前缀。默认值:`Copy of your message`。 | | Sender Copy Intro | 发件人确认邮件中显示的介绍文本。 | | Sender Email Account | 可选的发件人电子邮件/账户。留空则使用 Frappe 默认的传出邮件。 | | Default Subject Prefix | 添加到内部收件人邮件主题中的前缀,例如 `[Contact Form]`。 | | Success Message | 提交成功后显示的公开成功消息。 | | Public Error Message | 通用的公开错误消息。 | ### 电子邮件行为 该应用将主要的联系表单消息发送到配置的内部收件人地址。 主要收件人电子邮件使用: ``` Reply-To: sender email submitted in the form ``` 当启用 **Send Copy to Sender** 时,发件人也会收到一份他们提交消息的副本。 发件人副本电子邮件使用: ``` Reply-To: first configured internal recipient email ``` 这使得网站所有者可以直接回复访问者,同时访问者也会保留一份他们提交内容的副本。 ### CAPTCHA | 字段 | 描述 | | --------------------------------- | ------------------------------------------------------------------------ | | CAPTCHA Provider | `None`、`Cloudflare Turnstile`、`Google reCAPTCHA v2` 或 `Google reCAPTCHA v3`。 | | Turnstile Site Key | 公开的 Cloudflare Turnstile 密钥。 | | Turnstile Secret Key | 私有的 Cloudflare Turnstile 密钥。 | | Google reCAPTCHA Site Key | 公开的 Google reCAPTCHA 密钥。 | | Google reCAPTCHA Secret Key | 私有的 Google reCAPTCHA 密钥。 | | Google reCAPTCHA v3 Minimum Score | 可接受的最低 v3 分数。默认值:`0.5`。 | | Google reCAPTCHA v3 Action | 预期的 v3 action 名称。默认值:`contact_form`。 | ### 防垃圾信息 | 字段 | 描述 | | ------------------------------- | ---------------------------------- | | Honeypot Enabled | 为机器人启用隐藏的陷阱字段。 | | Rate Limit Enabled | 启用速率限制检查。 | | Rate Limit per IP per Hour | 默认值:`5` 或你偏好的值。 | | Rate Limit per Email per Hour | 默认值:`3` 或你偏好的值。 | | Minimum Submit Time Seconds | 阻止提交速度过快的不真实请求。 | | Max Subject Length | 默认值:`160`。 | | Max Message Length | 默认值:`5000`。 | | Allowed Origins | 可选的允许列表,每行一个来源。 | ### 隐私 | 字段 | 描述 | | ----------------- | ---------------------------------------- | | Store Submissions | 预留给未来使用。默认应保持关闭。 | | Consent Required | 提交前需要勾选同意复选框。 | | Consent Label | 公开的同意文本。 | ### 调试 | 字段 | 描述 | | ---------- | ------------------------------------------------- | | Debug Mode | 在测试期间显示更具体的公开错误。在生产环境中请关闭。 | ## 获取 CAPTCHA 密钥 ### Cloudflare Turnstile 在 Cloudflare 中创建一个 Turnstile 小部件。 推荐的基本设置: * Widget Mode:`Managed` * Hostname:你的公开站点域名 * Pre-clearance:关闭,除非你有意使用需要它的 Cloudflare 安全规则 将生成的值复制到 **Frappe Contact Form Settings** 中: * Turnstile Site Key * Turnstile Secret Key 选择: ``` CAPTCHA Provider: Cloudflare Turnstile ``` ### Google reCAPTCHA v2 或 v3 在 Google reCAPTCHA / Google Cloud reCAPTCHA 中创建网站密钥并复制: * Site Key * Secret Key 然后选择以下之一: ``` Google reCAPTCHA v2 Google reCAPTCHA v3 ``` 对于 v3,还需要配置: ``` Google reCAPTCHA v3 Minimum Score Google reCAPTCHA v3 Action ``` 默认的 v3 action: ``` contact_form ``` ## 嵌入表单 将表单容器添加到页面中: ```
``` ### 禁用产品 CSS 并使用页面/主题 CSS 该应用包含一个很小的默认 CSS 文件,但网站可以使用自己的页面或主题 CSS 来代替。 ```
``` 当该应用作为一个干净的可重用组件,并且最终的视觉样式应来自网站主题时,这非常有用。 ## 前端标签 标签可以通过 data 属性进行自定义:
标签:CAPTCHA, Frappe框架, SMTP, Syscall, Web开发, 多模态安全, 数据可视化, 联系表单, 逆向工具, 防滥用