使用Poste搭建内网邮件服务器

使用Poste搭建内网邮件服务器

Poste.io 也是一个流行的邮件服务器方案,它可以通过 Docker 容器轻松部署,非常适合搭建内部邮件服务器。

本文档将向您展示如何开始使用 Poste.io 邮件服务器。在 5 分钟内,您将拥有一个可发送和接收邮件的邮件服务器。

1. 简介

概述

Poste.io 是一个功能全面、易于安装的邮件服务器解决方案,完全容器化,可以通过 Docker 直接部署。提供SMTP + IMAP + POP3 + 防垃圾邮件 + 防病毒 + 网页管理 + 网页邮件等功能,同时集成 Let’s Encrypt,可以自动管理和更新 SSL 证书。Poste.io 提供免费版本,支持大多数功能,但如果需要企业级支持和一些高级功能,需要购买商业版本。

在下载镜像到本地后,可以实现分钟级的邮件服务器部署。

架构

poste-schema

包括如下组件:

组件目的
SQLite用户数据库,便于备份,无需运行守护进程
DovecotIMAP 和 POP3 邮件服务器
NGiNX用于管理和网页邮件的快速web服务器
Haraka现代、高性能、灵活的SMTP服务器
RSPAMD垃圾邮件检测
ClamAV杀毒引擎
Roundcube网页邮件客户端
Z-PushActive Sync 和 Push 的操作系统实现

功能特点

  • 原生实现 SPF、DKIM、DMARC、SRS,带有简单的向导
  • 杀毒引擎(ClamAV),用于检测木马、病毒、恶意软件
  • 内置垃圾邮件过滤器(RSPAMD)
  • 支持 HTTPS 的 Webmail 客户端(Roundcube)
  • 通过 Sieve 脚本进行邮件重定向、自动回复及其他过滤(由邮件拥有者管理,每个操作都可通过脚本完成)
  • 支持配额限制邮箱空间或邮件数量
  • Web 管理界面,具备系统管理员、域管理员、邮件拥有者的不同权限
  • 内置自动发现功能,支持 Microsoft 产品、Thunderbird…
  • 诊断工具,帮助正确设置域名和邮件服务器
  • SMTP - 端口 25、465(TLS)、587
  • POP3 - 端口 110、995(TLS)
  • IMAP - 端口 143、993(TLS)
  • 全程 SSL/TLS 加密!任何个人数据、邮件、登录信息都不会以未加密形式通过互联网传输。
  • 所有密码默认以加盐的 SHA512 哈希(5000 次迭代)存储,攻击者很难破解你的密码。
  • 整个邮件服务器容器通过 Docker 与其他应用程序隔离。

2. 部署要求

要搭建一个完全功能的、适用于互联网的邮件服务器,您需要准备以下几项:

  • 任何 64 位 Linux 发行版,可以运行在虚拟机或专用服务器上
  • 足够的 CPU 和内存来运行 Spamassassin 和 Clamav。其他组件对 CPU 和内存的需求较低
  • Docker 引擎已安装并运行 - 参阅如何安装 Docker 引擎
  • 公网 IP 地址(内外部署不需要)
  • 能够更改 IP 地址的反向 DNS 记录 - 如果无法自行完成,请联系您的服务提供商
  • 完全访问域名的 DNS 管理权限

3. 下载和运行 Poste.io

该产品有两个版本,PRO 版和 FREE 版。这两个镜像版本共享相同的数据目录结构,使用 PRO 版本的是需要登录到poste.io的私人 Docker 仓库。

这里使用免费的free版本。

参考命令

官方文档给出的运行参考命令:

$ docker run \
    --net=host \
    -e TZ=Europe/Prague \
    -v /your-data-dir/data:/data \
    --name "mailserver" \
    -h "mail.example.com" \
    -t analogic/poste.io

