作者 root
在涉及到邮件功能测试时,由于测试环境比较杂乱,各种有效无效的邮件地址随处可见无法辨别。当我们需要测试发送邮件时,这些无效地址也会被一并放入发送列表,这会发送失败率增加,对于发送域名的信誉是有影响的,同时,如果也会导致一些邮件被错误的发送出去,甚至发送给了实际的用户。
为了方便邮件的测试,我们需要在测试环境中的收件人与生产环境的获取机制是类似的,可以通过相同的方法从数据库或者代码中获取。 在不改动现有代码以及数据库连接机制的情况下, 可以使用私有SMTP服务器往这些邮箱地址发送邮件。
我们可以在测试环境中,假设一个内部的SMTP服务器,在这个环境中存在与生产环境一样的用户邮箱地址结构,并设置登陆私有SMTP服务器的密码。这样我们就可以在私有的邮件服务器上进行各种邮件相关测试和确认,而这个测试的环境是和生产环境完全分离的。
经过一些调研,我们使用xmail来作为测试环境SMTP服务器, 为了方便使用xmail选择在docker中安装.
- 首先配置Dockerfile构建一个基础的docker镜像
FROM scratch
ADD ubuntu-bionic-core-cloudimg-amd64-root.tar.gz /
ENV TZ=Asia/Shanghai LANG=en_US.UTF-8
RUN useradd -m -s /bin/bash ubuntu && apt-get update && apt-get install -y locales g++ sudo vim make libssl-dev tzdata&&\
apt-get autoclean && apt-get clean all&& locale-gen en_US.UTF-8 &&\
usermod -aG sudo ubuntu &&\
ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
ADD sudoers /etc/
USER ubuntu
WORKDIR /home/ubuntu
- 开始下载安装包
wget http://www.xmailserver.org/xmail-1.27.tar.gz
tar zxf xmail-1.27.tar.gz
mv xmail-1.27 /var/MailRoot
- 启动docker开始安装
sudo docker run -itd --name local-smtp -v /var/MailRoot:/var/MailRoot smtpserver /bin/bash
sudo docker attach local-smtp
cd /var/MailRoot
make -f Makefile.lnx
sudo cp xmail /etc/init.d && sudo chmod +x /etc/init.d/xmail
shopt -s extglob
cp bin/!(*.o) MailRoot/bin
rm -rf !(MailRoot)
mv MailRoot/* .
rm -rf MailRoot
- 提交docker, 并使用新镜像启动docker
sudo docker commit -m='install xmail' <container-id> smtpserver
sudo docker run -itd --name local-smtp -p 110:110 -p 25:25 -v /var/MailRoot:/var/MailRoot smtpserver /bin/bash
- 进入docker 配置xmail
# xmail 配置文件中均是 <TAB> 分隔
cd /var/MailRoot
sed -i 's/xmailserver.test/example.com/g' server.tab # 域名配置
XMCrypt password # 加密 password
echo -e '"admin"\t"15041616120a1701"' > ctrlaccounts.tab # 设置管理员账号及密码, 密码是上一步的加密结果
sudo /etc/init.d/xmail start
CtrlClnt -s localhost -u admin -p password domainadd example.com # 添加域名
sudo /etc/init.d/xmail restart
CtrlClnt -s localhost -u admin -p password useradd example.com test01 test01 U # 添加 test 用户
CtrlClnt -s localhost -u admin -p password useradd example.com test02 test02 U
可以为这台机器分配一个域名,比如 smtp.example.com。然后使用python的smtplib库发送测试邮件发送,
用户可以使用outlook等邮箱客户端登陆自己的邮箱查看邮件。
一般来说,默认用户只能存储大约十几M的邮件,在xmail中可以修改用户的user.tab中 MailMBSize值该改变这值的大小。
除了xmail这个方案之外,mailslurper这个项目也是很有意思,它可以提供一个本地的SMTP服务器,所有发给这个服务器的信件不是实际发送出去而是保存在一个数据库中,mailslurper提供了一个web界面让开发人员可以检查这些邮件。不过mailslurper目前的开发状态还不是十分完备,比如存在不支持邮件服务器的认证,以及发送附件时会存在bug等等,尚不能完美模拟我们的线上发送需求。