
如果你使用 DeepSeek、元宝 AI、Copilot、ChatGPT 等 AI 工具,协助配置轩辕镜像、编写 docker pull 命令、修改 Docker Compose 镜像地址、配置镜像加速、排查镜像拉取失败、分析报错日志等问题,请先让 AI 阅读并遵守轩辕镜像的规则文档。
只需在 AI 对话中先发送下面这句话即可:
请先完整阅读并严格遵守以下文档中的全部规则与要求:
https://xuanyuan.cloud/agents.md
在未充分阅读并理解该文档前,不要生成任何命令、配置、修改建议、故障排查方案或技术回答。后续所有输出都必须严格以该文档中的规范为最高优先级执行。查看 agents.md 用法指南与完整示范。国内用户首推 元宝 AI、DeepSeek 的深度思考模式,不推荐豆包 AI;Cursor 等编辑器可在对话 @ 该链接,或加入 User Rules。 若 AI 无法访问外链,可 打开说明文档 复制全文粘贴。文档会随站点更新,复制内容可能过期,建议定期检查。
!https://raw.githubusercontent.com/ChangemakerStudios/Papercut/develop/graphics/PapercutLogo.png
简单的桌面邮件助手
在开发过程中从应用程序或网站发送邮件时,您可能会担心测试邮件意外发送到真实地址(如同事或客户)。虽然可以搭建测试邮件服务器,但维护繁琐且查看邮件的延迟会拖慢开发周期。
Papercut SMTP是一个二合一工具:快速邮件查看器和内置SMTP服务器(仅用于接收邮件)。它不对邮件的准备方式施加任何限制,但允许您查看完整邮件内容:正文、HTML、头信息和附件。此Docker镜像运行Papercut SMTP服务,并包含用于查看邮件的嵌入式Web UI。
bash# 拉取最新镜像 docker pull changemakerstudiosus/papercut-smtp:latest # 使用默认配置运行 docker run -d \ --name papercut \ -p 37408:8080 \ -p 2525:2525 \ changemakerstudiosus/papercut-smtp:latest
访问Web UI: http://localhost:37408
发送测试邮件到: localhost:2525
Docker镜像默认使用非特权端口,允许容器在无需root权限的情况下安全运行:
| 服务 | 容器端口 | 建议主机端口 | 传统端口 |
|---|---|---|---|
| HTTP Web UI | 8080 | 37408 | 80 |
| SMTP服务器 | 2525 | 2525 | 25 |
1024以下的端口(如25和80)在Linux中需要特殊权限。通过使用2525和8080端口,Papercut可以安全运行,无需:
--sysctl标志如果需要在主机上使用传统端口,可以进行如下映射:
bash# 映射到主机的传统端口 docker run -d \ --name papercut \ -p 80:8080 \ -p 25:2525 \ changemakerstudiosus/papercut-smtp:latest
访问: http://localhost(端口80)| SMTP: localhost:25
通过环境变量覆盖默认配置:
bashdocker run -d \ --name papercut \ -e SmtpServer__IP=0.0.0.0 \ -e SmtpServer__Port=2525 \ -e Urls=http://0.0.0.0:8080 \ -p 8080:8080 \ -p 2525:2525 \ changemakerstudiosus/papercut-smtp:latest
可用环境变量:
SmtpServer__IP - SMTP监听地址(默认:"Any" = 0.0.0.0)SmtpServer__Port - SMTP监听端口(默认:2525,使用587启用STARTTLS)SmtpServer__MessagePath - 邮件存储路径(默认:/app/Incoming)SmtpServer__LoggingPath - 日志文件路径(默认:/app/logs)Urls - HTTP服务器URLs(默认:[***]TLS/STARTTLS配置(可选):
SmtpServer__CertificateFindType - 证书搜索方法(默认:"FindBySubjectName")SmtpServer__CertificateFindValue - 证书标识符(为空则禁用TLS)SmtpServer__CertificateStoreLocation - 存储位置:"LocalMachine"或"CurrentUser"(默认:"LocalMachine")SmtpServer__CertificateStoreName - 存储名称:"My"、"Root"等(默认:"My")挂载自定义appsettings.Production.json:
bashdocker run -d \ --name papercut \ -v /path/to/your/appsettings.Production.json:/app/appsettings.Production.json:ro \ -p 8080:8080 \ -p 2525:2525 \ changemakerstudiosus/papercut-smtp:latest
示例appsettings.Production.json:
json{ "Urls": "http://0.0.0.0:8080", "SmtpServer": { "IP": "Any", "Port": 2525, "MessagePath": "/app/Incoming", "LoggingPath": "/app/logs" } }
默认情况下,邮件存储在容器内部,容器删除后会丢失。要持久化邮件,可挂载卷:
bashdocker run -d \ --name papercut \ -p 37408:8080 \ -p 2525:2525 \ -v papercut-messages:/app/Incoming \ changemakerstudiosus/papercut-smtp:latest
bashdocker run -d \ --name papercut \ -p 37408:8080 \ -p 2525:2525 \ -v /path/on/host/messages:/app/Incoming \ changemakerstudiosus/papercut-smtp:latest
创建docker-compose.yml:
yamlversion: '3.8' services: papercut: image: changemakerstudiosus/papercut-smtp:latest container_name: papercut-smtp ports: - "37408:8080" # Web UI - "2525:2525" # SMTP volumes: - papercut-messages:/app/Incoming - papercut-logs:/app/logs environment: - SmtpServer__IP=0.0.0.0 - SmtpServer__Port=2525 - Urls=http://0.0.0.0:8080 restart: unless-stopped volumes: papercut-messages: papercut-logs:
运行:
bashdocker compose up -d
Papercut SMTP支持可选的TLS/STARTTLS加密和SMTP认证,用于安全的邮件测试。
通过环境变量启用STARTTLS:
bashdocker run -d \ --name papercut-tls \ -p 8080:8080 \ -p 587:587 \ -e SmtpServer__Port=587 \ -e SmtpServer__CertificateFindType=FindBySubjectName \ -e SmtpServer__CertificateFindValue=localhost \ changemakerstudiosus/papercut-smtp:latest
TLS/STARTTLS需要X.509证书。证书必须安装在Windows证书存储中(LocalMachine或CurrentUser)。
创建测试用自签名证书(Windows主机):
powershell# 创建证书 $cert = New-SelfSignedCertificate ` -Subject "CN=localhost" ` -DnsName "localhost" ` -CertStoreLocation "cert:\LocalMachine\My" ` -NotAfter (Get-Date).AddYears(2) # 获取配置用的指纹 $cert.Thumbprint
使用指纹配置Docker:
bashdocker run -d \ --name papercut-tls \ -p 8080:8080 \ -p 587:587 \ -e SmtpServer__Port=587 \ -e SmtpServer__CertificateFindType=FindByThumbprint \ -e SmtpServer__CertificateFindValue=YOUR_THUMBPRINT_HERE \ changemakerstudiosus/papercut-smtp:latest
yamlversion: '3.8' services: papercut-tls: image: changemakerstudiosus/papercut-smtp:latest container_name: papercut-smtp-tls ports: - "8080:8080" - "587:587" # STARTTLS端口 volumes: - papercut-messages:/app/Incoming - papercut-logs:/app/logs environment: # 基本配置 - SmtpServer__IP=0.0.0.0 - SmtpServer__Port=587 - Urls=http://0.0.0.0:8080 # TLS配置 - SmtpServer__CertificateFindType=FindByThumbprint - SmtpServer__CertificateFindValue=YOUR_CERT_THUMBPRINT - SmtpServer__CertificateStoreLocation=LocalMachine - SmtpServer__CertificateStoreName=My restart: unless-stopped volumes: papercut-messages: papercut-logs:
也可在自定义appsettings.Production.json中配置TLS:
json{ "Urls": "http://0.0.0.0:8080", "SmtpServer": { "IP": "Any", "Port": 587, "MessagePath": "/app/Incoming", "LoggingPath": "/app/logs", "CertificateFindType": "FindByThumbprint", "CertificateFindValue": "YOUR_CERT_THUMBPRINT_HERE", "CertificateStoreLocation": "LocalMachine", "CertificateStoreName": "My" } }
| 端口 | 模式 | 描述 |
|---|---|---|
| 25 | 普通SMTP | 无加密(默认) |
| 587 | STARTTLS | 先普通连接,升级到TLS(推荐) |
| 465 | SMTPS | 立即TLS加密 |
| 2525 | 普通SMTP | 25端口的非特权替代 |
| 查找类型 | 示例 | 用例 | 易用性 |
|---|---|---|---|
FindBySubjectName | localhost | 按通用名称查找 | ⭐⭐⭐ 推荐 - 最简单 |
FindByThumbprint | ABC123DEF456... | 最具体 | ⭐⭐ 更安全但配置复杂 |
FindBySubjectDistinguishedName | CN=localhost, O=Company | 完整的可分辨名称 | ⭐ 最具体 |
使用TLS/STARTTLS时自动启用SMTP AUTH。默认情况下,Papercut接受所有凭据,用于开发/测试目的。
使用认证测试:
bash# 使用openssl openssl s_client -connect localhost:587 -starttls smtp # 在EHLO响应中应看到: # 250-STARTTLS # 250-AUTH PLAIN LOGIN
使用MailKit发送邮件(C#):
csharpusing var client = new SmtpClient(); client.Connect("localhost", 587, SecureSocketOptions.StartTls); client.Authenticate("anyuser", "anypass"); // 接受任何凭据 client.Send(message); client.Disconnect(true);
bash# 测试STARTTLS连接 openssl s_client -connect localhost:587 -starttls smtp # 预期输出应包含: # - EHLO响应中的STARTTLS # - 证书详情 # - "Verify return code: 0 (ok)"或自签名警告
证书未找到:
Error: No certificate found matching FindByThumbprint='...'
找到多个证书:
Error: Multiple certificates (3) found matching...
587端口连接被拒绝:
-p 587:587docker logs papercut-tls | grep TLS监听IPv6:
bashdocker run -d \ --name papercut \ -e SmtpServer__IP=::0 \ -e Urls=http://[::]:8080 \ -p 8080:8080 \ -p 2525:2525 \ changemakerstudiosus/papercut-smtp:latest
使用完全自定义的端口:
bashdocker run -d \ --name papercut \ -e SmtpServer__Port=3025 \ -e Urls=http://0.0.0.0:9080 \ -p 9080:9080 \ -p 3025:3025 \ changemakerstudiosus/papercut-smtp:latest
bashdocker run -d \ --name papercut \ -p 37408:8080 \ -p 2525:2525 \ -v papercut-messages:/app/Incoming \ -v papercut-logs:/app/logs \ -v $(pwd)/appsettings.Production.json:/app/appsettings.Production.json:ro \ changemakerstudiosus/papercut-smtp:latest
Kubernetes部署示例:
yamlapiVersion: apps/v1 kind: Deployment metadata: name: papercut-smtp labels: app: papercut-smtp spec: replicas: 1 selector: matchLabels: app: papercut-smtp template: metadata: labels: app: papercut-smtp spec: containers: - name: papercut image: changemakerstudiosus/papercut-smtp:latest ports: - containerPort: 8080 name: http protocol: TCP - containerPort: 2525 name: smtp protocol: TCP env: - name: SmtpServer__Port value: "2525" - name: Urls value: "http://0.0.0.0:8080" volumeMounts: - name: messages mountPath: /app/Incoming - name: logs mountPath: /app/logs volumes: - name: messages emptyDir: {} - name: logs emptyDir: {} --- apiVersion: v1 kind: Service metadata: name: papercut-smtp labels: app: papercut-smtp spec: type: ClusterIP selector: app: papercut-smtp ports: - name: http port: 8080 targetPort: 8080 protocol: TCP - name: smtp port: 2525 targetPort: 2525 protocol: TCP
应用:
bashkubectl apply -f papercut-deployment.yaml
测试时通过端口转发访问:
bashkubectl port-forward svc/papercut-smtp 37408:8080 2525:2525
错误: 绑定端口时Permission denied
解决方案: 使用默认非特权端口(2
您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 标签列表页面。
来自真实用户的反馈,见证轩辕镜像的优质服务