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开发, 多模态安全, 数据可视化, 联系表单, 逆向工具, 防滥用