Docker 参数解释:

  • --net=host(推荐): 邮件服务器将使用主机网络堆栈(参考 Docker Host 网络模式文档
    • 在这种模式下,主机的防火墙能够正常工作
    • 连接源 IP 不会被 userland-proxy 隐藏
    • IPv6 能正常工作
    • 网络方案说明

Poste.io 会开放以下端口:

端口号用途
25SMTP - 主要用于处理来自远程邮件服务器的传入邮件
80HTTP - 用于重定向到 HTTPS(可选)及 Let’s Encrypt 服务的认证
110POP3 - 访问邮箱的标准协议,客户端认证前需要使用 STARTTLS
143IMAP - 访问邮箱的标准协议,客户端认证前需要使用 STARTTLS
443HTTPS - 访问管理界面或 Webmail 客户端
465SMTPS - 传统的 SMTPs 端口
587MSA - 主要用于邮件客户端在 STARTTLS 和认证后的 SMTP 端口
993IMAPS - 加密连接的 IMAP 替代端口
995POP3S - 加密连接的 POP3 端口
4190Sieve - 远程 Sieve 设置
  • -e TZ=Europe/Prague:设置时区,以确保日期和时间正确显示。

  • -v /your-data-dir/data:/data:将主机系统中的数据目录挂载到容器中。用户数据库、邮件、日志等数据都将存储在此目录中,方便备份。

  • --name "mailserver":为 poste.io 容器定义一个名称。

  • -h "mail.example.com":为邮件服务器设置主机名。

  • -t analogic/poste.io:镜像名称,PRO 版和 FREE 版有所不同。

可选参数:

  • -e "HTTPS=OFF":禁用所有到加密 HTTP 的重定向,适用于使用反向代理的情况(请将此参数放在镜像名称之前!)。

  • -e "HTTP_PORT=8080":自定义 HTTP 端口。请注意,如果使用 Let’s Encrypt,仍需在端口 80 上处理请求。如果使用反向代理,需将 /.well-known/ 文件夹转发到此端口。

  • -e "HTTPS_PORT=4433":自定义 HTTPS 端口。

  • -e "DISABLE_CLAMAV=TRUE":禁用 ClamAV,适用于降低内存占用的场景。

  • -e "DISABLE_RSPAMD=TRUE":禁用 Rspamd,适用于降低内存占用的场景。

  • -e "DISABLE_ROUNDCUBE=TRUE":禁用 Roundcube Webmail。

  • -e "ELASTICSEARCH=123.123.123.123:9200":启用 Elasticsearch 集成。

  • -p 4190:4190:如果想使用能够外部管理 Sieve 过滤器的客户端,还需开放端口 4190。

部署实践

这里使用docker桥接网络部署

# docker启动命令,
]# docker run -d \
    -p 80:80 -p 443:443 -p 25:25 -p 110:110 -p 143:143 -p 465:465 -p 587:587 -p 993:993 -p 995:995 -p 4190:4190 \
    -e TZ=Asia/Shanghai \
    -v /data/mail:/data \
    --privileged=true \
    --name "mailserver" \
    -h "mail.jdzx.local" \
    --restart=always \
    -t analogic/poste.io

# docker运行命令会自动创建卷目录。查看日志可以看到管理界面登录地址:
]# docker logs -f mailserver
[s6-init] making user provided files available at /var/run/s6/etc...exited 0.
[s6-init] ensuring user provided files have correct perms...exited 0.
[fix-attrs.d] applying ownership & permissions fixes...
...
Poste.io administration available at https://172.17.0.2:443 or http://172.17.0.2:80  
...

docker容器的web端口(443和80)和主机一一映射,这里通过docker主机IP即可访问管理界面:

如果是centos下部署部署,可能会遇到遇到25端口被占用,可通过netstat -apn|grep 25查看是否是postfix导致,CentOS下可卸载postfix:

yum -y remove postfix

初始化配置

容器启动后访问https://mail.domain.com,进入配置配置界面,包括hostnamae、管理员邮箱地址以及密码。

first

4. 相关解析记录设置

DNS设置

DNS服务器侧按照如下要求设置域名解析,否则邮件服务无法正常使用,其中:

  • domain.com:为你自己的域名
  • 1.2.3.4:为你的邮件服务器IP
主机名记录类型记录值
mail.domain.comA1.2.3.4
smtp.domain.comCNAMEmail.domain.com
pop.domain.comCNAMEmail.domain.com
imap.domain.comCNAMEmail.domain.com
domain.comMXmail.domain.com
domain.comtxtv=spf1 mx ~all

下面为bind dns下面的配置,供参考,我的域名为jdzx.local:

