官网: https://stalw.art/docs/install/platform/docker/
优秀文章请 参考 ; https://blog.csdn.net/weixin_50841758/article/details/150879147
1 安装Stalwart
Stalwart 是一款开源、高性能的现代邮件服务器,由 Rust 语言开发,集成 MTA、IMAP、POP3、JMAP 和 Web 管理界面。它支持 TLS 加密、反垃圾邮件与过滤规则,配置直观且安全性高,适合个人、团队或中小企业自建邮箱系统。
Stalwart支持多种部署方式,本文采用容器化部署,更多部署方式可查看这里,参考如下docker-compose文件创建并启动容器:
services: stalwart: image: 'stalwartlabs/stalwart:latest' container_name: stalwart restart: always ports: - '25:25' # SMTP (MTA) - '465:465' # SMTPS (隐式 TLS) - '587:587' # Submission (客户端发信) - '110:110' # POP3 - '995:995' # POP3S - '143:143' # IMAP - '993:993' # IMAPS - '4190:4190' # ManageSieve (过滤脚本) - '443:443' # Web 管理界面 (HTTPS) - '8080:8080' # Web 管理界面 (HTTP,可跳转到 443) volumes: - './data:/opt/stalwart'
or 直接
sudo docker run -dti --net host -p 8443:443 -p 8080:8080 \ -p 25:25 -p 587:587 -p 465:465 \ -p 143:143 -p 993:993 -p 4190:4190 \ -p 110:110 -p 995:995 \ --name stalwart stalwartlabs/stalwart:latest
登录用户名为admin,密码为容器启动时产生的随机密码,使用如下命令查看:
docker logs --tail 1 stalwart
dev@devstar:~$ sudo docker logs c3d0a44b0735b
✅ Configuration file written to /opt/stalwart/etc/config.toml
Your administrator account is 'admin' with password 'PVnhmnjKrn'
2 添加域名及账号
- 添加域名
- 添加账号
-
4 测试账号连通性
- 测试收件连通性,这里以993端口为例:
# 其中:a1 为命令标识符,可任意指定,XXX为邮箱密码,需要替换 printf "a1 LOGIN sea@sea.com XXX\r\n" | openssl s_client -crlf -quiet -connect sea.com:993 2>/dev/null | grep "Authentication successful"
- 测试发件连通性,这里以465端口为例:
# 其中:XXX为邮箱密码,需要替换 printf "EHLO localhost\r\nAUTH LOGIN\r\n$(echo -n sea@sea.com | base64)\r\n$(echo -n XXX | base64)\r\n" | openssl s_client -crlf -quiet -connect sea.com:465 2>/dev/null | grep "235 "
python 测试发送邮件
#!/usr/bin/env python3 # -*- coding: utf-8 -*- # @mail : lshan523@163.com # @Time : 2025/10/10 11:13 # @Author : Sea # @File : MailUtil.py# @Purpose : # @history : # **************************** #encoding=utf-8 ''' Created on 2019年10月11日 @author: sea ''' import smtplib import traceback from email.mime.text import MIMEText from email.header import Header def sendMsg(To, Subject, Content, From='sea@sea.com', Host='192.168.18.126'): message = MIMEText(Content, 'plain/html', 'utf-8') # 修正 MIME 类型 message['Subject'] = Header(Subject, 'utf-8') message['From'] = From message['To'] = ', '.join(To) # 正确设置接收者 try: # 使用 标准 SMTP SSL 端口 连接 smtpObj = smtplib.SMTP_SSL(Host, 465) # 或者使用 STARTTLS # smtpObj = smtplib.SMTP(Host, 587) # smtpObj.starttls() # 应当将登录凭据作为参数传入而非硬编码 smtpObj.login("sea@sea.com", "123456") smtpObj.sendmail(From, To, message.as_string()) print("邮件发送成功") except smtplib.SMTPException as e: traceback.print_exc() print("Error: 无法发送邮件") # printf "a1 LOGIN sea@sea.com 123456\r\n" | openssl s_client -crlf -quiet -connect sea.com:993 2>/dev/null | grep "Authentication successful" # printf "a1 LOGIN sea@sea.com 123456\r\n" | openssl s_client -crlf -quiet -connect sea.com:993 2>/dev/null | grep "Authentication successful" if __name__ == '__main__': To = ["lshan@sea.com","lshan523@163.com"] # 接收邮件,可设置 QQ邮箱 或者163邮箱,企业邮箱无法接收 由于并没有实际 购买域名和证书 Subject = '会议12.6 纪要' Content="'你好, 会议12.6 纪要已发送,请查收。'" sendMsg(To, Subject, Content)