golang现代化全功能安全邮件服务器插件mox的使用
Golang现代化全功能安全邮件服务器插件mox的使用
概述
Mox是一个现代化的、功能齐全的开源安全邮件服务器,适用于低维护的自托管电子邮件服务。
主要特性
- 快速轻松地启动/维护邮件服务器,适用于您自己的域名
- 支持SMTP(含扩展)用于接收、提交和投递邮件
- 支持IMAP4(含扩展)为邮件客户端提供邮件访问
- 提供网页邮件界面,可通过浏览器阅读/发送邮件
- 支持SPF/DKIM/DMARC用于消息/投递认证
- 基于贝叶斯的垃圾邮件过滤,可针对每个用户学习垃圾/非垃圾邮件
- 国际化邮件支持(EIA),支持Unicode用户名和IDNA域名
- 自动TLS与ACME(支持Let’s Encrypt等CA)
- 提供Web管理界面帮助设置域名、账户和别名列表
- 支持账户自动发现(通过SRV记录)
- 内置Web服务器,可同时用于网站服务
- 提供简单的HTTP/JSON API用于发送事务邮件和接收投递事件
- 提供Prometheus指标和结构化日志
快速开始
要为您的域名设置邮件服务,最简单的方法是获取一个专门用于邮件服务的(虚拟)机器,命名为[host].[domain]
(例如mail.example.com)。建议安装支持DNSSEC验证的解析器,如unbound。
以root用户运行以下命令:
# 创建mox用户和主目录(或选择其他名称/目录):
useradd -m -d /home/mox mox
cd /home/mox
# ...在此目录编译或下载mox...
# 为您的地址/域名生成配置文件:
./mox quickstart you@example.com
quickstart命令会:
- 创建配置文件mox.conf和domains.conf
- 将域名和账户添加到domains.conf
- 生成管理员和账户密码
- 打印需要添加的DNS记录
- 打印启动mox的命令,以及可选的服务安装命令
示例代码
以下是一个简单的Golang程序示例,展示如何使用mox的API发送邮件:
package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
)
func main() {
// 配置mox API端点和管理员凭据
apiURL := "http://localhost:80/api/send"
adminUser := "admin"
adminPass := "your-admin-password"
// 准备邮件数据
mailData := map[string]interface{}{
"From": "you@example.com",
"To": []string{"recipient@example.com"},
"Subject": "Test from mox API",
"Text": "This is a test email sent via mox API",
"RequireTLS": true,
"FutureRelease": nil,
}
// 将数据编码为JSON
jsonData, err := json.Marshal(mailData)
if err != nil {
fmt.Println("Error encoding JSON:", err)
return
}
// 创建HTTP请求
req, err := http.NewRequest("POST", apiURL, bytes.NewBuffer(jsonData))
if err != nil {
fmt.Println("Error creating request:", err)
return
}
// 设置基本认证头
req.SetBasicAuth(adminUser, adminPass)
req.Header.Set("Content-Type", "application/json")
// 发送请求
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
fmt.Println("Error sending request:", err)
return
}
defer resp.Body.Close()
// 处理响应
if resp.StatusCode != http.StatusOK {
fmt.Println("API returned error:", resp.Status)
return
}
fmt.Println("Email sent successfully!")
}
编译安装
您可以使用以下命令下载最新版本的源代码并编译为"mox"二进制文件:
GOBIN=$PWD CGO_ENABLED=0 go install github.com/mjl-/mox@latest
Docker支持
虽然不推荐,但您也可以使用docker镜像r.xmox.nl/mox
运行mox。重要的是要使用docker主机网络,这样mox才能使用公共IP并获得正确的远程IP信息。
常见问题
如何更改密码?
普通用户(通过IMAP/SMTP认证)可以在账户页面更改密码,例如http://localhost/
。或者您可以使用"mox setaccountpassword"设置密码。
管理员可以通过管理页面更改任何账户的密码,默认在http://localhost/admin/
(登录时留空用户名)。
如何保持更新?
请在mox.conf中设置"CheckUpdates: true"。Mox将每24小时通过DNS TXT请求检查_updates.xmox.nl
是否有新版本。
如何升级mox安装?
通常只需替换新二进制文件并重启即可。如果需要手动操作,发行说明会提及。升级前,请使用mox backup <destdir>
备份配置和数据目录。
最低运行要求是什么?
Mox不需要太多资源。您可以从小型机器开始,如512MB RAM的机器。存储空间应考虑邮件消息的大小(目前不压缩),加上15%的元数据开销,并留出一些余量。
更多关于golang现代化全功能安全邮件服务器插件mox的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang现代化全功能安全邮件服务器插件mox的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
使用Go语言现代化邮件服务器mox
mox是一个用Go语言编写的现代化全功能安全邮件服务器,它实现了SMTP、IMAP、HTTP (用于管理)等协议,支持TLS、SPF、DKIM、DMARC等安全标准,是一个轻量级但功能完备的邮件服务器解决方案。
mox主要特性
- 完全用Go编写,单二进制部署
- 支持SMTP (邮件发送)、IMAP (邮件访问)
- 内置账户管理和管理界面
- 自动配置TLS (Let’s Encrypt集成)
- 支持SPF、DKIM、DMARC等安全协议
- 支持国际域名(UTF8)和国际化邮件
- 内存安全设计,避免常见安全问题
安装mox
# 从源码安装
go install github.com/mjl-/mox@latest
# 或者下载预编译二进制
# 从 https://github.com/mjl-/mox/releases 下载对应平台的二进制
快速启动示例
以下是一个简单的mox配置和使用示例:
package main
import (
"context"
"fmt"
"log"
"os"
"path/filepath"
"github.com/mjl-/mox/config"
"github.com/mjl-/mox/mox-"
)
func main() {
// 设置工作目录
workDir := filepath.Join(os.TempDir(), "mox-example")
os.MkdirAll(workDir, 0770)
// 初始化配置
conf := config.Config{
DataDir: workDir,
Listeners: map[string]config.Listener{
"public": {
IPs: []string{"0.0.0.0"},
SMTP: config.SMTP{Enabled: true, Port: 25},
Submission: config.Submission{Enabled: true, Port: 587},
IMAP: config.IMAP{Enabled: true, Port: 143},
},
},
Domains: map[string]config.Domain{
"example.com": {
LocalpartCaseSensitive: false,
DKIM: config.DKIM{
Selectors: map[string]config.Selector{
"default": {
Enabled: true,
PrivateKeyFile: "dkim-privatekey.pem",
},
},
},
},
},
Accounts: map[string]config.Account{
"user@example.com": {
Enabled: true,
},
},
}
// 写入配置文件
configPath := filepath.Join(workDir, "mox.conf")
if err := config.WriteConfigFile(configPath, &conf); err != nil {
log.Fatalf("writing config: %v", err)
}
// 初始化mox
if err := mox.LoadConfig(context.Background(), configPath, false); err != nil {
log.Fatalf("loading config: %v", err)
}
// 启动服务器
fmt.Println("Starting mox mail server...")
mox.Start(context.Background())
// 等待中断信号
mox.ShutdownWait()
}
常用操作示例
1. 添加新用户
func addUser(email, password string) error {
acc, err := mox.OpenAccount(email)
if err != nil {
return fmt.Errorf("open account: %v", err)
}
if err := acc.SetPassword(password); err != nil {
return fmt.Errorf("set password: %v", err)
}
return nil
}
2. 发送测试邮件
func sendTestMail(from, to, subject, body string) error {
msg := &message.Message{
Header: message.Header{
From: []message.Address{{Address: from}},
To: []message.Address{{Address: to}},
Subject: subject,
},
Body: body,
}
// 使用SMTP客户端发送
client, err := smtpclient.New("localhost:587", smtpclient.Options{})
if err != nil {
return fmt.Errorf("smtp client: %v", err)
}
defer client.Close()
if err := client.Deliver(from, to, msg); err != nil {
return fmt.Errorf("deliver: %v", err)
}
return nil
}
3. 配置TLS证书
func configureTLS(domain string) error {
// 自动从Let's Encrypt获取证书
mox.Conf.Static.TLS.ACME = map[string]config.ACME{
"letsencrypt": {
DirectoryURL: "https://acme-v02.api.letsencrypt.org/directory",
Contact: []string{"mailto:admin@" + domain},
},
}
// 重新加载配置
if err := mox.LoadConfig(context.Background(), mox.ConfigFilepath, true); err != nil {
return fmt.Errorf("reload config: %v", err)
}
return nil
}
生产环境建议
- 数据目录:不要使用临时目录,指定一个持久化存储位置
- 备份:定期备份
DataDir
目录 - 防火墙:只开放必要的端口(25, 587, 143, 993等)
- 监控:设置日志监控和性能监控
- DNS配置:正确配置MX、SPF、DKIM和DMARC记录
管理界面
mox内置了管理界面,默认在http://localhost:80
或https://localhost:443
可用。你可以通过管理界面:
- 查看服务器状态
- 管理账户和域名
- 查看队列中的邮件
- 配置安全策略
总结
mox是一个功能强大且安全的现代邮件服务器解决方案,特别适合需要自建邮件服务的Go开发者。它的Go语言实现保证了跨平台兼容性和内存安全性,内置的安全功能符合现代邮件标准。通过简单的配置和API,可以快速搭建起一个生产可用的邮件服务器。
更多详细配置和高级用法可以参考mox的官方文档:https://github.com/mjl-/mox