$TTL 3H
@          IN SOA @        dns.jdzx.local.  (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
@          IN       NS  dns.jdzx.local.
dns        IN       A   10.210.10.220
...
; 邮件服务器相关配置
; A 记录
mail       IN       A   10.210.10.218
; CNAME记录
stmp       IN      CNAME mail.jdzx.local.
pop        IN      CNAME mail.jdzx.local.
imap       IN      CNAME mail.jdzx.local.
; MX记录
@          IN      MX  10  mail.jdzx.local.
; SPF记录
@          IN      TXT "v=spf1 mx ~all"
; DKIM记录
; s20241024106._domainkey.jdzx.local. IN TXT "k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvZG4aTkjrDm4mezHclFKdXJ8D/AbBnoXS9K1cmrepD/ZlMonezC/WRLt+DBwlKzlui2Woq5MzknhptyHUqBpYp3jxiMPdOD77UFFEqi2oLBxGFlRZZbJf3Lyw9x3Wbe5TOinkM9CmGkfbzZWSVrUOXBGySRcFHVzRWYxHRqVhXlPJizdW4w+MVj9oDImFZBXrmiYsQI677NtVNTsTn6xn1QHC8uFH825Fo6JouLkoSxLQw4K2r6DqlWRbA5Z8iafIVn1LL0rudK9N5cDtojDWFQpKfi9jotK8CmVWULqx+UE/o0RSYjsW9wCupedKFADFVe4P5+hn6qH7fhsXi9P1wIDAQAB"
; DMARC记录
_dmarc     IN      TXT "v=DMARC1; p=none; rua=mailto:dmarc-reports@jdzx.local"

说明
DKIM记录部分的配置bind语法检查没有通过,这里暂时注释掉。

设置DKIM验证

邮件系统管理界面为:https://mail.domain.com/admin/login,在 Virtual domains - 对应域名 - DKIM key - 创建key,并按照要求设置txt记录解析。

DKIM

说明

添加SPF/DKIM/PTR解析,是为了可提高邮件可信度,从而降低邮件进入垃圾箱的几率。如果邮件服务器仅用于内外测试,可以省略上面的步骤。

5. 管理功能

用户管理

在 后台管理界面-Email accounts,管理用户账户。

SSL管理

在 后台管理界面–System settings – TLS Certificate可以配置SSL证书相关。

TLS

6. 邮件收发测试

增加用户

这里除了admin用户,增加一个user1用户进行邮件收发测试。

user

邮件web客户端

登录https://10.210.10.218/webmail/,首先使用user1登录,向admin账号发送邮件。然后使用admin登录web客户端,测试邮件发送接收成功:

test-email

客户端配置

如果使用客户端收发邮件,需要配置客户端的SMTP/IMAP/POP3服务器地址、端口、用户名、密码等信息。参考如下配置:

  1. SMTP
  • 主机:mail.example.com
  • 端口:465(需要TLS),或587(需要STARTTLS)
  • 需要身份验证
  • 用户名是完整的邮箱地址:username@example.com

建议不要使用端口25,因为它仅保留用于远程邮件服务器之间的通信。即使它可以工作,您可能会遇到不必要的连接测试和各种延迟。一些ISP(互联网服务提供商)也会阻止对端口25的外部连接以防止垃圾邮件,因此在某些位置可能无法连接到您的邮件服务器。通常对端口465/587的连接是被允许的。

默认情况下,“发件人”标头会被检查 → 发件人的邮箱地址应与用户名相同。(或者您可以在管理界面为每个账户关闭此检查)

  1. IMAP(首选)

主机:mail.example.com
端口:993
TLS
用户名是完整的邮箱地址:username@example.com

  1. 或者 POP3

主机:mail.example.com
端口:995
TLS
用户名是完整的邮箱地址:username@example.com

7. 相关资料

  1. Poste.io 官网:https://poste.io/
  2. 官方文档:https://poste.io/doc/
  3. 不同版本的功能差别:Order poste.io mailserver
  4. 在线体验站点:

https://demo.poste.io/admin/login#admin@poste.io;admin

Username: admin@poste.io
Password: admin

  1. 在线API文档

https://admin@poste.io:admin@demo.poste.io/admin/api/doc

Username: admin@poste.io
Password: admin

Sample REST API script in PHP:
https://gist.github.com/analogic/8fcdc87ce8d4d8adfed9
admin@poste.io
Password: admin

  1. 在线API文档

https://admin@poste.io:admin@demo.poste.io/admin/api/doc

Username: admin@poste.io
Password: admin

Sample REST API script in PHP:
https://gist.github.com/analogic/8fcdc87ce8d4d8adfed9

<think>好的,我现在需要帮助一个零基础的新手搭建一个IT-Helpdesk项目。用户的目标是让普通用户通过内网IP访问页面,无需登录即可提交IT需求,而IT人员则登录后查看并处理这些需求。系统需要在CentOS 7.9上使用宝塔面板,涉及前端、后端(PHP)和MySQL数据库的开发。我需要一步步梳理整个过程,确保用户能够理解并跟随操作。 首先,用户已经安装了CentOS 7.9和宝塔面板,这为后续的环境搭建提供了基础。接下来需要确认宝塔面板是否已经安装了必要的运行环境,比如Web服务器(Nginx或Apache)、PHP和MySQL。如果还没有安装,用户需要先通过宝塔面板安装这些服务。 然后,项目分为前端页面、后端处理和数据存储三个部分。前端需要设计一个表单页面,让用户填写需求,这里需要考虑表单的字段,比如姓名、部门、问题描述等。用户提到普通用户无需登录,所以前端页面应该简单直接,避免复杂的交互。 后端部分,用户需要使用PHP处理表单提交的数据。需要创建一个submit.php文件来接收前端发送的POST请求,验证数据有效性,比如检查必填字段是否为空,防止SQL注入等安全漏洞。验证通过后,将数据存储到MySQL数据库中,并返回成功提示。 数据库设计方面,需要创建一个表来存储用户提交的需求,至少包括ID、姓名、部门、问题描述、提交时间等字段。可能需要考虑状态字段,以便IT人员处理时更新状态,比如“待处理”、“处理中”、“已解决”等。 接下来是IT人员的界面,他们需要登录后才能查看和处理需求。这里需要设计一个登录页面,验证IT人员的账号密码,然后展示需求列表。这部分可能需要用户管理表,存储IT人员的用户名和密码(需加密存储)。 在宝塔面板中,用户需要创建网站,配置域名或内网IP,设置网站根目录,确保PHP版本兼容,并创建MySQL数据库和用户。还需要在PHP代码中连接数据库,执行SQL语句插入数据,并处理可能的错误。 安全方面,需要注意防止XSS攻击和SQL注入,对用户输入进行过滤和转义,使用预处理语句操作数据库。此外,IT人员的登录功能需要会话管理,使用PHP的session机制来维持登录状态。 最后,测试整个流程,确保普通用户能提交需求,IT人员能登录查看并处理。可能需要在内网其他设备上访问测试,确认页面和功能正常。 用户作为新手,可能需要详细的步骤说明,包括宝塔面板的具体操作,如何创建网站、数据库,如何编写HTML和PHP代码,以及如何配置表单的提交地址。需要提醒用户注意文件权限问题,确保Web服务器有权限读写相关目录和数据库。 可能遇到的常见问题包括:表单提交后页面无法访问,PHP代码错误导致数据无法存储,数据库连接失败等。需要指导用户查看错误日志,逐步排查问题,比如检查数据库连接参数是否正确,PHP错误提示是否开启等。 总结来说,步骤大致分为环境准备、前端开发、后端开发、数据库设计、登录功能实现、安全加固和测试调试。每个步骤都需要详细说明,确保用户能够逐步完成,并在过程中学习相关知识。</think>以下是详细搭建步骤,按照顺序操作即可实现需求: 一、环境准备(宝塔面板操作) 1. 登录宝塔面板 → 软件商店 → 安装以下服务: - Web服务器:Nginx 1.20+ 或 Apache 2.4+ - PHP 7.4+(需安装pdo_mysql扩展) - MySQL 5.7+ 2. 创建网站: - 网站 → 添加站点 → 域名填写内网IP(如192.168.1.100) - PHP版本选择刚安装的版本 - 创建数据库(记录数据库名、用户名、密码) 二、数据库设计 1. 通过宝塔的phpMyAdmin登录数据库 2. 执行SQL创建需求表: ```sql CREATE TABLE `it_requests` ( `id` INT AUTO_INCREMENT PRIMARY KEY, `name` VARCHAR(50) NOT NULL, `department` VARCHAR(50) NOT NULL, `problem` TEXT NOT NULL, `status` ENUM('pending','processing','resolved') DEFAULT 'pending', `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); ``` 三、前端开发(用户提交页面) 1. 在网站根目录(如/www/wwwroot/192.168.1.100)新建`index.html`: ```html <!DOCTYPE html> <html> <head> <title>IT帮助台</title> <style> body { max-width: 600px; margin: 20px auto; padding: 20px; } .form-group { margin-bottom: 15px; } label { display: block; margin-bottom: 5px; } input, textarea { width: 100%; padding: 8px; } </style> </head> <body> <h2>IT服务请求</h2> <form action="/submit.php" method="post"> <div class="form-group"> <label>姓名:</label> <input type="text" name="name" required> </div> <div class="form-group"> <label>部门:</label> <input type="text" name="department" required> </div> <div class="form-group"> <label>问题描述:</label> <textarea name="problem" rows="5" required></textarea> </div> <button type="submit">提交请求</button> </form> </body> </html> ``` 四、后端开发(submit.php) ```php <?php // 数据库配置(替换为你的实际信息) define('DB_HOST', 'localhost'); define('DB_NAME', 'your_dbname'); define('DB_USER', 'your_dbuser'); define('DB_PASS', 'your_password'); // 连接数据库 try { $pdo = new PDO( "mysql:host=".DB_HOST.";dbname=".DB_NAME.";charset=utf8", DB_USER, DB_PASS, [PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION] ); } catch(PDOException $e) { die("数据库连接失败: " . $e->getMessage()); } // 处理表单提交 if ($_SERVER['REQUEST_METHOD'] === 'POST') { // 过滤输入 $name = htmlspecialchars($_POST['name'] ?? ''); $department = htmlspecialchars($_POST['department'] ?? ''); $problem = htmlspecialchars($_POST['problem'] ?? ''); // 验证必填字段 if (empty($name) || empty($department) || empty($problem)) { die("所有字段必须填写"); } // 插入数据库 try { $stmt = $pdo->prepare("INSERT INTO it_requests (name, department, problem) VALUES (?, ?, ?)"); $stmt->execute([$name, $department, $problem]); echo "<h3>提交成功!您的请求编号:".$pdo->lastInsertId()."</h3>"; } catch(PDOException $e) { die("提交失败: " . $e->getMessage()); } } ?> ``` 五、IT人员后台(需新增文件login.php和admin.php) 1. 创建用户表(在phpMyAdmin执行): ```sql CREATE TABLE `it_users` ( `id` INT AUTO_INCREMENT PRIMARY KEY, `username` VARCHAR(50) UNIQUE NOT NULL, `password` VARCHAR(255) NOT NULL ); ``` 2. login.php(登录页面): ```php <?php session_start(); if ($_SERVER['REQUEST_METHOD'] === 'POST') { // 验证逻辑(需补充数据库连接代码) $username = $_POST['username'] ?? ''; $password = $_POST['password'] ?? ''; // 这里需要添加数据库验证逻辑 // 示例硬编码用户 admin/123456 if ($username === 'admin' && password_verify('123456', '$2y$10$S8z8fZ...')) { $_SESSION['logged_in'] = true; header('Location: admin.php'); exit; } else { $error = "用户名或密码错误"; } } ?> <!-- 登录表单HTML(类似用户表单) --> ``` 3. admin.php(后台管理): ```php <?php session_start(); if (!isset($_SESSION['logged_in'])) { header('Location: login.php'); exit; } // 显示所有请求 // 添加数据库查询代码显示it_requests表数据 // 可添加状态更新功能 ?> <!-- 显示数据表格的HTML --> ``` 六、安全配置 1. 宝塔面板 → 网站设置: - 开启防跨站攻击 - 关闭目录列表 2. PHP配置: - 关闭危险函数(system, exec等) - 设置upload_max_filesize = 2M 3. MySQL配置: - 删除默认空用户 - 限制数据库用户权限 七、测试流程 1. 访问 http://内网IP 填写表单提交 2. 检查数据库是否生成记录 3. 访问 http://内网IP/login.php 用管理员账号登录 4. 在admin.php确认能看到提交的请求 进阶优化建议: 1. 添加邮件通知功能 2. 实现请求状态更新功能 3. 添加分页和搜索功能 4. 使用CSS框架美化界面(如Bootstrap) 5. 添加验证码防止垃圾提交 遇到具体问题时,可检查: 1. 宝塔防火墙是否开放80端口 2. PHP错误日志(宝塔面板可查看) 3. 数据库连接信息是否正确 4. 文件权限是否设置正确(建议目录755,文件644)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lldhsds

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值